ors 0.2.10 → 0.3.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.
Files changed (42) hide show
  1. data/README.markdown +71 -0
  2. data/bin/ors +1 -1
  3. data/lib/ors.rb +21 -2
  4. data/lib/ors/base.rb +30 -0
  5. data/lib/ors/commands/base.rb +56 -12
  6. data/lib/ors/commands/changes.rb +21 -7
  7. data/lib/ors/commands/console.rb +16 -18
  8. data/lib/ors/commands/deploy.rb +24 -13
  9. data/lib/ors/commands/env.rb +9 -9
  10. data/lib/ors/commands/exec.rb +14 -7
  11. data/lib/ors/commands/help.rb +9 -11
  12. data/lib/ors/commands/logs.rb +16 -14
  13. data/lib/ors/commands/migrate.rb +8 -9
  14. data/lib/ors/commands/restart.rb +9 -11
  15. data/lib/ors/commands/ruby.rb +8 -6
  16. data/lib/ors/commands/runner.rb +29 -25
  17. data/lib/ors/commands/setup.rb +16 -16
  18. data/lib/ors/commands/start.rb +9 -11
  19. data/lib/ors/commands/stop.rb +9 -11
  20. data/lib/ors/commands/symlink.rb +31 -0
  21. data/lib/ors/commands/timestamps.rb +27 -0
  22. data/lib/ors/commands/update.rb +15 -11
  23. data/lib/ors/config.rb +88 -58
  24. data/lib/ors/helpers.rb +107 -76
  25. data/lib/ors/log_unifier.rb +2 -2
  26. data/lib/ors/version.rb +2 -2
  27. data/spec/ors/{command_spec.rb → base_spec.rb} +11 -8
  28. data/spec/ors/commands/base_spec.rb +17 -9
  29. data/spec/ors/commands/deploy_spec.rb +4 -3
  30. data/spec/ors/commands/runner_spec.rb +8 -27
  31. data/spec/ors/commands/timestamps_spec.rb +16 -0
  32. data/spec/ors/commands/update_spec.rb +8 -3
  33. data/spec/ors/config_spec.rb +56 -61
  34. data/spec/ors/helpers_spec.rb +6 -2
  35. data/spec/ors/log_unifier_spec.rb +2 -2
  36. metadata +82 -57
  37. data/README +0 -52
  38. data/lib/ors/command.rb +0 -46
  39. data/lib/ors/commands/check.rb +0 -27
  40. data/lib/ors/commands/sync.rb +0 -27
  41. data/lib/ors/core_ext.rb +0 -53
  42. data/spec/ors/commands/check_spec.rb +0 -15
data/lib/ors/helpers.rb CHANGED
@@ -1,90 +1,131 @@
1
- module ORS
1
+ class ORS
2
2
  module Helpers
3
3
 
4
- include Config
4
+ # Helpers for Commands when parsing in ARGV
5
+ module ParseHelpers
6
+ def parse_remote_and_or_branch
7
+ option = ORS.config[:args].shift
5
8
 
6
- def setup_repo server
7
- info "[#{server}] installing codebase..."
9
+ unless option.nil?
10
+ if option.match(/^[a-zA-Z0-9_\-]+\/[a-zA-Z0-9_\-]+$/)
11
+ remote, *branch = option.split("/")
8
12
 
