ghuls 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5794b74db3ca3e7321804ed2dfffbfab6255513d
4
+ data.tar.gz: 7411ab229a1404c195d4383ba95d5c6d563c6ba2
5
+ SHA512:
6
+ metadata.gz: c0ba1988d217fc7bd2b064336c50c54b60e35a2f9ba1f821190c670bf3bbf8e12d9e73da88913105ebd44cf09763c5683eb59069b3cd1865f4c8a1c0ddc6090c
7
+ data.tar.gz: ed658c22b769fcc212631e7c8c9cccf5fcadca2653c4874398a79b8ecd4633a65bbb06c137ecd0c256580b1ae702ab27632b1c1b6e0cbe9286e840c576ecba3d
data/bin/ghuls ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ $LOAD_PATH.unshift(File.dirname(File.realpath(__FILE__)) + '/../lib')
5
+
6
+ require_relative '../lib/ghuls'
7
+ require 'benchmark'
8
+
9
+ cli = GHULS::CLI.new
10
+ cli.run
@@ -0,0 +1,79 @@
1
+ require 'octokit'
2
+ require 'base64'
3
+ require 'rainbow'
4
+ require 'string-utility'
5
+ require_relative "#{Dir.pwd}/utils/utilities"
6
+
7
+ module GHULS
8
+ class CLI
9
+ # Parses the arguments (typically ARGV) into a usable hash.
10
+ # @param args [Array] The arguments to parse.
11
+ def parse_options(args)
12
+ args.each do |arg|
13
+ case arg
14
+ when '-h', '--help' then @opts[:help] = true
15
+ when '-un', '--user' then @opts[:user] = Utilities.get_next(arg, args)
16
+ when '-pw', '--pass' then @opts[:pass] = Utilities.get_next(arg, args)
17
+ when '-t', '--token' then @opts[:token] = Utilities.get_next(arg, args)
18
+ when '-g', '--get' then @opts[:get] = Utilities.get_next(arg, args)
19
+ end
20
+ end
21
+ end
22
+
23
+ # Creates a new instance of GHULS::CLI
24
+ # @param args [Array] The arguments for the CLI.
25
+ def initialize(args = ARGV)
26
+ @opts = {
27
+ help: false,
28
+ user: nil,
29
+ pass: nil,
30
+ token: nil,
31
+ get: nil
32
+ }
33
+
34
+ @usage = 'Usage: ghuls [-h] [-un] username [-pw] password [-t] token ' \
35
+ '[-g] username'
36
+ @help = "-h, --help Show helpful information.\n" \
37
+ "-un, --user The username to log in as.\n" \
38
+ "-pw, --pass The password for that username.\n" \
39
+ '-t, --token The token to log in as. This will be preferred ' \
40
+ "over username and password authentication.\n" \
41
+ '-g, --get The username/organization to analyze.'
42
+
43
+ parse_options(args)
44
+ config = Utilities.configure_stuff(@opts)
45
+ @gh = config[:git]
46
+ @colors = config[:colors]
47
+ end
48
+
49
+ # Whether or not the script should fail.
50
+ # @return [Boolean] False if it did not fail, true if it did.
51
+ def failed?
52
+ false if @opts[:help]
53
+
54
+ true if @opts[:get].nil?
55
+ true if @opts[:token].nil? && @opts[:user].nil?
56
+ true if @opts[:token].nil? && @opts[:pass].nil?
57
+ end
58
+
59
+ # Simply runs the program.
60
+ def run
61
+ puts @usage if failed?
62
+ puts @help if @opts[:help]
63
+ exit if failed?
64
+ 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)
71
+ end
72
+ 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
76
+ end
77
+ end
78
+ end
79
+ end
data/cli/lib/ghuls.rb ADDED
@@ -0,0 +1,2 @@
1
+ require_relative '../../utils/utilities'
2
+ require_relative 'ghuls/cli'
@@ -0,0 +1,92 @@
1
+ require 'octokit'
2
+
3
+ module Utilities
4
+ # Gets the Octokit and colors for the program.
5
+ # @param opts [Hash] The options to use. The ones that are used by this method
6
+ # are: :token, :pass, and :user.
7
+ # @return [Hash] A hash containing objects formatted as
8
+ # { git: Octokit::Client, colors: JSON }
9
+ def self.configure_stuff(opts = {})
10
+ token = opts[:token]
11
+ pass = opts[:pass]
12
+ user = opts[:user]
13
+ gh = Octokit::Client.new(login: user, password: pass) if token.nil?
14
+ 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))
17
+ { git: gh, colors: colors }
18
+ end
19
+
20
+ # Gets the next value in an array.
21
+ # @param single [Any] The current value.
22
+ # @param full [Array] The main array to parse.
23
+ # @return [Any] The next value in the array.
24
+ def self.get_next(single, full)
25
+ full.at(full.index(single) + 1)
26
+ end
27
+
28
+ def self.user_exists?(username, github)
29
+ begin
30
+ github.user(username).is_a?(Octokit::NotFound)
31
+ rescue Octokit::NotFound
32
+ return false
33
+ end
34
+ true
35
+ end
36
+
37
+ # Gets the langauges and their bytes for the :user.
38
+ # @param username [String] The username to get info for.
39
+ # @param github [OctoKit::Client] The instance of Octokit::Client.
40
+ # @return [Hash] The languages and their bytes, as formatted as
41
+ # { :Ruby => 129890, :CoffeeScript => 5970 }
42
+ def self.get_langs(username, github)
43
+ repos = github.repositories(username)
44
+ langs = {}
45
+ repos.each do |r|
46
+ next if r[:fork]
47
+ repo_langs = github.languages(r[:full_name])
48
+ repo_langs.each do |l, b|
49
+ if langs[l].nil?
50
+ langs[l] = b
51
+ else
52
+ existing = langs[l]
53
+ langs[l] = existing + b
54
+ end
55
+ end
56
+ end
57
+ langs
58
+ end
59
+
60
+ # Gets the percentage for the given numbers.
61
+ # @param part [Fixnum] The partial value.
62
+ # @param whole [Fixnum] The whole value.
63
+ # @return [Fixnum] The percentage that part is of whole.
64
+ def self.calculate_percent(part, whole)
65
+ (part / whole) * 100
66
+ end
67
+
68
+ # Gets the defined color for the language.
69
+ # @param lang [String] The language name.
70
+ # @param colors [Hash] The hash of colors and languages.
71
+ # @return [String] The 6 digit hexidecimal color.
72
+ # @return [Nil] If there is no defined color for the language.
73
+ def self.get_color_for_language(lang, colors)
74
+ return colors[lang]['color'] unless colors[lang]['color'].nil?
75
+ end
76
+
77
+ def self.analyze(username, github)
78
+ 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
88
+ else
89
+ false
90
+ end
91
+ end
92
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ghuls
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Eli Foster
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: octokit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rainbow
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: string-utility
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Getting GitHub repository language data by user! It also has a web alternative
56
+ at http://ghuls.herokuapp.com
57
+ email: elifosterwy@gmail.com
58
+ executables:
59
+ - ghuls
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - bin/ghuls
64
+ - cli/lib/ghuls.rb
65
+ - cli/lib/ghuls/cli.rb
66
+ - utils/utilities.rb
67
+ homepage: http://ghuls.herokuapp.com
68
+ licenses: []
69
+ metadata: {}
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '2.0'
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ requirements: []
85
+ rubyforge_project:
86
+ rubygems_version: 2.4.5.1
87
+ signing_key:
88
+ specification_version: 4
89
+ summary: 'GHULS: GitHub User Language Statistics'
90
+ test_files: []