reponaut 1.0.0 → 1.0.1

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: 6bfb04cc85d3e63283257df1aa7605273fd186b5
4
- data.tar.gz: 42ab965b308e530353c9aa0da3c8a20ae5097aae
3
+ metadata.gz: 65cb2bccfbcc83c315f1ef89bc32d5909e7ba9d8
4
+ data.tar.gz: 172ab6a1b8eaa8c982b907820519520db2567806
5
5
  SHA512:
6
- metadata.gz: 8be0ced57cdfb4f6864fdb205f46b0ae5d89e4ddfbe1886f89599ce1eb2e088eeb631eda7b85d18061c4b7e8dab80d83d067e3f65bceb721f18b61baacd94fd7
7
- data.tar.gz: ddfae6bf03f49b3d82605e419d94ed51f0f2c356e801d9a05fe86d97ae223eb1c8d91ff03656b03f7787b642b156bb860dd5669e342240f331d2860aa3437058
6
+ metadata.gz: 4e981f194e8be53cfffc91781c500e18bbe76d54e455c386b08267230cd8515cc1b834a0d76150b440c976fdc3f2ff6266dcb621b385ff37a828ce929ae0e533
7
+ data.tar.gz: f04127d458bdbaaeb25815c6a6e62a77bc3e3e1b63a9daace4a7141d6855a8042c25c83736eff4fd8391d533171306eda5f1cb7c9d529aa465101c7eaf2b028d
@@ -118,3 +118,21 @@ Feature: Count repositories by language
118
118
  Shell 1
119
119
  Swift 12
120
120
  """
121
+
122
+ Scenario: List repository counts for a non-existent user
123
+ Given the GitHub service returns 404 for the user "nosuchuser"
124
+ When I run `reponaut nosuchuser`
125
+ Then the exit status should not be 0
126
+ And the stderr should contain:
127
+ """
128
+ No such user: nosuchuser
129
+ """
130
+
131
+ Scenario: List repository counts for a user with no repositories
132
+ Given the GitHub service returns repository data for the user "emptyuser"
133
+ When I run `reponaut emptyuser`
134
+ Then the exit status should not be 0
135
+ And the stderr should contain:
136
+ """
137
+ emptyuser has no repositories
138
+ """
@@ -40,8 +40,23 @@ Feature: Get help
40
40
 
41
41
  Scenario: Specify an invalid option
42
42
  When I run `reponaut -b`
43
- Then it should fail with:
43
+ Then the exit status should not be 0
44
+ And the stderr should contain:
44
45
  """
