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.
@@ -1,3 +1,18 @@
1
+ == 0.3.10
2
+
3
+ * gh clone --search query -- now includes project descriptions
4
+ * bugfix
5
+ * added highline dependency
6
+
7
+ == 0.3.9
8
+
9
+ * gh clone --search query -- to search for a repo and then clone it
10
+ * fixed all the specs and started covering some commands that did not already have specs
11
+
12
+ == 0.3.X
13
+
14
+ * Some stuff done by some people
15
+
1
16
  == 0.1.4
2
17
 
3
18
  * Added usage notes to commands. [topfunky]
data/Manifest CHANGED
@@ -5,7 +5,6 @@ README
5
5
  Rakefile
6
6
  bin/gh
7
7
  bin/github
8
- github.gemspec
9
8
  lib/commands/commands.rb
10
9
  lib/commands/helpers.rb
11
10
  lib/commands/issues.rb
@@ -17,9 +16,22 @@ lib/github/helper.rb
17
16
  lib/github/ui.rb
18
17
  setup.rb
19
18
  spec/command_spec.rb
19
+ spec/commands/command_browse_spec.rb
20
+ spec/commands/command_clone_spec.rb
21
+ spec/commands/command_create-from-local_spec.rb
22
+ spec/commands/command_fetch_spec.rb
23
+ spec/commands/command_fork_spec.rb
24
+ spec/commands/command_helper.rb
25
+ spec/commands/command_home_spec.rb
26
+ spec/commands/command_info_spec.rb
27
+ spec/commands/command_network_spec.rb
28
+ spec/commands/command_pull-request_spec.rb
29
+ spec/commands/command_pull_spec.rb
30
+ spec/commands/command_search_spec.rb
31
+ spec/commands/command_track_spec.rb
32
+ spec/commands_spec.rb
20
33
  spec/extensions_spec.rb
21
34
  spec/github_spec.rb
22
35
  spec/helper_spec.rb
23
36
  spec/spec_helper.rb
24
- spec/ui_spec.rb
25
37
  spec/windoze_spec.rb
data/Rakefile CHANGED
@@ -4,14 +4,17 @@ require 'rake'
4
4
  begin
5
5
  require 'echoe'
6
6
 
7
- Echoe.new('github', '0.3.9') do |p|
7
+ Echoe.new('github', '0.3.10') do |p|
8
8
  p.rubyforge_name = 'github'
9
9
  p.summary = "The official `github` command line helper for simplifying your GitHub experience."
10
10
  p.description = "The official `github` command line helper for simplifying your GitHub experience."
11
11
  p.url = "http://github.com/"
12
12
  p.author = ['Chris Wanstrath', 'Kevin Ballard', 'Scott Chacon']
13
13
  p.email = "chris@ozmm.org"
14
- p.dependencies = ["text-format"]
14
+ p.dependencies = [
15
+ "text-format >=1.0.0",
16
+ "highline ~>1.5.1"
17
+ ]
15
18
  end
16
19
 
17
20
  rescue LoadError => boom
@@ -2,16 +2,16 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{drnic-github}
5
- s.version = "0.3.9"
5
+ s.version = "0.3.10"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Chris Wanstrath, Kevin Ballard, Scott Chacon"]
9
- s.date = %q{2009-11-04}
9
+ s.date = %q{2009-11-05}
10
10
  s.description = %q{The official `github` command line helper for simplifying your GitHub experience.}
11
11
  s.email = %q{chris@ozmm.org}
12
12
  s.executables = ["gh", "github"]
13
13
  s.extra_rdoc_files = ["LICENSE", "README", "bin/gh", "bin/github", "lib/commands/commands.rb", "lib/commands/helpers.rb", "lib/commands/issues.rb", "lib/commands/network.rb", "lib/github.rb", "lib/github/command.rb", "lib/github/extensions.rb", "lib/github/helper.rb", "lib/github/ui.rb"]
