ghuls 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e229b2ce91656c21cd090555604a68391eaabdb
4
- data.tar.gz: 11959e17c68899568dc01103ca2e7c3705a5eb22
3
+ metadata.gz: 57fd274e8ef0970e5b162dd964a03e0d300d6776
4
+ data.tar.gz: 67102aa993294944e1a5a1c29438f4d2f0d0d7a8
5
5
  SHA512:
6
- metadata.gz: 78c393320cab0baac3dee0571e36d5fa7eeff623303815314784aa4ecaf62be1027884f6c271040f6f999f249ffd23a6f03af984d92973d7fa30bf9509eb785e
7
- data.tar.gz: 22f0bb003f9c279a28a99fa6324225a5c69bae90fbb76a260ba0adc688f51b8f56bdcc65fe26d9a22690d411e908ff2bb7c61589044801fc4edfa11d0e2e057c
6
+ metadata.gz: e29f031fcbaf92e49ce774f96a8e3c3443c138bcf00c27a11602cdfdfe246f7ced2f79e38af11f9d244718e81dace07e6a520028ee7598ed527e2177a814aa8d
7
+ data.tar.gz: e889f014e5b211e7d7faf488ba9fba4b791b7d17ec600d8e4ddccb006f41577b551ee3b8496562cabb5c6a90616905c1c4243ee325c30ce1c8e55f4ced6c6a33
data/cli/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
  ## Version 1
3
+ ### Version 1.1.0
4
+ * Organizations that the -g user contributed to are now supported.
5
+ * Better error-type-thing reporting.
6
+ * Catches Octokit::Unauthorized errors and returns false when initializing the client.
7
+ * Fix user_exists? error catching minor syntax bug.
8
+
9
+
3
10
  ### Version 1.0.2
4
11
  * Actually fix load path stuff again.
5
12
 
data/cli/lib/ghuls/cli.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'octokit'
2
2
  require 'base64'
3
3
  require 'rainbow'
4
- require 'string-utility'
5
4
  require_relative "#{Dir.pwd}/utils/utilities"
6
5
 
7
6
  module GHULS
@@ -56,24 +55,43 @@ module GHULS
56
55
  true if @opts[:token].nil? && @opts[:pass].nil?
57
56
  end
58
57
 
58
+ def output(percents)
59
+ percents.each do |l, p|
60
+ color = Utilities.get_color_for_language(l.to_s, @colors)
61
+ puts Rainbow("#{l}: #{p}%").color(color)
62
+ end
63
+ end
64
+
65
+ def fail_after_analyze
66
+ puts 'Sorry, something went wrong.'
67
+ puts "We either could not find anyone under the name #{@opts[:get]}, " \
68
+ 'or we could not find any data for them.'
69
+ puts 'Please try again with a different user. If you believe this is ' \
70
+ 'an error, please report it to the developer.'
71
+ exit
72
+ end
73
+
59
74
  # Simply runs the program.
60
75
  def run
61
76
  puts @usage if failed?
62
77
  puts @help if @opts[:help]
63
78
  exit if failed?
64
79
  puts "Getting language data for #{@opts[:get]}..."
65
- percents = Utilities.analyze(@opts[:get], @gh)
66
- if percents
67
- percents.each do |l, p|
68
- color = Utilities.get_color_for_language(l.to_s, @colors)
69
- color = StringUtility.random_color_six if color.nil?
70
- puts Rainbow("#{l}: #{p}%").color(color)
80
+ user_percents = Utilities.analyze_user(@opts[:get], @gh)
81
+ org_percents = Utilities.analyze_orgs(@opts[:get], @gh)
82
+
83
+ if user_percents != false
84
+ output(user_percents)
85
+ if org_percents != false
86
+ puts 'Getting language data for their organizations...'
87
+ output(org_percents)
88
+ else
89
+ exit
71
90
  end
72
91
  else
73
- puts "Sorry, we could not find anyone under the name #{@opts[:get]}. " \
74
- 'Please try again with a user that exists.'
75
- exit
92
+ fail_after_analyze
76
93
  end
94
+ exit
77
95
  end
78
96
  end
79
97
  end
data/utils/utilities.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'octokit'
2
+ require 'string-utility'
2
3
 
3
4
  module Utilities
4
5
  # Gets the Octokit and colors for the program.
@@ -12,8 +13,12 @@ module Utilities
12
13
  user = opts[:user]
13
14
  gh = Octokit::Client.new(login: user, password: pass) if token.nil?
14
15
  gh = Octokit::Client.new(access_token: token) unless token.nil?
15
- encoded = gh.contents('ozh/github-colors', path: 'colors.json')[:content]
16
- colors = JSON.parse(Base64.decode64(encoded))
16
+ begin
17
+ encoded = gh.contents('ozh/github-colors', path: 'colors.json')[:content]
18
+ colors = JSON.parse(Base64.decode64(encoded))
19
+ rescue Octokit::Unauthorized
20
+ return false
21
+ end
17
22
  { git: gh, colors: colors }