45
46
  unknown option `-b'
46
47
  Run `reponaut --help` for help information
47
48
  """
49
+
50
+ Scenario: Specify no options
51
+ When I run `reponaut`
52
+ Then the exit status should not be 0
53
+ And the stderr should contain:
54
+ """
55
+ Usage: reponaut [OPTIONS] USERNAME
56
+
57
+ Options:
58
+ -s, --sort Sort by repo count
59
+ -f, --ignore-forks Ignore forked repos
60
+ -h, --help
61
+ --version
62
+ """
@@ -1,3 +1,7 @@
1
1
  Given /^the GitHub service returns repository data for the user "([^"]*)"$/ do |username|
2
2
  set_environment_variable 'REPONAUT_ENV', 'cucumber'
3
3
  end
4
+
5
+ Given /^the GitHub service returns 404 for the user "([^"]*)"$/ do |username|
6
+ set_environment_variable 'REPONAUT_ENV', 'cucumber'
7
+ end
@@ -28,13 +28,17 @@ module Reponaut
28
28
 
29
29
  username = opts.arguments.first
30
30
  unless username
31
- puts opts
31
+ $stderr.puts opts
32
32
  exit 1
33
33
  end
34
34
 
35
35
  gh = Reponaut::GitHub::Client.new(username)
36
36
  repos = gh.repos.reject { |r| r.language.nil? }
37
37
  repos = repos.find_all { |r| r.source? } if opts.ignore_forks?
38
+ if repos.count < 1
39
+ $stderr.puts "#{username} has no repositories"
40
+ exit 3
41
+ end
38
42
  stats = Reponaut::StatisticsCalculator.new(repos)
39
43
  counts = stats.language_counts.pairs
40
44
  counts = if opts.sort?
@@ -54,6 +58,9 @@ module Reponaut
54
58
  counts.each do |e|
55
59
  printf "%-*s %*d\n", longest_label, e[0], longest_count, e[1]
56
60
  end
61
+ rescue Reponaut::GitHub::NoSuchUserError => e
62
+ $stderr.puts "No such user: #{e}"
63
+ exit 4
57
64
  rescue Slop::UnknownOption => e
58
65
  $stderr.puts e
59
66
  $stderr.puts 'Run `reponaut --help` for help information'
@@ -0,0 +1,17 @@
1
+ class Object
2
+ def bool?
3
+ false
4
+ end
5
+ end
6
+
7
+ class TrueClass
8
+ def bool?
9
+ true
10
+ end
11
+ end
12
+
13
+ class FalseClass
14
+ def bool?
15
+ true
16
+ end
17
+ end
@@ -1,9 +1,12 @@
1
1
  require 'httparty'
2
2
  require 'json'
3
3
  require 'yaml' if ENV['REPONAUT_ENV'] == 'cucumber'
4
+ require 'reponaut/ext/bool'
4
5
 
5
6
  module Reponaut
6
7
  module GitHub
8
+ class NoSuchUserError < StandardError; end
9
+
7
10
  class Client
8
11
  include HTTParty
9
12
 
@@ -19,16 +22,23 @@ module Reponaut
19
22
  JSON.parse(repo_data).map { |e| Repository.new(e) }
20
23
  end
21
24
 
25
+ def to_s
26
+ username
27
+ end
28
+
22
29
  private
23
30
  def repo_data
24
31
  return mock_repo_data if ENV['REPONAUT_ENV'] == 'cucumber'
25
- self.class.get("/users/#{username}/repos").body
32
+ resp = self.class.get("/users/#{username}/repos")
33
+ raise NoSuchUserError, username if resp.code == 404
34
+ resp.body
26
35
  end
27
36
 
28
37
  def mock_repo_data
29
38
  path = File.join(File.dirname(__FILE__), '..', '..', 'spec', 'fixtures', 'cassettes', "#{username}.yml")
30
39
  raw_data = IO.read(path)
31
40
  data = YAML.load(raw_data)
41
+ raise NoSuchUserError, username if data['http_interactions'][0]['response']['status']['code'] == 404
32
42
  data['http_interactions'][0]['response']['body']['string']
33
43
  end
34
44
  end
@@ -38,19 +48,28 @@ module Reponaut
38
48
  @data = data
39
49
  end
40
50
 
41
- def fork?
42
- self.fork
43
- end
44
-
45
51
  def source?
46
52
  !fork?
47
53
  end
48
54
 
55
+ def to_s
56
+ full_name
57
+ end
58
+
49
59
  def method_missing(symbol, *args)
50
60
  if @data.include?(symbol.to_s)
51
61
  @data[symbol.to_s]
52
62
  else
53
- super
63
+ if symbol.to_s.end_with?('?')
64
+ bool_sym = symbol.to_s.slice(0, symbol.to_s.length-1)
65
+ if @data.include?(bool_sym) && @data[bool_sym].bool?
66
+ @data[bool_sym]
67
+ else
68
+ super
69
+ end
70
+ else
71
+ super
72
+ end
54
73
  end
55
74
  end
56
75
  end
@@ -1,3 +1,3 @@
1
1
  module Reponaut
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -0,0 +1,72 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.github.com/users/lordofcoffee/repos
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - GitHub.com
23
+ Date:
24
+ - Fri, 07 Aug 2015 03:35:37 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Content-Length:
28
+ - '2'
29
+ Status:
30
+ - 200 OK
31
+ X-Ratelimit-Limit:
32
+ - '60'
33
+ X-Ratelimit-Remaining:
34
+ - '53'
35
+ X-Ratelimit-Reset:
36
+ - '1438921215'
37
+ Cache-Control:
38
+ - public, max-age=60, s-maxage=60
39
+ Etag:
40
+ - '"98f0c1b396a4e5d54f4d5fe561d54b44"'
41
+ Vary:
42
+ - Accept
43
+ - Accept-Encoding
44
+ X-Github-Media-Type:
45
+ - github.v3
46
+ X-Xss-Protection:
47
+ - 1; mode=block
48
+ X-Frame-Options:
49
+ - deny
50
+ Content-Security-Policy:
51
+ - default-src 'none'
52
+ Access-Control-Allow-Credentials:
53
+ - 'true'
54
+ Access-Control-Expose-Headers:
55
+ - ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset,
56
+ X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval
57
+ Access-Control-Allow-Origin:
58
+ - "*"
59
+ X-Github-Request-Id:
60
+ - B8170007:6D95:1297BE9E:55C42788
61
+ Strict-Transport-Security:
62
+ - max-age=31536000; includeSubdomains; preload
63
+ X-Content-Type-Options:
64
+ - nosniff
65
+ X-Served-By:
66
+ - 2d7a5e35115884240089368322196939
67
+ body:
68
+ encoding: UTF-8
69
+ string: "[]"
70
+ http_version:
71
+ recorded_at: Fri, 07 Aug 2015 03:35:37 GMT
72
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,63 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.github.com/users/shitter/repos
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 404
19
+ message: Not Found
20
+ headers:
21
+ Server:
22
+ - GitHub.com
23
+ Date:
24
+ - Fri, 07 Aug 2015 03:28:16 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Status:
30
+ - 404 Not Found
31
+ X-Ratelimit-Limit:
32
+ - '60'
33
+ X-Ratelimit-Remaining:
34
+ - '55'
35
+ X-Ratelimit-Reset:
36
+ - '1438921215'
37
+ X-Github-Media-Type:
38
+ - github.v3
39
+ X-Xss-Protection:
40
+ - 1; mode=block
41
+ X-Frame-Options:
42
+ - deny
43
+ Content-Security-Policy:
44
+ - default-src 'none'
45
+ Access-Control-Allow-Credentials:
46
+ - 'true'
47
+ Access-Control-Expose-Headers:
48
+ - ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset,
49
+ X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval
50
+ Access-Control-Allow-Origin:
51
+ - "*"
52
+ X-Github-Request-Id:
53
+ - B8170007:6D8F:44D0D48:55C425D0
54
+ Strict-Transport-Security:
55
+ - max-age=31536000; includeSubdomains; preload
56
+ X-Content-Type-Options:
57
+ - nosniff
58
+ body:
59
+ encoding: ASCII-8BIT
60
+ string: '{"message":"Not Found","documentation_url":"https://developer.github.com/v3"}'
61
+ http_version:
62
+ recorded_at: Fri, 07 Aug 2015 03:28:16 GMT
63
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'reponaut/ext/bool'
3
+
4
+ module Reponaut
5
+ module Ext
6
+ describe Object do
7
+ describe "#bool?" do
8
+ it "is not a boolean value" do
9
+ expect(Array.new.bool?).to be false
10
+ end
11
+ end
12
+ end
13
+
14
+ describe TrueClass do
15
+ describe "#bool?" do
16
+ it "is a boolean value" do
17
+ expect(true.bool?).to be true
18
+ end
19
+ end
20
+ end
21
+
22
+ describe FalseClass do
23
+ describe "#bool?" do
24
+ it "is a boolean value" do
25
+ expect(false.bool?).to be true
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reponaut
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Dippery
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-07 00:00:00.000000000 Z
11
+ date: 2015-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -142,13 +142,17 @@ files:
142
142
  - features/support/vcr.rb
143
143
  - lib/reponaut.rb
144
144
  - lib/reponaut/application.rb
145
+ - lib/reponaut/ext/bool.rb
145
146
  - lib/reponaut/ext/hash.rb
146
147
  - lib/reponaut/github.rb
147
148
  - lib/reponaut/statistics.rb
148
149
  - lib/reponaut/version.rb
149
150
  - reponaut.gemspec
151
+ - spec/fixtures/cassettes/emptyuser.yml
150
152
  - spec/fixtures/cassettes/mdippery.yml
153
+ - spec/fixtures/cassettes/nosuchuser.yml
151
154
  - spec/fixtures/cassettes/testuser1.yml
155
+ - spec/reponaut/bool_spec.rb
152
156
  - spec/reponaut/github_spec.rb
153
157
  - spec/reponaut/hash_spec.rb
154
158
  - spec/reponaut/statistics_spec.rb
@@ -183,8 +187,11 @@ test_files:
183
187
  - features/step_definitions/github_steps.rb
184
188
  - features/support/aruba.rb
185
189
  - features/support/vcr.rb
190
+ - spec/fixtures/cassettes/emptyuser.yml
186
191
  - spec/fixtures/cassettes/mdippery.yml
192
+ - spec/fixtures/cassettes/nosuchuser.yml
187
193
  - spec/fixtures/cassettes/testuser1.yml
194
+ - spec/reponaut/bool_spec.rb
188
195
  - spec/reponaut/github_spec.rb
189
196
  - spec/reponaut/hash_spec.rb
190
197
  - spec/reponaut/statistics_spec.rb