reponaut 2.0.0 → 2.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 +4 -4
- data/features/list.feature +77 -1
- data/lib/reponaut/commands/list.rb +15 -2
- data/lib/reponaut/github.rb +25 -4
- data/lib/reponaut/presenter.rb +7 -0
- data/lib/reponaut/version.rb +1 -1
- data/spec/reponaut/presenter_spec.rb +19 -5
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca3c8d9d91d3d659a13788b5173fc39b670e4124
|
4
|
+
data.tar.gz: 7b423f8199715b9d3fe97e33e86e5aaaa82bb7be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99ee34463141ccde3352c27b06ab141473af74061cb4a0a2789b0b3b836ffae3db4ca998a8a80352a19ddfa75581a3b3b32ba4e56d97dffb43c0a88eff0feba5
|
7
|
+
data.tar.gz: 724c5e848bf24285f45083e5e57255f49f6a77c5063ec418c5deb491c80244278d94da93a88ddfdd76474dd15a59a63168a9307829071aa9807bec107a7b12c1
|
data/features/list.feature
CHANGED
@@ -62,6 +62,64 @@ Feature: List repos for a given language
|
|
62
62
|
zanegort
|
63
63
|
"""
|
64
64
|
|
65
|
+
Scenario: Show languages for all repositories
|
66
|
+
Given the GitHub service returns repository data for the user "mdippery"
|
67
|
+
When I run `reponaut ls -l mdippery`
|
68
|
+
Then it should pass with:
|
69
|
+
"""
|
70
|
+
3ddv [Java]
|
71
|
+
blackout [Objective-C]
|
72
|
+
bucknellbug [Objective-C]
|
73
|
+
chameleon [Clojure]
|
74
|
+
collections [Objective-C]
|
75
|
+
dnsimple-python -> tbunnyman/dnsimple-python [Python]
|
76
|
+
dotfiles [Perl]
|
77
|
+
glitz [Python]
|
78
|
+
homebrew-self [Ruby]
|
79
|
+
karmanaut [Clojure]
|
80
|
+
libtar [C]
|
81
|
+
nginx.vim -> vim-scripts/nginx.vim [VimL]
|
82
|
+
rack-pesticide [Ruby]
|
83
|
+
rainyday [Objective-C]
|
84
|
+
reponaut [Python]
|
85
|
+
Smyck-Color-Scheme -> hukl/Smyck-Color-Scheme [VimL]
|
86
|
+
snodes [Java]
|
87
|
+
squash [Objective-C]
|
88
|
+
stackim [JavaScript]
|
89
|
+
staticgenerator -> mrj0/staticgenerator [Python]
|
90
|
+
usaidwat [Ruby]
|
91
|
+
vimfiles [VimL]
|
92
|
+
whitman [Clojure]
|
93
|
+
zanegort [Erlang]
|
94
|
+
"""
|
95
|
+
|
96
|
+
Scenario: Show languages for all repositories without forks
|
97
|
+
Given the GitHub service returns repository data for the user "mdippery"
|
98
|
+
When I run `reponaut ls -lf mdippery`
|
99
|
+
Then it should pass with:
|
100
|
+
"""
|
101
|
+
3ddv [Java]
|
102
|
+
blackout [Objective-C]
|
103
|
+
bucknellbug [Objective-C]
|
104
|
+
chameleon [Clojure]
|
105
|
+
collections [Objective-C]
|
106
|
+
dotfiles [Perl]
|
107
|
+
glitz [Python]
|
108
|
+
homebrew-self [Ruby]
|
109
|
+
karmanaut [Clojure]
|
110
|
+
libtar [C]
|
111
|
+
rack-pesticide [Ruby]
|
112
|
+
rainyday [Objective-C]
|
113
|
+
reponaut [Python]
|
114
|
+
snodes [Java]
|
115
|
+
squash [Objective-C]
|
116
|
+
stackim [JavaScript]
|
117
|
+
usaidwat [Ruby]
|
118
|
+
vimfiles [VimL]
|
119
|
+
whitman [Clojure]
|
120
|
+
zanegort [Erlang]
|
121
|
+
"""
|
122
|
+
|
65
123
|
Scenario: Describe all repositories
|
66
124
|
Given the GitHub service returns repository data for the user "mdippery"
|
67
125
|
When I run `reponaut ls -d mdippery`
|
@@ -234,11 +292,20 @@ Feature: List repos for a given language
|
|
234
292
|
vimfiles
|
235
293
|
"""
|
236
294
|
|
295
|
+
Scenario: List repositories for a given user with no results
|
296
|
+
Given the GitHub service returns repository data for the user "emptyuser"
|
297
|
+
When I run `reponaut ls emptyuser`
|
298
|
+
Then the exit status should not be 0
|
299
|
+
And the output should contain exactly:
|
300
|
+
"""
|
301
|
+
emptyuser has no repositories
|
302
|
+
"""
|
303
|
+
|
237
304
|
Scenario: List repositories in a given language with no results
|
238
305
|
Given the GitHub service returns repository data for the user "mdippery"
|
239
306
|
When I run `reponaut ls mdippery C++`
|
240
307
|
Then the exit status should not be 0
|
241
|
-
And the output should contain:
|
308
|
+
And the output should contain exactly:
|
242
309
|
"""
|
243
310
|
mdippery has no repositories written in C++
|
244
311
|
"""
|
@@ -251,3 +318,12 @@ Feature: List repos for a given language
|
|
251
318
|
"""
|
252
319
|
GitHub rate limit exceeded. Try your request again later.
|
253
320
|
"""
|
321
|
+
|
322
|
+
Scenario: List both descriptions and languages for a given user
|
323
|
+
Given the GitHub service returns repository data for the user "mdippery"
|
324
|
+
When I run `reponaut ls -ld mdippery`
|
325
|
+
Then the exit status should not be 0
|
326
|
+
And the output should contain exactly:
|
327
|
+
"""
|
328
|
+
Only one of -l and -d may be specified
|
329
|
+
"""
|
@@ -8,6 +8,7 @@ module Reponaut
|
|
8
8
|
c.description "List a user's repos"
|
9
9
|
c.option 'ignore_forks', '-f', 'Ignore forks'
|
10
10
|
c.option 'show_description', '-d', 'Show repo description'
|
11
|
+
c.option 'show_language', '-l', 'Show repo language'
|
11
12
|
|
12
13
|
c.action do |args, options|
|
13
14
|
process(options, args)
|
@@ -20,9 +21,15 @@ module Reponaut
|
|
20
21
|
|
21
22
|
language = args[1]
|
22
23
|
|
24
|
+
quit 6, 'Only one of -l and -d may be specified' if options['show_description'] && options['show_language']
|
25
|
+
|
23
26
|
filtered_repos = repos
|
24
27
|
filtered_repos = filtered_repos.select { |r| r.language.downcase == language.downcase } if language
|
25
|
-
|
28
|
+
if filtered_repos.empty?
|
29
|
+
msg = "#{username} has no repositories"
|
30
|
+
msg += " written in #{language}" if language
|
31
|
+
quit 4, msg
|
32
|
+
end
|
26
33
|
|
27
34
|
formatter = formatter_class(options).new
|
28
35
|
filtered_repos.sort.each do |r|
|
@@ -33,7 +40,13 @@ module Reponaut
|
|
33
40
|
private
|
34
41
|
|
35
42
|
def formatter_class(options)
|
36
|
-
options['show_description']
|
43
|
+
if options['show_description']
|
44
|
+
LongPresenter
|
45
|
+
elsif options['show_language']
|
46
|
+
LanguagePresenter
|
47
|
+
else
|
48
|
+
SimplePresenter
|
49
|
+
end
|
37
50
|
end
|
38
51
|
end
|
39
52
|
end
|
data/lib/reponaut/github.rb
CHANGED
@@ -17,7 +17,7 @@ module Reponaut
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def repos
|
20
|
-
|
20
|
+
repo_data.map { |e| Repository.new(self, e) }
|
21
21
|
end
|
22
22
|
|
23
23
|
def to_s
|
@@ -35,10 +35,31 @@ module Reponaut
|
|
35
35
|
private
|
36
36
|
|
37
37
|
def real_repo_data
|
38
|
-
resp =
|
38
|
+
resp = request_repo_data("/users/#{username}/repos")
|
39
|
+
body = JSON.parse(resp.body)
|
40
|
+
parse_linked_data(resp, body)
|
41
|
+
end
|
42
|
+
|
43
|
+
def request_repo_data(url)
|
44
|
+
resp = get(url)
|
39
45
|
raise NoSuchUserError, username if resp.code == 404
|
40
46
|
raise RateLimitExceededError if resp.code == 403
|
41
|
-
resp
|
47
|
+
resp
|
48
|
+
end
|
49
|
+
|
50
|
+
def parse_linked_data(resp, acc)
|
51
|
+
return acc unless resp.headers.include?('link')
|
52
|
+
links = resp.headers['link'].split(/,/).map { |l| l.strip }
|
53
|
+
next_url = links.find { |l| l =~ link_url_re }
|
54
|
+
return acc unless next_url
|
55
|
+
next_url = next_url.match(link_url_re).captures.first
|
56
|
+
resp = request_repo_data(next_url)
|
57
|
+
acc += JSON.parse(resp.body)
|
58
|
+
parse_linked_data(resp, acc)
|
59
|
+
end
|
60
|
+
|
61
|
+
def link_url_re
|
62
|
+
/^<(.+)>; rel="next"$/
|
42
63
|
end
|
43
64
|
|
44
65
|
def mock_repo_data
|
@@ -47,7 +68,7 @@ module Reponaut
|
|
47
68
|
raw_data = IO.read(path)
|
48
69
|
data = YAML.load(raw_data)
|
49
70
|
raise NoSuchUserError, username if data['http_interactions'][0]['response']['status']['code'] == 404
|
50
|
-
data['http_interactions'][0]['response']['body']['string']
|
71
|
+
JSON.parse(data['http_interactions'][0]['response']['body']['string'])
|
51
72
|
end
|
52
73
|
|
53
74
|
define_method(:repo_data, instance_method(ENV.cucumber? ? :mock_repo_data : :real_repo_data))
|
data/lib/reponaut/presenter.rb
CHANGED
data/lib/reponaut/version.rb
CHANGED
@@ -4,12 +4,14 @@ module Reponaut
|
|
4
4
|
module Application
|
5
5
|
describe 'Presenters' do
|
6
6
|
let (:repo) { double('repo', :name => '3ddv',
|
7
|
-
|
8
|
-
|
7
|
+
:description => 'NEES 3D Data Viewer from the Center for Earthquake Engineering Simulation at RPI',
|
8
|
+
:fork? => false,
|
9
|
+
:language => 'Java') }
|
9
10
|
let (:fork) { double('repo', :name => 'mercenary',
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
:description => 'An easier way to build your command-line scripts in Ruby.',
|
12
|
+
:fork? => true,
|
13
|
+
:upstream => 'jekyll/mercenary',
|
14
|
+
:language => 'Ruby') }
|
13
15
|
|
14
16
|
describe SimplePresenter do
|
15
17
|
let (:formatter) { SimplePresenter.new }
|
@@ -23,6 +25,18 @@ module Reponaut
|
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
28
|
+
describe LanguagePresenter do
|
29
|
+
let (:formatter) { LanguagePresenter.new }
|
30
|
+
|
31
|
+
it "prints the repo's name and language" do
|
32
|
+
expect(formatter.format(repo)).to eq('3ddv [Java]')
|
33
|
+
end
|
34
|
+
|
35
|
+
it "prints the repo's name and language and the name of the upstream repo if the repo is a fork" do
|
36
|
+
expect(formatter.format(fork)).to eq('mercenary -> jekyll/mercenary [Ruby]')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
26
40
|
describe LongPresenter do
|
27
41
|
let (:formatter) { LongPresenter.new }
|
28
42
|
|
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: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Dippery
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -183,9 +183,9 @@ homepage: https://github.com/mdippery/reponaut
|
|
183
183
|
licenses:
|
184
184
|
- MIT
|
185
185
|
metadata:
|
186
|
-
build_date:
|
187
|
-
commit: v2.
|
188
|
-
commit_hash:
|
186
|
+
build_date: 2017-03-05 18:44:49 PST
|
187
|
+
commit: v2.1.0
|
188
|
+
commit_hash: 3c46cd939ddbc9ae8d3fd06ce6d3c86b153533f6
|
189
189
|
post_install_message:
|
190
190
|
rdoc_options: []
|
191
191
|
require_paths:
|