18
23
  end
19
24
 
@@ -25,21 +30,54 @@ module Utilities
25
30
  full.at(full.index(single) + 1)
26
31
  end
27
32
 
33
+ # Gets whether or not the user exists.
34
+ # @param username [String] The user to check
35
+ # @param github [Octokit::Client] The instance of Octokit to use.
36
+ # @return [Boolean] True if it does, false if it doesn't.
28
37
  def self.user_exists?(username, github)
29
38
  begin
30
- github.user(username).is_a?(Octokit::NotFound)
39
+ github.user(username)
31
40
  rescue Octokit::NotFound
32
41
  return false
33
42
  end
34
43
  true
35
44
  end
36
45
 
46
+ # Returns the repos in the user's organizations that they have actually
47
+ # contributed to.
48
+ # @param username [String] See #user_exists?
49
+ # @param github [Octokit::Client] See #user_exists?
50
+ # @return [Array] All the repository full names that the user has contributed
51
+ # to.
52
+ def self.get_org_repos(username, github)
53
+ orgs = github.organizations(username)
54
+ repos = []
55
+ orgs.each do |o|
56
+ repos += github.repositories(o[:login])
57
+ end
58
+ true_repos = []
59
+ repos.each do |r|
60
+ begin
61
+ is_collaborator = github.collaborator?(r[:full_name], username)
62
+ rescue Octokit::Forbidden
63
+ next
64
+ end
65
+ if is_collaborator
66
+ next if r[:fork]
67
+ true_repos.push(r[:full_name])
68
+ else
69
+ next
70
+ end
71
+ end
72
+ true_repos
73
+ end
74
+
37
75
  # Gets the langauges and their bytes for the :user.
38
76
  # @param username [String] The username to get info for.
39
77
  # @param github [OctoKit::Client] The instance of Octokit::Client.
40
78
  # @return [Hash] The languages and their bytes, as formatted as
41
79
  # { :Ruby => 129890, :CoffeeScript => 5970 }
42
- def self.get_langs(username, github)
80
+ def self.get_user_langs(username, github)
43
81
  repos = github.repositories(username)
44
82
  langs = {}
45
83
  repos.each do |r|
@@ -57,6 +95,23 @@ module Utilities
57
95
  langs
58
96
  end
59
97
 
98
+ def self.get_org_langs(username, github)
99
+ org_repos = get_org_repos(username, github)
100
+ langs = {}
101
+ org_repos.each do |r|
102
+ repo_langs = github.languages(r)
103
+ repo_langs.each do |l, b|
104
+ if langs[l].nil?
105
+ langs[l] = b
106
+ else
107
+ existing = langs[l]
108
+ langs[l] = existing + b
109
+ end
110
+ end
111
+ end
112
+ langs
113
+ end
114
+
60
115
  # Gets the percentage for the given numbers.
61
116
  # @param part [Fixnum] The partial value.
62
117
  # @param whole [Fixnum] The whole value.
@@ -71,20 +126,39 @@ module Utilities
71
126
  # @return [String] The 6 digit hexidecimal color.
72
127
  # @return [Nil] If there is no defined color for the language.
73
128
  def self.get_color_for_language(lang, colors)
74
- return colors[lang]['color'] unless colors[lang]['color'].nil?
129
+ if colors[lang]['color'].nil?
130
+ return StringUtility.random_color_six
131
+ else
132
+ return colors[lang]['color']
133
+ end
75
134
  end
76
135
 
77
- def self.analyze(username, github)
136
+ def self.get_language_percentages(langs)
137
+ total = 0
138
+ langs.each { |_, b| total += b }
139
+ lang_percents = {}
140
+ langs.each do |l, b|
141
+ percent = Utilities.calculate_percent(b, total.to_f)
142
+ lang_percents[l] = percent.round(2)
143
+ end
144
+ lang_percents
145
+ end
146
+
147
+ def self.analyze_orgs(username, github)
78
148
  if user_exists?(username, github)
79
- languages = get_langs(username, github)
80
- total = 0
81
- languages.each { |_, b| total += b }
82
- language_percentages = {}
83
- languages.each do |l, b|
84
- percent = Utilities.calculate_percent(b, total.to_f)
85
- language_percentages[l] = percent.round(2)
86
- end
87
- language_percentages
149
+ langs = get_org_langs(username, github)
150
+ return false if langs.empty?
151
+ get_language_percentages(langs)
152
+ else
153
+ false
154
+ end
155
+ end
156
+
157
+ def self.analyze_user(username, github)
158
+ if user_exists?(username, github)
159
+ langs = get_user_langs(username, github)
160
+ return false if langs.empty?
161
+ get_language_percentages(langs)
88
162
  else
89
163
  false
90
164
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghuls
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eli Foster