ors 0.2.10 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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