9
- execute_command server, %(cd #{base_path}),
10
- %(rm -rf #{deploy_directory}),
11
- %(git clone #{repo}:#{name} #{deploy_directory}),
12
- %(mkdir -p #{deploy_directory}/tmp/pids),
13
- %(mkdir -p #{deploy_directory}/log)
13
+ ORS.config[:remote] = remote
14
+ ORS.config[:branch] = branch.join('/')
15
+ else
16
+ ORS.config[:remote] = option
17
+ end
18
+ end
19
+ end
14
20
  end
21
+ include ParseHelpers
15
22
 
16
- def setup_ruby server
17
- info "[#{server}] installing ruby and gems..."
18
23
 
19
- execute_command server, prepare_initial_environment,
20
- %(gem install rubygems-update),
21
- %(gem update --system),
22
- %(gem install bundler),
23
- %(bundle install --without development test osx_development > bundler.log)
24
- end
24
+ # Helpers for preparing to run a command on a server
25
+ module PrepareHelpers
26
+ def prepare_environment
27
+ [%({ cd #{ORS.config[:deploy_directory]} > /dev/null; })]
28
+ end
25
29
 
26
- def update_code server
27
- info "[#{server}] updating codebase..."
30
+ def prepare_environment_with_rvm
31
+ [%(source ~/.rvm/scripts/rvm)] + prepare_environment
32
+ end
28
33
 
29
- execute_command server, prepare_environment,
30
- %(git fetch),
31
- %(git checkout -q -f origin/#{environment}),
32
- %(git reset --hard),
33
- %(git submodule update --init)
34
+ def prepare_initial_environment
35
+ # We do a source and a git checkout here because the master
36
+ # branch may not always contain the proper rvmrc/Gemfile
37
+ # we need when setting up the rest of the deploy
38
+ prepare_environment_with_rvm + [
39
+ %(git checkout -q -f #{ORS.config[:remote]}/#{ORS.config[:branch]}),
40
+ %(git reset --hard),
41
+ %(source .rvmrc)
42
+ ]
43
+ end
34
44
  end
45
+ include PrepareHelpers
46
+
47
+ # Helpers for commands for re-use
48
+ module CommandHelpers
49
+ def setup_repo server
50
+ info "[#{server}] installing codebase..."
51
+
52
+ execute_command server, %(cd #{ORS.config[:base_path]}),
53
+ %(rm -rf #{ORS.config[:deploy_directory]}),
54
+ %(git clone #{ORS.config[:remote_url]} #{ORS.config[:deploy_directory]}),
55
+ %(mkdir -p #{ORS.config[:deploy_directory]}/tmp/pids),
56
+ %(mkdir -p #{ORS.config[:deploy_directory]}/log)
57
+ end
35
58
 
36
- def bundle_install server
37
- info "[#{server}] installing bundle..."
59
+ def setup_ruby server
60
+ info "[#{server}] installing ruby and gems..."
38
61
 
39
- execute_command server, prepare_environment,
40
- %(bundle install --without development test osx_development > bundler.log)
41
- end
62
+ execute_command server, prepare_initial_environment,
63
+ %(gem install rubygems-update),
64
+ %(gem update --system),
65
+ %(gem install bundler),
66
+ %(bundle install --without development test osx_development > bundler.log)
67
+ end
42
68
 
43
- def start_server server
44
- info "[#{server}] starting unicorn..."
69
+ def update_code server
70
+ info "[#{server}] updating codebase..."
45
71
 
46
- execute_command server, prepare_environment,
47
- %(if [ -f config.ru ]; then RAILS_ENV=#{environment} bundle exec unicorn -c config/unicorn.rb -D -E #{environment}; else RAILS_ENV=#{environment} bundle exec unicorn_rails -c config/unicorn.rb -D -E #{environment}; fi)
48
- end
72
+ execute_command server, prepare_environment,
73
+ %(git fetch #{ORS.config[:remote]}),
74
+ %(git checkout -q -f #{ORS.config[:remote]}/#{ORS.config[:branch]}),
75
+ %(git reset --hard),
76
+ %(git submodule update --init)
77
+ end
49
78
 
50
- def stop_server server
51
- info "[#{server}] stopping unicorn..."
79
+ def bundle_install server
80
+ info "[#{server}] installing bundle..."
52
81
 
53
- execute_command server, prepare_environment,
54
- %(kill \\`cat tmp/pids/unicorn.pid\\`)
55
- end
82
+ execute_command server, prepare_environment_with_rvm,
83
+ %(bundle install --without development test osx_development > bundler.log)
84
+ end
56
85
 
57
- def restart_server server
58
- info "[#{server}] restarting unicorn..."
86
+ def start_server server
87
+ info "[#{server}] starting unicorn..."
59
88
 
60
- execute_command server, prepare_environment,
61
- %(kill -USR2 \\`cat tmp/pids/unicorn.pid\\`)
62
- end
89
+ execute_command server, prepare_environment_with_rvm,
90
+ %(if [ -f config.ru ]; then RAILS_ENV=#{ORS.config[:environment]} bundle exec unicorn -c config/unicorn.rb -D; else RAILS_ENV=#{ORS.config[:environment]} bundle exec unicorn_rails -c config/unicorn.rb -D; fi)
91
+ end
63
92
 
64
- def run_migrations server
65
- info "[#{server}] running migrations..."
93
+ def stop_server server
94
+ info "[#{server}] stopping unicorn..."
66
95
 
67
- execute_command server, prepare_environment,
68
- %(RAILS_ENV=#{environment} bundle exec rake db:migrate db:seed)
69
- end
96
+ execute_command server, prepare_environment,
97
+ %(kill \\`cat tmp/pids/unicorn.pid\\`)
98
+ end
70
99
 
71
- def execute_in_parallel servers
72
- servers.map do |server|
73
- Thread.new(server) do |server|
74
- yield server
75
- end
76
- end.map {|thread| thread.join }
100
+ def restart_server server
101
+ info "[#{server}] restarting unicorn..."
102
+
103
+ execute_command server, prepare_environment,
104
+ %(kill -USR2 \\`cat tmp/pids/unicorn.pid\\`)
105
+ end
106
+
107
+ def run_migrations server
108
+ info "[#{server}] running migrations..."
109
+
110
+ execute_command server, prepare_environment_with_rvm,
111
+ %(RAILS_ENV=#{ORS.config[:environment]} bundle exec rake db:migrate db:seed)
112
+ end
77
113
  end
114
+ include CommandHelpers
115
+
116
+ #
117
+ # How we actually execute/build commands
118
+ #
78
119
 
79
120
  # options = {:exec => ?, :capture => ?, :quiet_ssh => ?}
80
- def execute_command server, *command_array
121
+ def execute_command(server, *command_array)
81
122
  options = {:exec => false, :capture => false, :quiet_ssh => false}
82
123
  options.merge!(command_array.pop) if command_array.last.is_a?(Hash)
83
124
  options[:local] = true if server.to_s == "localhost"
84
125
 
85
126
  command = build_command(server, command_array, options)
86
127
 
87
- if pretending
128
+ if ORS.config[:pretending]
88
129
  info("[#{server}] #{command}")
89
130
  else
90
131
  if options[:exec]
@@ -120,29 +161,20 @@ module ORS
120
161
  if options[:local]
121
162
  commands
122
163
  else
123
- if use_gateway
124
- %(ssh #{quiet_ssh}#{psuedo_tty}#{gateway} 'ssh #{quiet_ssh}#{psuedo_tty}#{deploy_user}@#{server} "#{commands}"')
164
+ if ORS.config[:use_gateway]
165
+ %(ssh #{quiet_ssh}#{psuedo_tty}#{ORS.config[:gateway]} 'ssh #{quiet_ssh}#{psuedo_tty}#{ORS.config[:user]}@#{server} "#{commands}"')
125
166
  else
126
- %(ssh #{quiet_ssh}#{psuedo_tty}#{deploy_user}@#{server} "#{commands}")
167
+ %(ssh #{quiet_ssh}#{psuedo_tty}#{ORS.config[:user]}@#{server} "#{commands}")
127
168
  end
128
169
  end
129
170
  end
130
171
 
131
- def prepare_initial_environment
132
- # We do 2 cd's and a git checkout here because the master
133
- # branch may not always contain the proper rvmrc/Gemfile
134
- # we need when setting up the rest of the deploy
135
- prepare_environment + [
136
- %(git checkout -q -f origin/#{environment}),
137
- %(git reset --hard),
138
- %(cd ../),
139
- %(cd #{deploy_directory})
140
- ]
141
- end
142
-
143
- def prepare_environment
144
- [%(source ~/.rvm/scripts/rvm),
145
- %({ cd #{deploy_directory} > /dev/null; })] # Silence RVM's "Using... gemset..."
172
+ def execute_in_parallel servers
173
+ servers.map do |server|
174
+ Thread.new(server) do |server|
175
+ yield server
176
+ end
177
+ end.map {|thread| thread.join }
146
178
  end
147
179
 
148
180
  def info message
@@ -153,6 +185,5 @@ module ORS
153
185
  info message
154
186
  exit 1
155
187
  end
156
-
157
188
  end
158
189
  end
@@ -1,4 +1,4 @@
1
- module ORS
1
+ class ORS
2
2
 
3
3
  class LogUnifier
4
4
 
@@ -20,7 +20,7 @@ module ORS
20
20
  sort_by {|entry| entry[:timestamp] }.
21
21
  map do |entry|
22
22
  entry[:lines].
23
- map {|line| ["[#{entry[:server]}]".ljust(pretty_adjust + 3), line].join }.
23
+ map {|line| ["[#{entry[:server]}]".ljust(pretty_adjust + 3), line].join.strip }.
24
24
  join "\n"
25
25
  end.
26
26
  flatten.
data/lib/ors/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module ORS
2
- VERSION = "0.2.10"
1
+ class ORS
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,31 +1,34 @@
1
1
  require "spec_helper"
2
2
 
3
- describe ORS::Command do
3
+ describe ORS do
4
4
 
5
- subject { ORS::Command }
5
+ subject { ORS.new }
6
6
 
7
7
  context ".run" do
8
+ before do
9
+ @command = ORS::Commands::Help.new
10
+ mock(ORS::Commands::Help).new { @command }
11
+ mock(@command).setup { "setup" }
12
+ mock(@command).execute { "execute" }
13
+ end
8
14
 
9
15
  it "should execute help when the command is help" do
10
- mock(ORS::Commands::Help).new { mock!.execute.subject }
11
16
  subject.run ["help"]
12
17
  end
13
18
 
14
19
  it "should execute help when no command is given" do
15
- mock(ORS::Commands::Help).new { mock!.execute.subject }
16
20
  subject.run []
17
21
  end
18
22
 
19
23
  it "should execute help when an unknown command is given" do
20
- mock(ORS::Commands::Help).new { mock!.execute.subject }
21
24
  subject.run ["as0d9fja0s9djf"]
22
25
  end
26
+ end
23
27
 
28
+ context ".run with version" do
24
29
  it "should show the version when given version as a command" do
25
- mock(ORS::Command).puts("ORS v#{ORS::VERSION}")
30
+ mock($stdout).puts("ORS v#{ORS::VERSION}")
26
31
  subject.run ["version"]
27
32
  end
28
-
29
33
  end
30
-
31
34
  end
@@ -2,20 +2,28 @@ require "spec_helper"
2
2
 
3
3
  describe ORS::Commands::Base do
4
4
 
5
+ before do
6
+ @command = ORS::Commands::Base.new
7
+ mock(ORS::Commands::Base).new { @command }
8
+ end
9
+
5
10
  context ".run" do
11
+ it "should instantiate the command and call #setup and #execute on it" do
12
+ mock(ORS.config).finalize! {true}
13
+ mock(ORS.config).valid? {true}
14
+ mock(@command).setup.subject
15
+ mock(@command).execute.subject
6
16
 
7
- it "should instantiate the command and call #execute on it" do
8
- klass = mock!.new { mock!.execute.subject }.subject
9
- ORS::Commands::Base.run klass
17
+ ORS::Commands::Base.run
10
18
  end
11
-
12
19
  end
13
20
 
14
- context "#run" do
15
- it "should call the class method" do
16
- mock(ORS::Commands::Base).run("Foo")
17
- subject.run "Foo"
21
+ context ".run_without_setup" do
22
+ it "should not run #setup but run #execute" do
23
+ dont_allow(@command).setup.subject
24
+ mock(@command).execute.subject
25
+
26
+ ORS::Commands::Base.run_without_setup
18
27
  end
19
28
  end
20
-
21
29
  end
@@ -7,9 +7,10 @@ describe ORS::Commands::Deploy do
7
7
  it "should call update, migrate, then restart" do
8
8
  mock(subject).info /deploying/
9
9
 
10
- mock(subject).run(ORS::Commands::Update)
11
- mock(subject).run(ORS::Commands::Migrate)
12
- mock(subject).run(ORS::Commands::Restart)
10
+ mock(ORS::Commands::Update).run_without_setup
11
+ mock(ORS::Commands::Symlink).run_without_setup
12
+ mock(ORS::Commands::Migrate).run_without_setup
13
+ mock(ORS::Commands::Restart).run_without_setup
13
14
 
14
15
  subject.execute
15
16
  end
@@ -4,39 +4,20 @@ describe ORS::Commands::Runner do
4
4
 
5
5
  context "#run" do
6
6
  before do
7
- stub(subject).name {'abc/growhealthy'}
8
- stub(subject).environment {'production'}
7
+ ORS.config[:name] = 'abc/growhealthy'
8
+ ORS.config[:environment] = 'production'
9
9
  end
10
10
 
11
- it "should require --code 'ruby code'" do
12
- lambda {subject.execute}.should raise_error
11
+ it "should require 'ruby code'" do
12
+ lambda {subject.setup; subject.execute}.should raise_error
13
13
  end
14
14
 
15
- it "should require an argument to --code" do
16
- ORS::Config.parse_options %w(--code)
17
- lambda {subject.execute}.should raise_error
18
- end
19
-
20
- it "should require an argument to -c" do
21
- ORS::Config.parse_options %w(--c)
22
- lambda {subject.execute}.should raise_error
23
- end
24
-
25
- it "should require a non-empty argument to --code" do
26
- ORS::Config.parse_options ['--code', ' ']
27
- lambda {subject.execute}.should raise_error
28
- end
29
-
30
- it "should be successful with an argument to --code" do
31
- ORS::Config.parse_options %w(--code true)
15
+ it "should be successful with some 'ruby code'" do
16
+ ORS.config.parse_options ["ruby code"]
32
17
  mock(subject).execute_command(is_a(String), is_a(Array), is_a(String), is_a(Hash)).returns("results")
33
- lambda {subject.execute}.should_not raise_error
34
- end
35
18
 
36
- it "should be successful with an argument to -c" do
37
- ORS::Config.parse_options %w(-c true)
38
- mock(subject).execute_command(is_a(String), is_a(Array), is_a(String), is_a(Hash)).returns("results")
39
- lambda {subject.execute}.should_not raise_error
19
+
20
+ lambda {subject.setup; subject.execute}.should_not raise_error
40
21
  end
41
22
  end
42
23
  end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe ORS::Commands::Timestamps do
4
+
5
+ context "#execute" do
6
+ it "should get restart.timestamp from all of the app servers" do
7
+ ORS.config[:pretending] = false
8
+ ORS.config[:app_servers] = mock!.map { ["server", "timestamp"] }.subject
9
+
10
+ mock($stdout).puts("server\ntimestamp")
11
+
12
+ subject.execute
13
+ end
14
+ end
15
+
16
+ end
@@ -3,10 +3,15 @@ require "spec_helper"
3
3
  describe ORS::Commands::Update do
4
4
 
5
5
  context "#run" do
6
+ before do
7
+ ORS.config.parse_options([])
8
+ ORS.config.parse_config_file
9
+ end
10
+
6
11
  it "should update code, bundle install, and set up cron" do
7
- stub(subject).all_servers { :all_servers }
8
- stub(subject).ruby_servers { :ruby_servers }
9
- stub(subject).cron_server { :cron_server }
12
+ ORS.config[:all_servers] = :all_servers
13
+ ORS.config[:ruby_servers] = :ruby_servers
14
+ ORS.config[:cron_server] = :cron_server
10
15
 
11
16
  mock(subject).info /updating/
12
17
  mock(subject).execute_in_parallel(:all_servers)
@@ -2,98 +2,66 @@ require "spec_helper"
2
2
 
3
3
  describe ORS::Config do
4
4
 
5
- subject { class Foo; include ORS::Config; end; Foo.new }
5
+ subject { ORS::Config.new([]) }
6
6
 
7
7
  context ".parse_options" do
8
- it("should default pretend to false") { subject.pretending.should be_false }
9
- it("should default use_gateway to true") { subject.use_gateway.should be_true }
10
- it("should default rails2 to false") { subject.rails2.should be_false }
8
+ it("should default pretend to false") { subject[:pretending].should be_false }
9
+ it("should default use_gateway to true") { subject[:use_gateway].should be_true }
11
10
 
12
11
  it "should set the environment when it is given" do
13
- ORS::Config.parse_options %w(foobar -p)
14
- subject.environment.should == "foobar"
12
+ subject.parse_options %w(to foobar -p)
13
+ subject[:environment].should == "foobar"
15
14
  end
16
15
 
17
16
  it "should set pretend to true if -p is given" do
18
- ORS::Config.pretending = false
19
- ORS::Config.parse_options %w(-p)
17
+ subject[:pretending] = false
18
+ subject.parse_options %w(-p)
20
19
 
21
- subject.pretending.should be_true
20
+ subject[:pretending].should be_true
22
21
  end
23
22
 
24
23
  it "should set pretend to true if --pretend is given" do
25
- ORS::Config.pretending = false
26
- ORS::Config.parse_options %w(--pretend)
24
+ subject[:pretending] = false
25
+ subject.parse_options %w(--pretend)
27
26
 
28
- subject.pretending.should be_true
27
+ subject[:pretending].should be_true
29
28
  end
30
29
 
31
30
  it "should set use_gateway to false if -ng is given" do
32
- ORS::Config.use_gateway = true
33
- ORS::Config.parse_options %w(-ng)
31
+ subject[:use_gateway] = true
32
+ subject.parse_options %w(-ng)
34
33
 
35
- subject.use_gateway.should be_false
34
+ subject[:use_gateway].should be_false
36
35
  end
37
36
 
38
37
  it "should set use_gateway to false if --no-gateway is given" do
39
- ORS::Config.use_gateway = true
40
- ORS::Config.parse_options %w(--no-gateway)
38
+ subject[:use_gateway] = true
39
+ subject.parse_options %w(--no-gateway)
41
40
 
42
- subject.use_gateway.should be_false
41
+ subject[:use_gateway].should be_false
43
42
  end
44
43
  end
45
44
 
46
- context ".valid_options?" do
45
+ context ".valid?" do
47
46
 
48
- it "should be true when there is a name and valid environment" do
49
- subject.name = "foo"
50
- subject.environment = "production"
47
+ it "should be true when there is a name" do
48
+ mock(subject).name { "foo" }
51
49
 
52
- ORS::Config.valid_options?.should be_true
50
+ subject.valid?.should be_true
53
51
  end
54
52
 
55
- it "should be false when there is a name but an invalid environment" do
56
- subject.name = "foo"
57
- subject.environment = "-p"
53
+ it "should be false when there is a blank name" do
54
+ mock(subject).name { "" }
58
55
 
59
- ORS::Config.valid_options?.should be_false
60
- end
61
-
62
- it "should be false when there is a valid environment but a blank name" do
63
- subject.name = ""
64
- subject.environment = "production"
65
-
66
- ORS::Config.valid_options?.should be_false
56
+ subject.valid?.should be_false
67
57
  end
68
58
 
69
59
  end
70
60
 
71
61
  context "#all_servers" do
72
62
  it "should return all servers" do
73
- subject.all_servers.should == (subject.web_servers + subject.app_servers + [subject.migration_server])
74
- end
75
- end
76
-
77
- context "config permanence" do
78
- before do
79
- class ORS::OtherConfig; include ORS::Config; end
80
- @other_config = ORS::OtherConfig.new
81
-
82
- class ORS::ConfigTest; include ORS::Config; end
83
- @some_config = ORS::ConfigTest.new
84
- end
85
-
86
- %w(use_gateway pretending).each do |accessor|
87
- it "should allow you to set #{accessor}" do
88
- ORS::Config.should respond_to("#{accessor}")
89
- end
90
-
91
- it "should know if its #{accessor} across classes" do
92
- ORS::Config.send("#{accessor}=", true)
93
-
94
- @some_config.send(accessor).should == true
95
- @other_config.send(accessor).should == true
96
- end
63
+ subject.finalize!
64
+ subject[:all_servers].should == (subject[:web_servers] + subject[:app_servers] + [subject[:migration_server]])
97
65
  end
98
66
  end
99
67
 
@@ -105,13 +73,40 @@ describe ORS::Config do
105
73
  "git@github.com:testing/github" => "testing/github",
106
74
  "git@ghub.com:testing/gitlabhq.git" => "testing/gitlabhq",
107
75
  "git@ghub.com:gitlabhq.git" => "gitlabhq",
108
- "git://ghub.com/gitlabhq.git" => "gitlabhq"
76
+ "git://ghub.com/gitlabhq.git" => "gitlabhq",
77
+ "git://ghub.com/level_git.git" => "level_git",
78
+ "git://ghub.com/level-up/two.git" => "level-up/two"
109
79
  }.each do |remote, name|
110
80
  it "should handle a remote origin url such as #{remote}" do
111
- mock(ORS::Config).git { mock!.config { {"remote.origin.url" => remote} }}
112
- ORS::Config.send(:name_from_git).should == name
81
+ stub(subject).git { mock!.config { {"remote.origin.url" => remote} }}
82
+ subject.send(:name).should == name
113
83
  end
114
84
  end
115
85
  end
116
86
 
87
+ context "#remote_from_git" do
88
+ before do
89
+ subject[:remote] = "origin"
90
+ end
91
+
92
+ it "should raise an error if the remote doesn't exist" do
93
+ stub(subject).git { mock!.config { {"remote.oregon.url" => "git://github.com/testing/git.git"} }}
94
+
95
+ lambda { subject.send(:remote_url) }.should raise_error
96
+ end
97
+
98
+ it "should return the remote based on the remote alias (origin)" do
99
+ stub(subject).git { mock!.config { {"remote.origin.url" => "git://github.com/testing/git.git"} }}
100
+
101
+ subject.send(:remote_url).should == "git://github.com/testing/git.git"
102
+ end
103
+
104
+ it "should return the remote based on the remote alias (arbit)" do
105
+ subject[:remote] = "arbit"
106
+ stub(subject).git { mock!.config { {"remote.arbit.url" => "git://github.com/arbit/git.git"} }}
107
+
108
+ subject.send(:remote_url).should == "git://github.com/arbit/git.git"
109
+ end
110
+ end
111
+
117
112
  end