drnic-github 0.3.9 → 0.3.10
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.
- data/History.txt +15 -0
- data/Manifest +14 -2
- data/Rakefile +5 -2
- data/github.gemspec +9 -6
- data/lib/commands/commands.rb +8 -6
- data/lib/commands/helpers.rb +19 -0
- data/lib/github/ui.rb +7 -2
- data/spec/commands/command_browse_spec.rb +36 -0
- data/spec/commands/command_clone_spec.rb +87 -0
- data/spec/commands/command_create-from-local_spec.rb +7 -0
- data/spec/commands/command_fetch_spec.rb +56 -0
- data/spec/commands/command_fork_spec.rb +44 -0
- data/spec/commands/command_helper.rb +170 -0
- data/spec/commands/command_home_spec.rb +20 -0
- data/spec/commands/command_info_spec.rb +23 -0
- data/spec/commands/command_network_spec.rb +21 -0
- data/spec/commands/command_pull-request_spec.rb +51 -0
- data/spec/commands/command_pull_spec.rb +82 -0
- data/spec/commands/command_search_spec.rb +34 -0
- data/spec/commands/command_track_spec.rb +82 -0
- data/spec/commands_spec.rb +49 -0
- data/spec/helper_spec.rb +16 -0
- metadata +28 -5
- data/spec/ui_spec.rb +0 -700
data/spec/ui_spec.rb
DELETED
@@ -1,700 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
describe "github" do
|
4
|
-
# -- home --
|
5
|
-
specify "home should open the project home page" do
|
6
|
-
running :home do
|
7
|
-
setup_url_for
|
8
|
-
@helper.should_receive(:open).once.with("https://github.com/user/project/tree/master")
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
specify "home defunkt should open the home page of defunkt's fork" do
|
13
|
-
running :home, "defunkt" do
|
14
|
-
setup_url_for
|
15
|
-
@helper.should_receive(:open).once.with("https://github.com/defunkt/project/tree/master")
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# -- browse --
|
20
|
-
specify "browse should open the project home page with the current branch" do
|
21
|
-
running :browse do
|
22
|
-
setup_url_for
|
23
|
-
setup_user_and_branch("user", "test-branch")
|
24
|
-
@helper.should_receive(:open).once.with("https://github.com/user/project/tree/test-branch")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
specify "browse pending should open the project home page with the 'pending' branch" do
|
29
|
-
running :browse, "pending" do
|
30
|
-
setup_url_for
|
31
|
-
setup_user_and_branch("user", "test-branch")
|
32
|
-
@helper.should_receive(:open).once.with("https://github.com/user/project/tree/pending")
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
specify "browse defunkt pending should open the home page of defunkt's fork with the 'pending' branch" do
|
37
|
-
running :browse, "defunkt", "pending" do
|
38
|
-
setup_url_for
|
39
|
-
@helper.should_receive(:open).once.with("https://github.com/defunkt/project/tree/pending")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
specify "browse defunkt/pending should open the home page of defunkt's fork with the 'pending' branch" do
|
44
|
-
running :browse, "defunkt/pending" do
|
45
|
-
setup_url_for
|
46
|
-
@helper.should_receive(:open).once.with("https://github.com/defunkt/project/tree/pending")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# -- network --
|
51
|
-
specify "network should open the network page for this repo" do
|
52
|
-
running :network, 'web' do
|
53
|
-
setup_url_for
|
54
|
-
@helper.should_receive(:open).once.with("https://github.com/user/project/network")
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
specify "network defunkt should open the network page for defunkt's fork" do
|
59
|
-
running :network, 'web', "defunkt" do
|
60
|
-
setup_url_for
|
61
|
-
@helper.should_receive(:open).once.with("https://github.com/defunkt/project/network")
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
# -- info --
|
66
|
-
specify "info should show info for this project" do
|
67
|
-
running :info do
|
68
|
-
setup_url_for
|
69
|
-
setup_remote(:origin, :user => "user", :ssh => true)
|
70
|
-
setup_remote(:defunkt)
|
71
|
-
setup_remote(:external, :url => "home:/path/to/project.git")
|
72
|
-
stdout.should == <<-EOF
|
73
|
-
== Info for project
|
74
|
-
You are user
|
75
|
-
Currently tracking:
|
76
|
-
- defunkt (as defunkt)
|
77
|
-
- home:/path/to/project.git (as external)
|
78
|
-
- user (as origin)
|
79
|
-
EOF
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# -- track --
|
84
|
-
specify "track defunkt should track a new remote for defunkt" do
|
85
|
-
running :track, "defunkt" do
|
86
|
-
setup_url_for
|
87
|
-
@helper.should_receive(:tracking?).with("defunkt").once.and_return(false)
|
88
|
-
@command.should_receive(:git).with("remote add defunkt git://github.com/defunkt/project.git").once
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
specify "track --private defunkt should track a new remote for defunkt using ssh" do
|
93
|
-
running :track, "--private", "defunkt" do
|
94
|
-
setup_url_for
|
95
|
-
@helper.should_receive(:tracking?).with("defunkt").and_return(false)
|
96
|
-
@command.should_receive(:git).with("remote add defunkt git@github.com:defunkt/project.git")
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
specify "track --ssh defunkt should be equivalent to track --private defunkt" do
|
101
|
-
running :track, "--ssh", "defunkt" do
|
102
|
-
setup_url_for
|
103
|
-
@helper.should_receive(:tracking?).with("defunkt").and_return(false)
|
104
|
-
@command.should_receive(:git).with("remote add defunkt git@github.com:defunkt/project.git")
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
specify "track defunkt should die if the defunkt remote exists" do
|
109
|
-
running :track, "defunkt" do
|
110
|
-
setup_url_for
|
111
|
-
@helper.should_receive(:tracking?).with("defunkt").once.and_return(true)
|
112
|
-
@command.should_receive(:die).with("Already tracking defunkt").and_return { raise "Died" }
|
113
|
-
self.should raise_error(RuntimeError)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
specify "track should die with no args" do
|
118
|
-
running :track do
|
119
|
-
@command.should_receive(:die).with("Specify a user to track").and_return { raise "Died" }
|
120
|
-
self.should raise_error(RuntimeError)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
specify "track should accept user/project syntax" do
|
125
|
-
running :track, "defunkt/github-gem.git" do
|
126
|
-
setup_url_for
|
127
|
-
@helper.should_receive(:tracking?).with("defunkt").and_return false
|
128
|
-
@command.should_receive(:git).with("remote add defunkt git://github.com/defunkt/github-gem.git")
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
specify "track defunkt/github-gem.git should function with no origin remote" do
|
133
|
-
running :track, "defunkt/github-gem.git" do
|
134
|
-
@helper.stub!(:url_for).with("origin").and_return ""
|
135
|
-
@helper.stub!(:tracking?).and_return false
|
136
|
-
@command.should_receive(:git).with("remote add defunkt git://github.com/defunkt/github-gem.git")
|
137
|
-
self.should_not raise_error(SystemExit)
|
138
|
-
stderr.should_not =~ /^Error/
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
specify "track origin defunkt/github-gem should track defunkt/github-gem as the origin remote" do
|
143
|
-
running :track, "origin", "defunkt/github-gem" do
|
144
|
-
@helper.stub!(:url_for).with("origin").and_return ""
|
145
|
-
@helper.stub!(:tracking?).and_return false
|
146
|
-
@command.should_receive(:git).with("remote add origin git://github.com/defunkt/github-gem.git")
|
147
|
-
stderr.should_not =~ /^Error/
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
specify "track --private origin defunkt/github-gem should track defunkt/github-gem as the origin remote using ssh" do
|
152
|
-
running :track, "--private", "origin", "defunkt/github-gem" do
|
153
|
-
@helper.stub!(:url_for).with("origin").and_return ""
|
154
|
-
@helper.stub!(:tracking?).and_return false
|
155
|
-
@command.should_receive(:git).with("remote add origin git@github.com:defunkt/github-gem.git")
|
156
|
-
stderr.should_not =~ /^Error/
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
# -- fetch --
|
161
|
-
specify "fetch should die with no args" do
|
162
|
-
running :fetch do
|
163
|
-
@command.should_receive(:die).with("Specify a user to pull from").and_return { raise "Died "}
|
164
|
-
self.should raise_error(RuntimeError)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
specify "pull defunkt should start tracking defunkt if they're not already tracked" do
|
169
|
-
running :pull, "defunkt" do
|
170
|
-
mock_members 'defunkt'
|
171
|
-
setup_remote(:origin, :user => "user", :ssh => true)
|
172
|
-
setup_remote(:external, :url => "home:/path/to/project.git")
|
173
|
-
GitHub.should_receive(:invoke).with(:track, "defunkt").and_return { raise "Tracked" }
|
174
|
-
self.should raise_error("Tracked")
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
specify "pull defunkt should create defunkt/master and pull from the defunkt remote" do
|
179
|
-
running :pull, "defunkt" do
|
180
|
-
mock_members 'defunkt'
|
181
|
-
setup_remote(:defunkt)
|
182
|
-
@helper.should_receive(:branch_dirty?).and_return false
|
183
|
-
@command.should_receive(:git).with("fetch defunkt").ordered
|
184
|
-
@command.should_receive(:git_exec).with("checkout -b defunkt/master defunkt/master").ordered
|
185
|
-
stdout.should == "Switching to defunkt-master\n"
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
specify "pull defunkt should switch to pre-existing defunkt/master and pull from the defunkt remote" do
|
190
|
-
running :pull, "defunkt" do
|
191
|
-
mock_members 'defunkt'
|
192
|
-
setup_remote(:defunkt)
|
193
|
-
@helper.should_receive(:branch_dirty?).and_return true
|
194
|
-
@command.should_receive(:die).with("Unable to switch branches, your current branch has uncommitted changes").and_return { raise "Died" }
|
195
|
-
self.should raise_error(RuntimeError)
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
specify "fetch defunkt/wip should create defunkt/wip and fetch from wip branch on defunkt remote" do
|
200
|
-
running :fetch, "defunkt/wip" do
|
201
|
-
setup_remote(:defunkt, :remote_branches => ["master", "wip"])
|
202
|
-
@helper.should_receive(:branch_dirty?).and_return false
|
203
|
-
@command.should_receive(:git).with("fetch defunkt wip:refs/remotes/defunkt/wip").ordered
|
204
|
-
@command.should_receive(:git).with("update-ref refs/heads/defunkt/wip refs/remotes/defunkt/wip").ordered
|
205
|
-
@command.should_receive(:git_exec).with("checkout defunkt/wip").ordered
|
206
|
-
stdout.should == "Fetching defunkt/wip\n"
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
specify "fetch --merge defunkt should fetch from defunkt remote into current branch" do
|
211
|
-
running :fetch, "--merge", "defunkt" do
|
212
|
-
setup_remote(:defunkt)
|
213
|
-
@helper.should_receive(:branch_dirty?).and_return false
|
214
|
-
@command.should_receive(:git).with("fetch defunkt master:refs/remotes/defunkt/master").ordered
|
215
|
-
@command.should_receive(:git).with("update-ref refs/heads/defunkt/master refs/remotes/defunkt/master").ordered
|
216
|
-
@command.should_receive(:git_exec).with("checkout defunkt/master").ordered
|
217
|
-
stdout.should == "Fetching defunkt/master\n"
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
# -- fetch --
|
222
|
-
specify "fetch should die with no args" do
|
223
|
-
running :fetch do
|
224
|
-
@command.should_receive(:die).with("Specify a user to pull from").and_return { raise "Died" }
|
225
|
-
self.should raise_error(RuntimeError)
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
specify "fetch defunkt should start tracking defunkt if they're not already tracked" do
|
230
|
-
running :fetch, "defunkt" do
|
231
|
-
setup_remote(:origin, :user => "user", :ssh => true)
|
232
|
-
setup_remote(:external, :url => "home:/path/to/project.git")
|
233
|
-
GitHub.should_receive(:invoke).with(:track, "defunkt").and_return { raise "Tracked" }
|
234
|
-
self.should raise_error("Tracked")
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
specify "fetch defunkt should create defunkt/master and fetch from the defunkt remote" do
|
239
|
-
running :fetch, "defunkt" do
|
240
|
-
setup_remote(:defunkt)
|
241
|
-
@helper.should_receive(:branch_dirty?).and_return false
|
242
|
-
@command.should_receive(:git).with("fetch defunkt master:refs/remotes/defunkt/master").ordered
|
243
|
-
@command.should_receive(:git).with("update-ref refs/heads/defunkt/master refs/remotes/defunkt/master").ordered
|
244
|
-
@command.should_receive(:git_exec).with("checkout defunkt/master").ordered
|
245
|
-
stdout.should == "Fetching defunkt/master\n"
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
specify "pull defunkt wip should create defunkt/wip and pull from wip branch on defunkt remote" do
|
250
|
-
running :pull, "defunkt", "wip" do
|
251
|
-
mock_members 'defunkt'
|
252
|
-
setup_remote(:defunkt)
|
253
|
-
@helper.should_receive(:branch_dirty?).and_return true
|
254
|
-
@command.should_receive(:die).with("Unable to switch branches, your current branch has uncommitted changes").and_return { raise "Died" }
|
255
|
-
self.should raise_error(RuntimeError)
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
specify "pull defunkt/wip should switch to pre-existing defunkt/wip and pull from wip branch on defunkt remote" do
|
260
|
-
running :pull, "defunkt/wip" do
|
261
|
-
mock_members 'defunkt'
|
262
|
-
setup_remote(:defunkt)
|
263
|
-
@helper.should_receive(:branch_dirty?).and_return false
|
264
|
-
@command.should_receive(:git).with("fetch defunkt").ordered
|
265
|
-
@command.should_receive(:git_exec).with("checkout -b defunkt/wip defunkt/wip").ordered
|
266
|
-
stdout.should == "Switching to defunkt-wip\n"
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
specify "pull --merge defunkt should pull from defunkt remote into current branch" do
|
271
|
-
running :pull, "--merge", "defunkt" do
|
272
|
-
mock_members 'defunkt'
|
273
|
-
setup_remote(:defunkt)
|
274
|
-
@helper.should_receive(:branch_dirty?).and_return false
|
275
|
-
@command.should_receive(:git_exec).with("pull defunkt master")
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
|
-
specify "pull falls through for non-recognized commands" do
|
280
|
-
running :pull, 'remote' do
|
281
|
-
mock_members 'defunkt'
|
282
|
-
setup_remote(:defunkt)
|
283
|
-
@command.should_receive(:git_exec).with("pull remote")
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
specify "pull passes along args when falling through" do
|
288
|
-
running :pull, 'remote', '--stat' do
|
289
|
-
mock_members 'defunkt'
|
290
|
-
@command.should_receive(:git_exec).with("pull remote --stat")
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
# -- clone --
|
295
|
-
specify "clone should die with no args" do
|
296
|
-
running :clone do
|
297
|
-
@command.should_receive(:die).with("Specify a user to pull from").and_return { raise "Died" }
|
298
|
-
self.should raise_error(RuntimeError)
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
specify "clone should fall through with just one arg" do
|
303
|
-
running :clone, "git://git.kernel.org/linux.git" do
|
304
|
-
@command.should_receive(:git_exec).with("clone git://git.kernel.org/linux.git")
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
specify "clone defunkt github-gem should clone the repo" do
|
309
|
-
running :clone, "defunkt", "github-gem" do
|
310
|
-
@command.should_receive(:current_user?).and_return(nil)
|
311
|
-
@command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git")
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
specify "clone defunkt/github-gem should clone the repo" do
|
316
|
-
running :clone, "defunkt/github-gem" do
|
317
|
-
@command.should_receive(:current_user?).and_return(nil)
|
318
|
-
@command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git")
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
specify "clone --ssh defunkt github-gem should clone the repo using the private URL" do
|
323
|
-
running :clone, "--ssh", "defunkt", "github-gem" do
|
324
|
-
@command.should_receive(:git_exec).with("clone git@github.com:defunkt/github-gem.git")
|
325
|
-
end
|
326
|
-
end
|
327
|
-
|
328
|
-
specify "clone defunkt github-gem repo should clone the repo into the dir 'repo'" do
|
329
|
-
running :clone, "defunkt", "github-gem", "repo" do
|
330
|
-
@command.should_receive(:current_user?).and_return(nil)
|
331
|
-
@command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git repo")
|
332
|
-
end
|
333
|
-
end
|
334
|
-
|
335
|
-
specify "clone defunkt/github-gem repo should clone the repo into the dir 'repo'" do
|
336
|
-
running :clone, "defunkt/github-gem", "repo" do
|
337
|
-
@command.should_receive(:current_user?).and_return(nil)
|
338
|
-
@command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git repo")
|
339
|
-
end
|
340
|
-
end
|
341
|
-
|
342
|
-
specify "clone --ssh defunkt github-gem repo should clone the repo using the private URL into the dir 'repo'" do
|
343
|
-
running :clone, "--ssh", "defunkt", "github-gem", "repo" do
|
344
|
-
@command.should_receive(:git_exec).with("clone git@github.com:defunkt/github-gem.git repo")
|
345
|
-
end
|
346
|
-
end
|
347
|
-
|
348
|
-
specify "clone defunkt/github-gem repo should clone the repo into the dir 'repo'" do
|
349
|
-
running :clone, "defunkt/github-gem", "repo" do
|
350
|
-
@command.should_receive(:current_user?).and_return(nil)
|
351
|
-
@command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git repo")
|
352
|
-
end
|
353
|
-
end
|
354
|
-
|
355
|
-
specify "clone a selected repo after showing search results" do
|
356
|
-
running :clone, "--search", "github-gem" do
|
357
|
-
json = StringIO.new '{"repositories":[' +
|
358
|
-
'{"name":"github-gem","size":300,"followers":499,"username":"defunkt","language":"Ruby","fork":false,"id":"repo-1653","type":"repo","pushed":"2008-12-04T03:14:00Z","forks":59,"description":"The official `github` command line helper for simplifying your GitHub experience.","score":3.4152448,"created":"2008-02-28T09:35:34Z"},' +
|
359
|
-
'{"name":"github-gem-builder","size":76,"followers":26,"username":"pjhyett","language":"Ruby","fork":false,"id":"repo-67489","type":"repo","pushed":"2008-11-04T04:54:57Z","forks":3,"description":"The scripts used to build RubyGems on GitHub","score":3.4152448,"created":"2008-10-24T22:29:32Z"}' +
|
360
|
-
']}'
|
361
|
-
json.rewind
|
362
|
-
@command.should_receive(:open).with("http://github.com/api/v1/json/search/github-gem").and_return(json)
|
363
|
-
GitHub::UI.should_receive(:display_select_list).with(%w[defunkt/github-gem pjhyett/github-gem-builder]).
|
364
|
-
and_return("defunkt/github-gem")
|
365
|
-
@command.should_receive(:current_user?).and_return(nil)
|
366
|
-
@command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git")
|
367
|
-
end
|
368
|
-
end
|
369
|
-
|
370
|
-
# -- fork --
|
371
|
-
specify "fork should print out help" do
|
372
|
-
running :fork do
|
373
|
-
@helper.should_receive(:remotes).and_return({})
|
374
|
-
@command.should_receive(:die).with("Specify a user/project to fork, or run from within a repo").and_return { raise "Died" }
|
375
|
-
self.should raise_error(RuntimeError)
|
376
|
-
end
|
377
|
-
end
|
378
|
-
|
379
|
-
specify "fork this repo should create github fork and replace origin remote" do
|
380
|
-
running :fork do
|
381
|
-
setup_github_token
|
382
|
-
setup_url_for "origin", "defunkt", "github-gem"
|
383
|
-
setup_remote "origin", :user => "defunkt", :project => "github-gem"
|
384
|
-
setup_user_and_branch
|
385
|
-
@command.should_receive(:sh).with("curl -F 'login=drnic' -F 'token=MY_GITHUB_TOKEN' http://github.com/defunkt/github-gem/fork")
|
386
|
-
@command.should_receive(:git, "config remote.origin.url git@github.com/drnic/github-gem.git")
|
387
|
-
stdout.should == "defunkt/github-gem forked\n"
|
388
|
-
end
|
389
|
-
end
|
390
|
-
|
391
|
-
specify "fork a user/project repo" do
|
392
|
-
running :fork, "defunkt/github-gem" do
|
393
|
-
setup_github_token
|
394
|
-
@command.should_receive(:sh).with("curl -F 'login=drnic' -F 'token=MY_GITHUB_TOKEN' http://github.com/defunkt/github-gem/fork")
|
395
|
-
@command.should_receive(:git_exec, "clone git://github.com/defunkt/github-gem.git")
|
396
|
-
stdout.should == "Giving GitHub a moment to create the fork...\n"
|
397
|
-
end
|
398
|
-
end
|
399
|
-
|
400
|
-
specify "fork a user project repo" do
|
401
|
-
running :fork, "defunkt", "github-gem" do
|
402
|
-
setup_github_token
|
403
|
-
@command.should_receive("sh").with("curl -F 'login=drnic' -F 'token=MY_GITHUB_TOKEN' http://github.com/defunkt/github-gem/fork")
|
404
|
-
@command.should_receive(:git_exec, "clone git://github.com/defunkt/github-gem.git")
|
405
|
-
stdout.should == "Giving GitHub a moment to create the fork...\n"
|
406
|
-
end
|
407
|
-
end
|
408
|
-
|
409
|
-
# -- create-from-local --
|
410
|
-
|
411
|
-
|
412
|
-
# -- search --
|
413
|
-
specify "search finds multiple results" do
|
414
|
-
running :search, "github-gem" do
|
415
|
-
json = StringIO.new '{"repositories":[' +
|
416
|
-
'{"name":"github-gem","size":300,"followers":499,"username":"defunkt","language":"Ruby","fork":false,"id":"repo-1653","type":"repo","pushed":"2008-12-04T03:14:00Z","forks":59,"description":"The official `github` command line helper for simplifying your GitHub experience.","score":3.4152448,"created":"2008-02-28T09:35:34Z"},' +
|
417
|
-
'{"name":"github-gem-builder","size":76,"followers":26,"username":"pjhyett","language":"Ruby","fork":false,"id":"repo-67489","type":"repo","pushed":"2008-11-04T04:54:57Z","forks":3,"description":"The scripts used to build RubyGems on GitHub","score":3.4152448,"created":"2008-10-24T22:29:32Z"}' +
|
418
|
-
']}'
|
419
|
-
json.rewind
|
420
|
-
@command.should_receive(:open).with("http://github.com/api/v1/json/search/github-gem").and_return(json)
|
421
|
-
stdout.should == "defunkt/github-gem\npjhyett/github-gem-builder\n"
|
422
|
-
end
|
423
|
-
end
|
424
|
-
|
425
|
-
specify "search finds no results" do
|
426
|
-
running :search, "xxxxxxxxxx" do
|
427
|
-
json = StringIO.new '{"repositories":[]}'
|
428
|
-
json.rewind
|
429
|
-
@command.should_receive(:open).with("http://github.com/api/v1/json/search/xxxxxxxxxx").and_return(json)
|
430
|
-
stdout.should == "No results found\n"
|
431
|
-
end
|
432
|
-
end
|
433
|
-
|
434
|
-
specify "search shows usage if no arguments given" do
|
435
|
-
running :search do
|
436
|
-
@command.should_receive(:die).with("Usage: github search [query]").and_return { raise "Died" }
|
437
|
-
self.should raise_error(RuntimeError)
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
|
442
|
-
# -- pull-request --
|
443
|
-
specify "pull-request should die with no args" do
|
444
|
-
running :'pull-request' do
|
445
|
-
setup_url_for
|
446
|
-
@command.should_receive(:die).with("Specify a user for the pull request").and_return { raise "Died" }
|
447
|
-
self.should raise_error(RuntimeError)
|
448
|
-
end
|
449
|
-
end
|
450
|
-
|
451
|
-
specify "pull-request user should track user if untracked" do
|
452
|
-
running :'pull-request', "user" do
|
453
|
-
setup_url_for
|
454
|
-
setup_remote :origin, :user => "kballard"
|
455
|
-
setup_remote :defunkt
|
456
|
-
GitHub.should_receive(:invoke).with(:track, "user").and_return { raise "Tracked" }
|
457
|
-
self.should raise_error("Tracked")
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
|
-
specify "pull-request user/branch should generate a pull request" do
|
462
|
-
running :'pull-request', "user/branch" do
|
463
|
-
setup_url_for
|
464
|
-
setup_remote :origin, :user => "kballard"
|
465
|
-
setup_remote :user
|
466
|
-
@command.should_receive(:git_exec).with("request-pull user/branch origin")
|
467
|
-
end
|
468
|
-
end
|
469
|
-
|
470
|
-
specify "pull-request user should generate a pull request with branch master" do
|
471
|
-
running :'pull-request', "user" do
|
472
|
-
setup_url_for
|
473
|
-
setup_remote :origin, :user => "kballard"
|
474
|
-
setup_remote :user
|
475
|
-
@command.should_receive(:git_exec).with("request-pull user/master origin")
|
476
|
-
end
|
477
|
-
end
|
478
|
-
|
479
|
-
specify "pull-request user branch should generate a pull request" do
|
480
|
-
running:'pull-request', "user", "branch" do
|
481
|
-
setup_url_for
|
482
|
-
setup_remote :origin, :user => "kballard"
|
483
|
-
setup_remote :user
|
484
|
-
@command.should_receive(:git_exec).with("request-pull user/branch origin")
|
485
|
-
end
|
486
|
-
end
|
487
|
-
|
488
|
-
# -- fallthrough --
|
489
|
-
specify "should fall through to actual git commands" do
|
490
|
-
running :commit do
|
491
|
-
@command.should_receive(:git_exec).with(["commit", []])
|
492
|
-
end
|
493
|
-
end
|
494
|
-
|
495
|
-
specify "should pass along arguments when falling through" do
|
496
|
-
running :commit, '-a', '-m', 'yo mama' do
|
497
|
-
@command.should_receive(:git_exec).with(["commit", ["-a", "-m", 'yo mama']])
|
498
|
-
end
|
499
|
-
end
|
500
|
-
|
501
|
-
# -- default --
|
502
|
-
specify "should print the default message" do
|
503
|
-
running :default do
|
504
|
-
GitHub.should_receive(:descriptions).any_number_of_times.and_return({
|
505
|
-
"home" => "Open the home page",
|
506
|
-
"browsing" => "Browse the github page for this branch",
|
507
|
-
"commands" => "description",
|
508
|
-
"tracking" => "Track a new repo"
|
509
|
-
})
|
510
|
-
GitHub.should_receive(:flag_descriptions).any_number_of_times.and_return({
|
511
|
-
"home" => {:flag => "Flag description"},
|
512
|
-
"browsing" => {},
|
513
|
-
"commands" => {},
|
514
|
-
"tracking" => {:flag1 => "Flag one", :flag2 => "Flag two"}
|
515
|
-
})
|
516
|
-
@command.should_receive(:puts).with(<<-EOS.gsub(/^ /, ''))
|
517
|
-
Usage: github command <space separated arguments>
|
518
|
-
Available commands:
|
519
|
-
browsing => Browse the github page for this branch
|
520
|
-
commands => description
|
521
|
-
home => Open the home page
|
522
|
-
--flag: Flag description
|
523
|
-
tracking => Track a new repo
|
524
|
-
--flag1: Flag one
|
525
|
-
--flag2: Flag two
|
526
|
-
EOS
|
527
|
-
end
|
528
|
-
end
|
529
|
-
|
530
|
-
# -----------------
|
531
|
-
|
532
|
-
def running(cmd, *args, &block)
|
533
|
-
Runner.new(self, cmd, *args, &block).run
|
534
|
-
end
|
535
|
-
|
536
|
-
class Runner
|
537
|
-
include SetupMethods
|
538
|
-
|
539
|
-
def initialize(parent, cmd, *args, &block)
|
540
|
-
@cmd_name = cmd.to_s
|
541
|
-
@command = GitHub.find_command(cmd)
|
542
|
-
@helper = @command.helper
|
543
|
-
@args = args
|
544
|
-
@block = block
|
545
|
-
@parent = parent
|
546
|
-
end
|
547
|
-
|
548
|
-
def run
|
549
|
-
self.instance_eval &@block
|
550
|
-
mock_remotes unless @remotes.nil?
|
551
|
-
GitHub.should_receive(:load).with(GitHub::BasePath + "/commands/commands.rb")
|
552
|
-
GitHub.should_receive(:load).with(GitHub::BasePath + "/commands/helpers.rb")
|
553
|
-
GitHub.should_receive(:load).with(GitHub::BasePath + "/commands/network.rb")
|
554
|
-
GitHub.should_receive(:load).with(GitHub::BasePath + "/commands/issues.rb")
|
555
|
-
args = @args.clone
|
556
|
-
GitHub.parse_options(args) # strip out the flags
|
557
|
-
GitHub.should_receive(:invoke).with(@cmd_name, *args).and_return do
|
558
|
-
GitHub.send(GitHub.send(:__mock_proxy).send(:munge, :invoke), @cmd_name, *args)
|
559
|
-
end
|
560
|
-
invoke = lambda { GitHub.activate([@cmd_name, *@args]) }
|
561
|
-
if @expected_result
|
562
|
-
expectation, result = @expected_result
|
563
|
-
case result
|
564
|
-
when Spec::Matchers::RaiseError, Spec::Matchers::Change, Spec::Matchers::ThrowSymbol
|
565
|
-
invoke.send expectation, result
|
566
|
-
else
|
567
|
-
invoke.call.send expectation, result
|
568
|
-
end
|
569
|
-
else
|
570
|
-
invoke.call
|
571
|
-
end
|
572
|
-
@stdout_mock.invoke unless @stdout_mock.nil?
|
573
|
-
@stderr_mock.invoke unless @stderr_mock.nil?
|
574
|
-
end
|
575
|
-
|
576
|
-
def setup_remote(remote, options = {:user => nil, :project => "project", :remote_branches => nil})
|
577
|
-
@remotes ||= {}
|
578
|
-
@remote_branches ||= {}
|
579
|
-
user = options[:user] || remote
|
580
|
-
project = options[:project]
|
581
|
-
ssh = options[:ssh]
|
582
|
-
url = options[:url]
|
583
|
-
remote_branches = options[:remote_branches] || ["master"]
|
584
|
-
if url
|
585
|
-
@remotes[remote] = url
|
586
|
-
elsif ssh
|
587
|
-
@remotes[remote] = "git@github.com:#{user}/#{project}.git"
|
588
|
-
else
|
589
|
-
@remotes[remote] = "git://github.com/#{user}/#{project}.git"
|
590
|
-
end
|
591
|
-
|
592
|
-
@remote_branches[remote] = (@remote_branches[remote] || Array.new) | remote_branches
|
593
|
-
@helper.should_receive(:remote_branch?).any_number_of_times.and_return do |remote, branch|
|
594
|
-
@remote_branches.fetch(remote.to_sym,[]).include?(branch)
|
595
|
-
end
|
596
|
-
end
|
597
|
-
|
598
|
-
def mock_remotes()
|
599
|
-
@helper.should_receive(:remotes).any_number_of_times.and_return(@remotes)
|
600
|
-
end
|
601
|
-
|
602
|
-
def mock_members(members)
|
603
|
-
@helper.should_receive(:network_members).any_number_of_times.and_return(members)
|
604
|
-
end
|
605
|
-
|
606
|
-
def should(result)
|
607
|
-
@expected_result = [:should, result]
|
608
|
-
end
|
609
|
-
|
610
|
-
def should_not(result)
|
611
|
-
@expected_result = [:should_not, result]
|
612
|
-
end
|
613
|
-
|
614
|
-
def stdout
|
615
|
-
if @stdout_mock.nil?
|
616
|
-
output = ""
|
617
|
-
@stdout_mock = DeferredMock.new(output)
|
618
|
-
$stdout.should_receive(:write).any_number_of_times do |str|
|
619
|
-
output << str
|
620
|
-
end
|
621
|
-
end
|
622
|
-
@stdout_mock
|
623
|
-
end
|
624
|
-
|
625
|
-
def stderr
|
626
|
-
if @stderr_mock.nil?
|
627
|
-
output = ""
|
628
|
-
@stderr_mock = DeferredMock.new(output)
|
629
|
-
$stderr.should_receive(:write).any_number_of_times do |str|
|
630
|
-
output << str
|
631
|
-
end
|
632
|
-
end
|
633
|
-
@stderr_mock
|
634
|
-
end
|
635
|
-
|
636
|
-
class DeferredMock
|
637
|
-
def initialize(obj = nil)
|
638
|
-
@obj = obj
|
639
|
-
@calls = []
|
640
|
-
@expectations = []
|
641
|
-
end
|
642
|
-
|
643
|
-
attr_reader :obj
|
644
|
-
|
645
|
-
def invoke(obj = nil)
|
646
|
-
obj ||= @obj
|
647
|
-
@calls.each do |sym, args|
|
648
|
-
obj.send sym, *args
|
649
|
-
end
|
650
|
-
@expectations.each do |exp|
|
651
|
-
exp.invoke
|
652
|
-
end
|
653
|
-
end
|
654
|
-
|
655
|
-
def should(*args)
|
656
|
-
if args.empty?
|
657
|
-
exp = Expectation.new(self, :should)
|
658
|
-
@expectations << exp
|
659
|
-
exp
|
660
|
-
else
|
661
|
-
@calls << [:should, args]
|
662
|
-
end
|
663
|
-
end
|
664
|
-
|
665
|
-
def should_not(*args)
|
666
|
-
if args.empty?
|
667
|
-
exp = Expectation.new(self, :should_not)
|
668
|
-
@expectations << exp
|
669
|
-
exp
|
670
|
-
else
|
671
|
-
@calls << [:should_not, args]
|
672
|
-
end
|
673
|
-
end
|
674
|
-
|
675
|
-
class Expectation
|
676
|
-
def initialize(mock, call)
|
677
|
-
@mock = mock
|
678
|
-
@call = call
|
679
|
-
@calls = []
|
680
|
-
end
|
681
|
-
|
682
|
-
undef_method *(instance_methods.map { |x| x.to_sym } - [:__id__, :__send__])
|
683
|
-
|
684
|
-
def invoke
|
685
|
-
@calls.each do |sym, args|
|
686
|
-
(@mock.obj.send @call).send sym, *args
|
687
|
-
end
|
688
|
-
end
|
689
|
-
|
690
|
-
def method_missing(sym, *args)
|
691
|
-
@calls << [sym, args]
|
692
|
-
end
|
693
|
-
end
|
694
|
-
end
|
695
|
-
|
696
|
-
def method_missing(sym, *args)
|
697
|
-
@parent.send sym, *args
|
698
|
-
end
|
699
|
-
end
|
700
|
-
end
|