|
1 | 1 | namespace :github do
|
2 |
| - desc "Fetch github data and store it locally" |
3 |
| - task :fetch, [:github_access_token] => :environment do |task, args| |
4 |
| - github_access_token = args[:github_access_token] || ENV["GITHUB_ACCESS_TOKEN"] |
| 2 | + desc "Fetch github data from current user and store it locally" |
| 3 | + task :fetch_me => :environment do |task, args| |
| 4 | + github_access_token ENV["GITHUB_ACCESS_TOKEN"] |
| 5 | + |
5 | 6 | validate_arguments(github_access_token)
|
6 |
| - |
7 |
| - client = Octokit::Client.new(:access_token => github_access_token) |
8 | 7 |
|
9 |
| - User.first_or_create(client.user.to_hash) |
10 |
| - client.repositories.each {|r| Repository.first_or_create(r.to_hash) } |
| 8 | + connect! github_access_token |
| 9 | + |
| 10 | + fetch_user(@client.user) |
| 11 | + |
| 12 | + fetch_repos(@client.user) |
| 13 | + |
| 14 | + Rails.logger.info("Success fetch github data!") |
| 15 | + rescue Octokit::Unauthorized |
| 16 | + Rails.logger.error("Unable to fetch github data, ensure github_access_token is valid.") |
| 17 | + end |
| 18 | + |
| 19 | + desc "Fetch github data from a list of users and store it locally (`github:fetch[felipetio,fabiofleitas]`)" |
| 20 | + task :fetch => :environment do |task, args| |
| 21 | + connect! ENV["GITHUB_ACCESS_TOKEN"] |
| 22 | + |
| 23 | + if logins = args.extras and logins.empty? |
| 24 | + raise ArgumentError, "At least one user login must be passed via argumments" |
| 25 | + end |
| 26 | + |
| 27 | + logins.each do |login| |
| 28 | + user = fetch_user(login) |
| 29 | + fetch_repos(user) |
| 30 | + end |
11 | 31 |
|
12 | 32 | Rails.logger.info("Success fetch github data!")
|
13 | 33 | rescue Octokit::Unauthorized
|
14 | 34 | Rails.logger.error("Unable to fetch github data, ensure github_access_token is valid.")
|
15 | 35 | end
|
16 | 36 |
|
17 | 37 | private
|
18 |
| - def validate_arguments(github_access_token) |
19 |
| - if not github_access_token.is_a?(String) or github_access_token.empty? |
20 |
| - raise ArgumentError, "A valid github_access_token must be passed via argumment or ENV" |
| 38 | + |
| 39 | + def connect!(github_access_token) |
| 40 | + if not github_access_token.present? |
| 41 | + raise ArgumentError, "A valid github_access_token must be passed via ENV[GITHUB_ACCESS_TOKEN]" |
| 42 | + end |
| 43 | + |
| 44 | + @client = Octokit::Client.new( |
| 45 | + access_token: github_access_token, |
| 46 | + auto_paginate: true |
| 47 | + ) |
| 48 | + end |
| 49 | + |
| 50 | + def fetch_user(user) |
| 51 | + user = user.is_a?(String) ? @client.user(user) : user |
| 52 | + Rails.logger.info("Fetching user #{user.login}") |
| 53 | + User.where(id: user.id).first_or_create(user.to_hash) |
| 54 | + |
| 55 | + user |
| 56 | + end |
| 57 | + |
| 58 | + def fetch_repos(user) |
| 59 | + last_response = user.rels[:repos].get |
| 60 | + |
| 61 | + while true do |
| 62 | + last_response.data.each do |repo| |
| 63 | + Rails.logger.info("Fetching repo #{repo.name}") |
| 64 | + Repository.where(id: repo.id).first_or_create(repo.to_hash) |
| 65 | + end |
| 66 | + |
| 67 | + break unless last_response.rels[:next] |
| 68 | + last_response = last_response.rels[:next].get |
21 | 69 | end
|
22 | 70 | end
|
23 | 71 | end
|
0 commit comments