14
- s.files = ["History.txt", "LICENSE", "Manifest", "README", "Rakefile", "bin/gh", "bin/github", "github.gemspec", "lib/commands/commands.rb", "lib/commands/helpers.rb", "lib/commands/issues.rb", "lib/commands/network.rb", "lib/github.rb", "lib/github/command.rb", "lib/github/extensions.rb", "lib/github/helper.rb", "lib/github/ui.rb", "setup.rb", "spec/command_spec.rb", "spec/extensions_spec.rb", "spec/github_spec.rb", "spec/helper_spec.rb", "spec/spec_helper.rb", "spec/ui_spec.rb", "spec/windoze_spec.rb"]
14
+ s.files = ["History.txt", "LICENSE", "Manifest", "README", "Rakefile", "bin/gh", "bin/github", "lib/commands/commands.rb", "lib/commands/helpers.rb", "lib/commands/issues.rb", "lib/commands/network.rb", "lib/github.rb", "lib/github/command.rb", "lib/github/extensions.rb", "lib/github/helper.rb", "lib/github/ui.rb", "setup.rb", "spec/command_spec.rb", "spec/commands/command_browse_spec.rb", "spec/commands/command_clone_spec.rb", "spec/commands/command_create-from-local_spec.rb", "spec/commands/command_fetch_spec.rb", "spec/commands/command_fork_spec.rb", "spec/commands/command_helper.rb", "spec/commands/command_home_spec.rb", "spec/commands/command_info_spec.rb", "spec/commands/command_network_spec.rb", "spec/commands/command_pull-request_spec.rb", "spec/commands/command_pull_spec.rb", "spec/commands/command_search_spec.rb", "spec/commands/command_track_spec.rb", "spec/commands_spec.rb", "spec/extensions_spec.rb", "spec/github_spec.rb", "spec/helper_spec.rb", "spec/spec_helper.rb", "spec/windoze_spec.rb", "github.gemspec"]
15
15
  s.homepage = %q{http://github.com/}
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Github", "--main", "README"]
17
17
  s.require_paths = ["lib"]
@@ -24,11 +24,14 @@ Gem::Specification.new do |s|
24
24
  s.specification_version = 3
25
25
 
26
26
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
- s.add_runtime_dependency(%q<text-format>, [">= 0"])
27
+ s.add_runtime_dependency(%q<text-format>, [">= 1.0.0"])
28
+ s.add_runtime_dependency(%q<highline>, ["~> 1.5.1"])
28
29
  else
29
- s.add_dependency(%q<text-format>, [">= 0"])
30
+ s.add_dependency(%q<text-format>, [">= 1.0.0"])
31
+ s.add_dependency(%q<highline>, ["~> 1.5.1"])
30
32
  end
31
33
  else
32
- s.add_dependency(%q<text-format>, [">= 0"])
34
+ s.add_dependency(%q<text-format>, [">= 1.0.0"])
35
+ s.add_dependency(%q<highline>, ["~> 1.5.1"])
33
36
  end
34
37
  end
@@ -37,7 +37,6 @@ command :open do |arg|
37
37
  helper.open "http://github.com/#{arg}"
38
38
  end
39
39
 
40
-
41
40
  desc "Info about this project."
42
41
  command :info do
43
42
  puts "== Info for #{helper.project}"
@@ -133,9 +132,12 @@ command :clone do |user, repo, dir|
133
132
  query = [user, repo, dir].compact.join(" ")
134
133
  data = JSON.parse(open("http://github.com/api/v1/json/search/#{URI.escape query}").read)
135
134
  if (repos = data['repositories']) && !repos.nil? && repos.length > 0
136
- repos = repos.map { |r| "#{r['username']}/#{r['name']}"}.sort.uniq
137
- if user_repo = GitHub::UI.display_select_list(repos)
138
- user, repo = user_repo.split('/', 2)
135
+ repo_list = repos.map do |r|
136
+ { "name" => "#{r['username']}/#{r['name']}", "description" => r['description'] }
137
+ end
138
+ formatted_list = helper.format_list(repo_list).split("\n")
139
+ if user_repo = GitHub::UI.display_select_list(formatted_list)
140
+ user, repo = user_repo.strip.split('/', 2)
139
141
  end
140
142
  end
141
143
  die "Perhaps try another search" unless user && repo
@@ -159,7 +161,7 @@ end
159
161
 
160
162
  desc "Generate the text for a pull request."
161
163
  usage "github pull-request [user] [branch]"
162
- command 'pull-request' do |user, branch|
164
+ command :'pull-request' do |user, branch|
163
165
  if helper.project
164
166
  die "Specify a user for the pull request" if user.nil?
165
167
  user, branch = user.split('/', 2) if branch.nil?
@@ -224,7 +226,7 @@ end
224
226
 
225
227
  desc "Create a new GitHub repository from the current local repository"
226
228
  flags :private => 'Create private repository'
227
- command 'create-from-local' do
229
+ command :'create-from-local' do
228
230
  cwd = sh "pwd"
229
231
  repo = File.basename(cwd)
230
232
  is_repo = !git("status").match(/fatal/)
@@ -454,6 +454,25 @@ helper :format_issue do |issue, options|
454
454
  report.join("\n")
455
455
  end
456
456
 
457
+ # Converts an array of {"name" => "foo", "description" => "some description"} items
458
+ # as a string list like:
459
+ # foo # some description
460
+ # bar-tar # another description
461
+ helper :format_list do |items|
462
+ longest_name = items.inject("") do |name, item|
463
+ name = item["name"] if item["name"] && item["name"].size > name.size
464
+ name
465
+ end
466
+ longest = longest_name.size + 1
467
+ lines = items.map do |item|
468
+ cmdstr = "%-#{longest}s" % item["name"]
469
+ if (description = item["description"]) && description.length > 0
470
+ cmdstr += "# #{description}"
471
+ end
472
+ cmdstr
473
+ end.join("\n")
474
+ end
475
+
457
476
  helper :filter_issue do |issue, options|
458
477
  if options[:after] && ! options[:after].instance_of?(Time)
459
478
  options[:after] = Time.parse(options[:after]) rescue (puts 'cant parse after date')
@@ -3,12 +3,17 @@ require "highline"
3
3
  module GitHub
4
4
  module UI
5
5
  extend self
6
+ # Take a list of items, including optional ' # some description' on each and
7
+ # return the selected item (without the description)
6
8
  def display_select_list(list)
7
9
  HighLine.track_eof = false
8
- HighLine.new.choose do |menu|
9
- list.each { |item| menu.choice item }
10
+ long_result = HighLine.new.choose do |menu|
11
+ list.each_with_index do |item, i|
12
+ menu.choice((i < 9) ? " #{item}" : item)
13
+ end
10
14
  menu.header = "Select a repository to clone"
11
15
  end
16
+ long_result && long_result.gsub(/\s+#.*$/,'').gsub(/^\ /,'')
12
17
  end
13
18
  end
14
19
  end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require File.dirname(__FILE__) + '/command_helper'
3
+
4
+ describe "github browse" do
5
+ include CommandHelper
6
+
7
+ specify "browse should open the project home page with the current branch" do
8
+ running :browse do
9
+ setup_url_for
10
+ setup_user_and_branch("user", "test-branch")
11
+ @helper.should_receive(:open).once.with("https://github.com/user/project/tree/test-branch")
12
+ end
13
+ end
14
+
15
+ specify "browse pending should open the project home page with the 'pending' branch" do
16
+ running :browse, "pending" do
17
+ setup_url_for
18
+ setup_user_and_branch("user", "test-branch")
19
+ @helper.should_receive(:open).once.with("https://github.com/user/project/tree/pending")
20
+ end
21
+ end
22
+
23
+ specify "browse defunkt pending should open the home page of defunkt's fork with the 'pending' branch" do
24
+ running :browse, "defunkt", "pending" do
25
+ setup_url_for
26
+ @helper.should_receive(:open).once.with("https://github.com/defunkt/project/tree/pending")
27
+ end
28
+ end
29
+
30
+ specify "browse defunkt/pending should open the home page of defunkt's fork with the 'pending' branch" do
31
+ running :browse, "defunkt/pending" do
32
+ setup_url_for
33
+ @helper.should_receive(:open).once.with("https://github.com/defunkt/project/tree/pending")
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,87 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require File.dirname(__FILE__) + '/command_helper'
3
+
4
+ describe "github clone" do
5
+ include CommandHelper
6
+
7
+ # -- clone --
8
+ specify "clone should die with no args" do
9
+ running :clone do
10
+ @command.should_receive(:die).with("Specify a user to pull from").and_return { raise "Died" }
11
+ self.should raise_error(RuntimeError)
12
+ end
13
+ end
14
+
15
+ specify "clone should fall through with just one arg" do
16
+ running :clone, "git://git.kernel.org/linux.git" do
17
+ @command.should_receive(:git_exec).with("clone git://git.kernel.org/linux.git")
18
+ end
19
+ end
20
+
21
+ specify "clone defunkt github-gem should clone the repo" do
22
+ running :clone, "defunkt", "github-gem" do
23
+ @command.should_receive(:current_user?).and_return(nil)
24
+ @command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git")
25
+ end
26
+ end
27
+
28
+ specify "clone defunkt/github-gem should clone the repo" do
29
+ running :clone, "defunkt/github-gem" do
30
+ @command.should_receive(:current_user?).and_return(nil)
31
+ @command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git")
32
+ end
33
+ end
34
+
35
+ specify "clone --ssh defunkt github-gem should clone the repo using the private URL" do
36
+ running :clone, "--ssh", "defunkt", "github-gem" do
37
+ @command.should_receive(:git_exec).with("clone git@github.com:defunkt/github-gem.git")
38
+ end
39
+ end
40
+
41
+ specify "clone defunkt github-gem repo should clone the repo into the dir 'repo'" do
42
+ running :clone, "defunkt", "github-gem", "repo" do
43
+ @command.should_receive(:current_user?).and_return(nil)
44
+ @command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git repo")
45
+ end
46
+ end
47
+
48
+ specify "clone defunkt/github-gem repo should clone the repo into the dir 'repo'" do
49
+ running :clone, "defunkt/github-gem", "repo" do
50
+ @command.should_receive(:current_user?).and_return(nil)
51
+ @command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git repo")
52
+ end
53
+ end
54
+
55
+ specify "clone --ssh defunkt github-gem repo should clone the repo using the private URL into the dir 'repo'" do
56
+ running :clone, "--ssh", "defunkt", "github-gem", "repo" do
57
+ @command.should_receive(:git_exec).with("clone git@github.com:defunkt/github-gem.git repo")
58
+ end
59
+ end
60
+
61
+ specify "clone defunkt/github-gem repo should clone the repo into the dir 'repo'" do
62
+ running :clone, "defunkt/github-gem", "repo" do
63
+ @command.should_receive(:current_user?).and_return(nil)
64
+ @command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git repo")
65
+ end
66
+ end
67
+
68
+ specify "clone a selected repo after showing search results" do
69
+ running :clone, "--search", "github-gem" do
70
+ json = StringIO.new '{"repositories":[' +
71
+ '{"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"},' +
72
+ '{"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"}' +
73
+ ']}'
74
+ json.rewind
75
+ question_list = <<-LIST.gsub(/^ /, '').split("\n").compact
76
+ defunkt/github-gem # The official `github` command line helper for simplifying your GitHub experience.
77
+ pjhyett/github-gem-builder # The scripts used to build RubyGems on GitHub
78
+ LIST
79
+ @command.should_receive(:open).with("http://github.com/api/v1/json/search/github-gem").and_return(json)
80
+ GitHub::UI.should_receive(:display_select_list).with(question_list).
81
+ and_return("defunkt/github-gem")
82
+ @command.should_receive(:current_user?).and_return(nil)
83
+ @command.should_receive(:git_exec).with("clone git://github.com/defunkt/github-gem.git")
84
+ end
85
+ end
86
+
87
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require File.dirname(__FILE__) + '/command_helper'
3
+
4
+ describe "github create-from-local" do
5
+ include CommandHelper
6
+
7
+ end
@@ -0,0 +1,56 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require File.dirname(__FILE__) + '/command_helper'
3
+
4
+ describe "github fetch" do
5
+ include CommandHelper
6
+
7
+ specify "fetch should die with no args" do
8
+ running :fetch do
9
+ @command.should_receive(:die).with("Specify a user to pull from").and_return { raise "Died" }
10
+ self.should raise_error(RuntimeError)
11
+ end
12
+ end
13
+
14
+ specify "fetch defunkt should start tracking defunkt if they're not already tracked" do
15
+ running :fetch, "defunkt" do
16
+ setup_remote(:origin, :user => "user", :ssh => true)
17
+ setup_remote(:external, :url => "home:/path/to/project.git")
18
+ GitHub.should_receive(:invoke).with(:track, "defunkt").and_return { raise "Tracked" }
19
+ self.should raise_error("Tracked")
20
+ end
21
+ end
22
+
23
+ specify "fetch defunkt should create defunkt/master and fetch from the defunkt remote" do
24
+ running :fetch, "defunkt" do
25
+ setup_remote(:defunkt)
26
+ @helper.should_receive(:branch_dirty?).and_return false
27
+ @command.should_receive(:git).with("fetch defunkt master:refs/remotes/defunkt/master").ordered
28
+ @command.should_receive(:git).with("update-ref refs/heads/defunkt/master refs/remotes/defunkt/master").ordered
29
+ @command.should_receive(:git_exec).with("checkout defunkt/master").ordered
30
+ stdout.should == "Fetching defunkt/master\n"
31
+ end
32
+ end
33
+
34
+ specify "fetch defunkt/wip should create defunkt/wip and fetch from wip branch on defunkt remote" do
35
+ running :fetch, "defunkt/wip" do
36
+ setup_remote(:defunkt, :remote_branches => ["master", "wip"])
37
+ @helper.should_receive(:branch_dirty?).and_return false
38
+ @command.should_receive(:git).with("fetch defunkt wip:refs/remotes/defunkt/wip").ordered
39
+ @command.should_receive(:git).with("update-ref refs/heads/defunkt/wip refs/remotes/defunkt/wip").ordered
40
+ @command.should_receive(:git_exec).with("checkout defunkt/wip").ordered
41
+ stdout.should == "Fetching defunkt/wip\n"
42
+ end
43
+ end
44
+
45
+ specify "fetch --merge defunkt should fetch from defunkt remote into current branch" do
46
+ running :fetch, "--merge", "defunkt" do
47
+ setup_remote(:defunkt)
48
+ @helper.should_receive(:branch_dirty?).and_return false
49
+ @command.should_receive(:git).with("fetch defunkt master:refs/remotes/defunkt/master").ordered
50
+ @command.should_receive(:git).with("update-ref refs/heads/defunkt/master refs/remotes/defunkt/master").ordered
51
+ @command.should_receive(:git_exec).with("checkout defunkt/master").ordered
52
+ stdout.should == "Fetching defunkt/master\n"
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,44 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require File.dirname(__FILE__) + '/command_helper'
3
+
4
+ describe "github fork" do
5
+ include CommandHelper
6
+
7
+ specify "fork should print out help" do
8
+ running :fork do
9
+ @helper.should_receive(:remotes).and_return({})
10
+ @command.should_receive(:die).with("Specify a user/project to fork, or run from within a repo").and_return { raise "Died" }
11
+ self.should raise_error(RuntimeError)
12
+ end
13
+ end
14
+
15
+ specify "fork this repo should create github fork and replace origin remote" do
16
+ running :fork do
17
+ setup_github_token
18
+ setup_url_for "origin", "defunkt", "github-gem"
19
+ setup_remote "origin", :user => "defunkt", :project => "github-gem"
20
+ setup_user_and_branch
21
+ @command.should_receive(:sh).with("curl -F 'login=drnic' -F 'token=MY_GITHUB_TOKEN' http://github.com/defunkt/github-gem/fork")
22
+ @command.should_receive(:git, "config remote.origin.url git@github.com/drnic/github-gem.git")
23
+ stdout.should == "defunkt/github-gem forked\n"
24
+ end
25
+ end
26
+
27
+ specify "fork a user/project repo" do
28
+ running :fork, "defunkt/github-gem" do
29
+ setup_github_token
30
+ @command.should_receive(:sh).with("curl -F 'login=drnic' -F 'token=MY_GITHUB_TOKEN' http://github.com/defunkt/github-gem/fork")
31
+ @command.should_receive(:git_exec, "clone git://github.com/defunkt/github-gem.git")
32
+ stdout.should == "Giving GitHub a moment to create the fork...\n"
33
+ end
34
+ end
35
+
36
+ specify "fork a user project repo" do
37
+ running :fork, "defunkt", "github-gem" do
38
+ setup_github_token
39
+ @command.should_receive("sh").with("curl -F 'login=drnic' -F 'token=MY_GITHUB_TOKEN' http://github.com/defunkt/github-gem/fork")
40
+ @command.should_receive(:git_exec, "clone git://github.com/defunkt/github-gem.git")
41
+ stdout.should == "Giving GitHub a moment to create the fork...\n"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,170 @@
1
+ module CommandHelper
2
+ def running(cmd, *args, &block)
3
+ Runner.new(self, cmd, *args, &block).run
4
+ end
5
+
6
+ class Runner
7
+ include SetupMethods
8
+
9
+ def initialize(parent, cmd, *args, &block)
10
+ @cmd_name = cmd.to_s
11
+ @command = GitHub.find_command(cmd)
12
+ @helper = @command.helper
13
+ @args = args
14
+ @block = block
15
+ @parent = parent
16
+ end
17
+
18
+ def run
19
+ self.instance_eval &@block
20
+ mock_remotes unless @remotes.nil?
21
+ GitHub.should_receive(:load).with(GitHub::BasePath + "/commands/commands.rb")
22
+ GitHub.should_receive(:load).with(GitHub::BasePath + "/commands/helpers.rb")
23
+ GitHub.should_receive(:load).with(GitHub::BasePath + "/commands/network.rb")
24
+ GitHub.should_receive(:load).with(GitHub::BasePath + "/commands/issues.rb")
25
+ args = @args.clone
26
+ GitHub.parse_options(args) # strip out the flags
27
+ GitHub.should_receive(:invoke).with(@cmd_name, *args).and_return do
28
+ GitHub.send(GitHub.send(:__mock_proxy).send(:munge, :invoke), @cmd_name, *args)
29
+ end
30
+ invoke = lambda { GitHub.activate([@cmd_name, *@args]) }
31
+ if @expected_result
32
+ expectation, result = @expected_result
33
+ case result
34
+ when Spec::Matchers::RaiseError, Spec::Matchers::Change, Spec::Matchers::ThrowSymbol
35
+ invoke.send expectation, result
36
+ else
37
+ invoke.call.send expectation, result
38
+ end
39
+ else
40
+ invoke.call
41
+ end
42
+ @stdout_mock.invoke unless @stdout_mock.nil?
43
+ @stderr_mock.invoke unless @stderr_mock.nil?
44
+ end
45
+
46
+ def setup_remote(remote, options = {:user => nil, :project => "project", :remote_branches => nil})
47
+ @remotes ||= {}
48
+ @remote_branches ||= {}
49
+ user = options[:user] || remote
50
+ project = options[:project]
51
+ ssh = options[:ssh]
52
+ url = options[:url]
53
+ remote_branches = options[:remote_branches] || ["master"]
54
+ if url
55
+ @remotes[remote] = url
56
+ elsif ssh
57
+ @remotes[remote] = "git@github.com:#{user}/#{project}.git"
58
+ else
59
+ @remotes[remote] = "git://github.com/#{user}/#{project}.git"
60
+ end
61
+
62
+ @remote_branches[remote] = (@remote_branches[remote] || Array.new) | remote_branches
63
+ @helper.should_receive(:remote_branch?).any_number_of_times.and_return do |remote, branch|
64
+ @remote_branches.fetch(remote.to_sym,[]).include?(branch)
65
+ end
66
+ end
67
+
68
+ def mock_remotes()
69
+ @helper.should_receive(:remotes).any_number_of_times.and_return(@remotes)
70
+ end
71
+
72
+ def mock_members(members)
73
+ @helper.should_receive(:network_members).any_number_of_times.and_return(members)
74
+ end
75
+
76
+ def should(result)
77
+ @expected_result = [:should, result]
78
+ end
79
+
80
+ def should_not(result)
81
+ @expected_result = [:should_not, result]
82
+ end
83
+
84
+ def stdout
85
+ if @stdout_mock.nil?
86
+ output = ""
87
+ @stdout_mock = DeferredMock.new(output)
88
+ $stdout.should_receive(:write).any_number_of_times do |str|
89
+ output << str
90
+ end
91
+ end
92
+ @stdout_mock
93
+ end
94
+
95
+ def stderr
96
+ if @stderr_mock.nil?
97
+ output = ""
98
+ @stderr_mock = DeferredMock.new(output)
99
+ $stderr.should_receive(:write).any_number_of_times do |str|
100
+ output << str
101
+ end
102
+ end
103
+ @stderr_mock
104
+ end
105
+
106
+ class DeferredMock
107
+ def initialize(obj = nil)
108
+ @obj = obj
109
+ @calls = []
110
+ @expectations = []
111
+ end
112
+
113
+ attr_reader :obj
114
+
115
+ def invoke(obj = nil)
116
+ obj ||= @obj
117
+ @calls.each do |sym, args|
118
+ obj.send sym, *args
119
+ end
120
+ @expectations.each do |exp|
121
+ exp.invoke
122
+ end
123
+ end
124
+
125
+ def should(*args)
126
+ if args.empty?
127
+ exp = Expectation.new(self, :should)
128
+ @expectations << exp
129
+ exp
130
+ else
131
+ @calls << [:should, args]
132
+ end
133
+ end
134
+
135
+ def should_not(*args)
136
+ if args.empty?
137
+ exp = Expectation.new(self, :should_not)
138
+ @expectations << exp
139
+ exp
140
+ else
141
+ @calls << [:should_not, args]
142
+ end
143
+ end
144
+
145
+ class Expectation
146
+ def initialize(mock, call)
147
+ @mock = mock
148
+ @call = call
149
+ @calls = []
150
+ end
151
+
152
+ undef_method *(instance_methods.map { |x| x.to_sym } - [:__id__, :__send__])
153
+
154
+ def invoke
155
+ @calls.each do |sym, args|
156
+ (@mock.obj.send @call).send sym, *args
157
+ end
158
+ end
159
+
160
+ def method_missing(sym, *args)
161
+ @calls << [sym, args]
162
+ end
163
+ end
164
+ end
165
+
166
+ def method_missing(sym, *args)
167
+ @parent.send sym, *args
168
+ end
169
+ end
170
+ end