sunshine 1.1.3.pre → 1.2.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.
data/History.txt CHANGED
@@ -1,15 +1,21 @@
1
- === 1.1.3 / 2010-09-07
1
+ === 1.2.0 / 2010-09-08
2
2
 
3
3
  * Improvements:
4
4
 
5
- * Added support for custom env/start/stop/restart scripts.
5
+ * Added better support for custom env/start/stop/restart scripts.
6
+
7
+ * Added scripts sunshine command to call custom scripts remotely.
6
8
 
7
9
  * Deploy env defaults to ENV 'DEPLOY_ENV', 'env', 'RACK_ENV', or 'RAILS_ENV'.
8
10
 
9
11
  * Bugfixes:
10
12
 
13
+ * ServerApp#run_geminstaller no longer defaults to using sudo.
14
+
11
15
  * Added better extensible package manager checking to ServerApp.
12
16
 
17
+ * Fixed Cronjob functionality and added array support.
18
+
13
19
  === 1.1.2 / 2010-04-15
14
20
 
15
21
  * Improvements:
data/Manifest.txt CHANGED
@@ -12,6 +12,7 @@ lib/commands/list.rb
12
12
  lib/commands/restart.rb
13
13
  lib/commands/rm.rb
14
14
  lib/commands/run.rb
15
+ lib/commands/script.rb
15
16
  lib/commands/start.rb
16
17
  lib/commands/stop.rb
17
18
  lib/sunshine.rb
data/README.txt CHANGED
@@ -554,7 +554,8 @@ The Sunshine commands are as follows:
554
554
  list Display deployed apps
555
555
  restart Restart a deployed app
556
556
  rm Unregister an app with sunshine
557
- run Run a Sunshine script
557
+ run Run a Sunshine ruby file
558
+ script Run an app script
558
559
  start Start a deployed app
559
560
  stop Stop a deployed app
560
561
 
@@ -562,6 +563,41 @@ For more help on sunshine commands, use 'sunshine COMMAND --help'.
562
563
  For more information about control scripts, see the
563
564
  Sunshine::App#build_control_scripts method.
564
565
 
566
+ === Remote Scripts and Permissions:
567
+
568
+ Important:
569
+
570
+ Applications are deployed on a per-user basis. When calling
571
+ commands that require superuser permissions (e.g. calling restart on an
572
+ app that runs on Apache, port 80), make sure that the user used to log in
573
+ has sudo permissions.
574
+
575
+ Example:
576
+
577
+ I've deployed an application logged in as 'superuser' but for a
578
+ 'peon' user with a lower permission level using something like:
579
+ Sunshine.setup 'sudo' => 'peon'
580
+ @app = Sunshine::App.new :remote_shells => 'superuser@myserver.com'
581
+
582
+ Using any of the following will fail to return since 'peon' has
583
+ no sudo priviledges:
584
+ $ sunshine restart app -r peon@myserver.com
585
+ $ sunshine restart app -r peon@myserver.com -S
586
+
587
+ Yet, if you only log in as 'superuser' the app will not be found as it will
588
+ be looking for apps deployed and run for 'superuser', hence this is wrong too:
589
+ $ sunshine restart app -r superuser@myserver.com
590
+
591
+ To run the script correctly, use the same setup used for your deploy,
592
+ in this case:
593
+ $ sunshine restart app -r superuser@myserver.com -S peon
594
+
595
+ This is true for the following commands:
596
+ $ sunshine list --status
597
+ $ sunshine restart
598
+ $ sunshine script
599
+ $ sunshine start
600
+ $ sunshine stop
565
601
 
566
602
  == Licence
567
603
 
@@ -101,6 +101,8 @@ Sunshine is an object oriented deploy tool for rack applications.
101
101
  list Display deployed apps
102
102
  restart Restart a deployed app
103
103
  rm Unregister an app with #{opt.program_name}
104
+ run Run a Sunshine ruby file
105
+ script Run an app script
104
106
  start Start a deployed app
105
107
  stop Stop a deployed app
106
108
 
data/lib/commands/list.rb CHANGED
@@ -191,7 +191,7 @@ module Sunshine
191
191
  yield(server_app) if block_given?
192
192
 
193
193
  begin
194
- server_app.send cmd.to_sym
194
+ server_app.run_script cmd
195
195
  server_app.running? ? 'running' : 'down'
196
196
 
197
197
  rescue CmdError => e
@@ -0,0 +1,67 @@
1
+ module Sunshine
2
+
3
+ ##
4
+ # Runs a given script of all specified sunshine apps.
5
+ #
6
+ # Usage: sunshine script script_name [options] app_name [more names...]
7
+ #
8
+ # Arguments:
9
+ # script_name Name of the script to run.
10
+ # app_name Name of the application to run script for.
11
+ #
12
+ # Options:
13
+ # -f, --format FORMAT Set the output format (txt, yml, json)
14
+ # -u, --user USER User to use for remote login. Use with -r.
15
+ # -r, --remote svr1,svr2 Run on one or more remote servers.
16
+ # -v, --verbose Run in verbose mode.
17
+
18
+ class ScriptCommand < ListCommand
19
+
20
+ ##
21
+ # Takes an array and a hash, runs the command and returns:
22
+ # true: success
23
+ # false: failed
24
+ # exitcode:
25
+ # code == 0: success
26
+ # code != 0: failed
27
+ # and optionally an accompanying message.
28
+
29
+ def self.exec names, config
30
+ script_name = names.delete_at(0)
31
+
32
+ output = exec_each_server config do |shell|
33
+ new(shell).script(script_name, names)
34
+ end
35
+
36
+ return output
37
+ end
38
+
39
+
40
+ ##
41
+ # Run specified script for apps.
42
+
43
+ def script name, app_names
44
+ each_app(*app_names) do |server_app|
45
+ server_app.run_script name
46
+ end
47
+ end
48
+
49
+
50
+ ##
51
+ # Parses the argv passed to the command
52
+
53
+ def self.parse_args argv
54
+ parse_remote_args(argv) do |opt, options|
55
+ opt.banner = <<-EOF
56
+
57
+ Usage: #{opt.program_name} script script_name [options] app_name [more names...]
58
+
59
+ Arguments:
60
+ script_name Name of the script to run.
61
+ app_name Name of the application to run script for.
62
+ EOF
63
+ end
64
+ end
65
+ end
66
+ end
67
+
data/lib/sunshine.rb CHANGED
@@ -19,7 +19,7 @@ module Sunshine
19
19
 
20
20
  ##
21
21
  # Sunshine version.
22
- VERSION = '1.1.3.pre'
22
+ VERSION = '1.2.0'
23
23
 
24
24
  ##
25
25
  # Path to the list of installed sunshine apps.
@@ -27,7 +27,7 @@ module Sunshine
27
27
 
28
28
  ##
29
29
  # Commands supported by Sunshine.
30
- COMMANDS = %w{add list restart rm run start stop}
30
+ COMMANDS = %w{add list restart rm run script start stop}
31
31
 
32
32
  ##
33
33
  # File DATA from Sunshine run files.
@@ -48,7 +48,7 @@ module Sunshine
48
48
  'max_deploy_versions' => 5,
49
49
  'remote_checkouts' => false,
50
50
  'timeout' => 300,
51
- 'web_directory' => '/var/www'
51
+ 'web_directory' => '/srv/http'
52
52
  }
53
53
 
54
54
  ##
@@ -413,6 +413,7 @@ module Sunshine
413
413
  require 'commands/run'
414
414
  require 'commands/restart'
415
415
  require 'commands/rm'
416
+ require 'commands/script'
416
417
  require 'commands/start'
417
418
  require 'commands/stop'
418
419
  end
data/lib/sunshine/app.rb CHANGED
@@ -254,6 +254,7 @@ module Sunshine
254
254
  # run App#start.
255
255
 
256
256
  def deploy options=nil
257
+ success = false
257
258
  prev_connection = connected?
258
259
 
259
260
  deploy_trap = Sunshine.add_trap "Reverting deploy of #{@name}" do
@@ -285,9 +286,11 @@ module Sunshine
285
286
  build_crontab
286
287
 
287
288
  register_as_deployed
288
- remove_old_deploys
289
289
 
290
- start :force => true
290
+ success = start :force => true
291
+
292
+ remove_old_deploys
293
+ success &&= deployed?
291
294
  end
292
295
  end
293
296
 
@@ -300,11 +303,13 @@ module Sunshine
300
303
  Sunshine.logger.error '>>', e.backtrace.join("\n")
301
304
  revert! options
302
305
  start options
303
- disconnect options unless prev_connection
304
306
  end
305
307
 
306
308
  ensure
309
+ disconnect options unless prev_connection
307
310
  Sunshine.delete_trap deploy_trap
311
+
312
+ success
308
313
  end
309
314
 
310
315
 
@@ -333,8 +338,25 @@ module Sunshine
333
338
  ##
334
339
  # Add a command to the crontab to be generated remotely:
335
340
  # add_to_crontab "reboot", "@reboot /path/to/app/start", :role => :web
341
+ #
342
+ # Note: This method will append jobs to already existing cron jobs for this
343
+ # application and job name, including previous deploys.
336
344
 
337
345
  def add_to_crontab name, cronjob, options=nil
346
+ with_server_apps options do |server_app|
347
+ server_app.crontab[name] << cronjob
348
+ end
349
+ end
350
+
351
+
352
+ ##
353
+ # Add a command to the crontab to be generated remotely:
354
+ # cronjob "reboot", "@reboot /path/to/app/start", :role => :web
355
+ #
356
+ # Note: This method will override already existing cron jobs for this
357
+ # application and job name, including previous deploys.
358
+
359
+ def cronjob name, cronjob, options=nil
338
360
  with_server_apps options do |server_app|
339
361
  server_app.crontab[name] = cronjob
340
362
  end
@@ -458,7 +480,8 @@ module Sunshine
458
480
  # Check if app has been deployed successfully.
459
481
 
460
482
  def deployed? options=nil
461
- with_server_apps options, :no_threads => true do |server_app|
483
+ with_server_apps options,
484
+ :msg => "Checking deploy", :no_threads => true do |server_app|
462
485
  return false unless server_app.deployed?
463
486
  end
464
487
 
@@ -675,7 +698,7 @@ module Sunshine
675
698
  def run_bundler options=nil
676
699
  with_server_apps options,
677
700
  :msg => "Running Bundler",
678
- :send => :run_bundler
701
+ :send => [:run_bundler, options]
679
702
 
680
703
  rescue => e
681
704
  raise CriticalDeployError, e
@@ -688,7 +711,7 @@ module Sunshine
688
711
  def run_geminstaller options=nil
689
712
  with_server_apps options,
690
713
  :msg => "Running GemInstaller",
691
- :send => :run_geminstaller
714
+ :send => [:run_geminstaller, options]
692
715
 
693
716
  rescue => e
694
717
  raise CriticalDeployError, e
@@ -706,6 +729,18 @@ module Sunshine
706
729
  end
707
730
 
708
731
 
732
+ ##
733
+ # Run the given script of a deployed app on the specified
734
+ # deploy servers.
735
+ # Post-deploy only.
736
+
737
+ def run_script name, options=nil
738
+ with_server_apps options,
739
+ :msg => "Running #{name} script",
740
+ :send => [:run_script, name, options]
741
+ end
742
+
743
+
709
744
  ##
710
745
  # Run a sass task on any or all deploy servers.
711
746
 
@@ -951,7 +986,7 @@ module Sunshine
951
986
  @shared_path = "#{@root_path}/shared"
952
987
  @log_path = "#{@shared_path}/log"
953
988
  @checkout_path = "#{@deploys_path}/#{@deploy_name}"
954
- @scripts_path = "#{@checkout_path}/scripts"
989
+ @scripts_path = "#{@checkout_path}/sunshine_scripts"
955
990
  end
956
991
 
957
992
 
@@ -15,6 +15,24 @@ module Sunshine
15
15
  end
16
16
 
17
17
 
18
+ ##
19
+ # Access the jobs hash. Equivalent to:
20
+ # crontab.jobs[key]
21
+
22
+ def [] key
23
+ self.jobs[key]
24
+ end
25
+
26
+
27
+ ##
28
+ # Set a value in the jobs hash.Equivalent to:
29
+ # crontab.jobs[key] = value
30
+
31
+ def []= key, value
32
+ self.jobs[key] = value
33
+ end
34
+
35
+
18
36
  ##
19
37
  # Get the jobs matching this crontab. Loads them from the crontab
20
38
  # if @jobs hasn't been set yet.
@@ -31,7 +49,10 @@ module Sunshine
31
49
  crontab.strip!
32
50
 
33
51
  jobs.each do |namespace, cron_job|
34
- crontab = delete_jobs crontab, namespace
52
+ cron_job = cron_job.join("\n") if Array === cron_job
53
+ crontab = delete_jobs crontab, namespace
54
+
55
+ next if cron_job.nil? || cron_job.empty?
35
56
 
36
57
  start_id, end_id = get_job_ids namespace
37
58
  cron_str = "\n#{start_id}\n#{cron_job.chomp}\n#{end_id}\n\n"
@@ -85,7 +106,7 @@ module Sunshine
85
106
  # Returns a hash of namespace/jobs pairs.
86
107
 
87
108
  def parse string
88
- jobs = Hash.new
109
+ jobs = Hash.new{|hash, key| hash[key] = Array.new}
89
110
 
90
111
  namespace = nil
91
112
 
@@ -98,12 +119,12 @@ module Sunshine
98
119
  end
99
120
 
100
121
  if namespace
101
- jobs[namespace] ||= String.new
102
- jobs[namespace] << line
122
+ line = line.strip
123
+ jobs[namespace] << line unless line.empty?
103
124
  end
104
125
  end
105
126
 
106
- jobs
127
+ jobs unless jobs.empty?
107
128
  end
108
129
 
109
130
 
@@ -31,11 +31,11 @@ module Sunshine
31
31
  ##
32
32
  # Checks if dependency type is valid for a given shell.
33
33
 
34
- def self.valid? shell=nil
35
- shell ||= Sunshine.shell
36
- shell.call("apt-get --version") && true rescue false
34
+ def self.system_manager? shell=nil
35
+ (shell || Sunshine.shell).syscall "apt-get --version"
37
36
  end
38
37
 
38
+
39
39
  private
40
40
 
41
41
  def build_pkg_name pkg_name, options={}
@@ -70,7 +70,7 @@ module Sunshine
70
70
  # Checks if dependency type is valid for a given shell.
71
71
  # Defaults to false. Override in subclass.
72
72
 
73
- def self.valid? shell=nil
73
+ def self.system_manager? shell=nil
74
74
  false
75
75
  end
76
76
 
@@ -33,9 +33,8 @@ module Sunshine
33
33
  ##
34
34
  # Checks if dependency type is valid for a given shell.
35
35
 
36
- def self.valid? shell=nil
37
- shell ||= Sunshine.shell
38
- shell.call("yum --version") && true rescue false
36
+ def self.system_manager? shell=nil
37
+ (shell || Sunshine.shell).syscall "yum --version"
39
38
  end
40
39
 
41
40
 
@@ -170,7 +170,7 @@ module Sunshine
170
170
  # Checks if the given file exists
171
171
 
172
172
  def file? filepath
173
- call("test -f #{filepath}") && true rescue false
173
+ syscall "test -f #{filepath}"
174
174
  end
175
175
 
176
176
 
@@ -127,6 +127,7 @@ module Sunshine
127
127
  # To add to, or define a control script, see App#add_to_script.
128
128
 
129
129
  def build_control_scripts
130
+ @shell.call "mkdir -p #{self.scripts_path}"
130
131
 
131
132
  write_script "env", make_env_bash_script
132
133
 
@@ -193,7 +194,11 @@ module Sunshine
193
194
  def deploy_details reload=false
194
195
  return @deploy_details if @deploy_details && !reload
195
196
  @deploy_details =
196
- YAML.load @shell.call("cat #{self.current_path}/info") rescue nil
197
+ YAML.load @shell.call("cat #{self.scripts_path}/info") rescue nil
198
+
199
+ @deploy_details = nil unless Hash === @deploy_details
200
+
201
+ @deploy_details
197
202
  end
198
203
 
199
204
 
@@ -338,7 +343,7 @@ fi
338
343
  def pkg_manager
339
344
  @pkg_manager ||=
340
345
  DependencyLib.dependency_types.detect do |dt|
341
- dt.valid? @shell
346
+ dt.system_manager? @shell
342
347
  end
343
348
  end
344
349
 
@@ -412,20 +417,34 @@ fi
412
417
  ##
413
418
  # Runs bundler. Installs the bundler gem if missing.
414
419
 
415
- def run_bundler
420
+ def run_bundler options={}
416
421
  install_deps 'bundler', :type => Gem
417
- @shell.call "cd #{self.checkout_path} && gem bundle"
422
+ @shell.call "cd #{self.checkout_path} && gem bundle", options
418
423
  end
419
424
 
420
425
 
421
426
  ##
422
427
  # Runs geminstaller. :(
423
- # Deprecated: use bundler
428
+ # Deprecated: how about trying bundler or isolate?
429
+ # If sudo is required to install to your GEM_HOME, make sure to
430
+ # pass it as an argument:
431
+ # server_app.run_geminstaller :sudo => true
424
432
 
425
- def run_geminstaller
433
+ def run_geminstaller options={}
426
434
  install_deps 'geminstaller', :type => Gem
427
435
  # Without sudo gems get installed to ~user/.gems
428
- @shell.call "cd #{self.checkout_path} && geminstaller -e", :sudo => true
436
+ @shell.call "cd #{self.checkout_path} && geminstaller -e", options
437
+ end
438
+
439
+
440
+ ##
441
+ # Runs a script from the script_path.
442
+ # Post-deploy only.
443
+
444
+ def run_script name, options=nil, &block
445
+ options ||= {}
446
+ @shell.call \
447
+ File.join(self.scripts_path, name.to_s), options, &block rescue false
429
448
  end
430
449
 
431
450
 
@@ -435,7 +454,7 @@ fi
435
454
 
436
455
  def running?
437
456
  # Permissions are handled by the script, use: :sudo => false
438
- @shell.call "#{self.root_path}/status", :sudo => false rescue false
457
+ run_script :status, :sudo => false
439
458
  end
440
459
 
441
460
 
@@ -476,7 +495,7 @@ fi
476
495
  end
477
496
 
478
497
  # Permissions are handled by the script, use: :sudo => false
479
- @shell.call "#{self.root_path}/start", :sudo => false rescue false
498
+ run_script :start, :sudo => false
480
499
  end
481
500
 
482
501
 
@@ -494,7 +513,7 @@ fi
494
513
 
495
514
  def stop
496
515
  # Permissions are handled by the script, use: :sudo => false
497
- @shell.call "#{self.root_path}/stop", :sudo => false rescue false
516
+ run_script :stop, :sudo => false
498
517
  end
499
518
 
500
519
 
@@ -587,7 +606,7 @@ fi
587
606
  @shared_path = "#{@root_path}/shared"
588
607
  @log_path = "#{@shared_path}/log"
589
608
  @checkout_path = "#{@deploys_path}/#{@deploy_name}"
590
- @scripts_path = "#{@checkout_path}/scripts"
609
+ @scripts_path = "#{@checkout_path}/sunshine_scripts"
591
610
  end
592
611
  end
593
612
  end
@@ -67,7 +67,9 @@ module Sunshine
67
67
  # Execute a command on the local system and return the output.
68
68
 
69
69
  def call cmd, options={}, &block
70
- execute sudo_cmd(cmd, options), &block
70
+ Sunshine.logger.info @host, "Running: #{cmd}" do
71
+ execute sudo_cmd(cmd, options), &block
72
+ end
71
73
  end
72
74
 
73
75
 
@@ -232,6 +234,14 @@ module Sunshine
232
234
  end
233
235
 
234
236
 
237
+ ##
238
+ # Returns true if command was run successfully, otherwise returns false.
239
+
240
+ def syscall cmd, options=nil
241
+ call(cmd, options) && true rescue false
242
+ end
243
+
244
+
235
245
  ##
236
246
  # Checks if timeout occurred.
237
247
 
@@ -1,7 +1,7 @@
1
1
  namespace :sunshine do
2
2
 
3
3
  ##
4
- # If using rails, have rails information available by updating :app task to:
4
+ # If using Rails, have the environment available by updating :app task to:
5
5
  # task :app => :environment do
6
6
  # ...
7
7
  # end
@@ -10,9 +10,11 @@ namespace :sunshine do
10
10
  task :app do
11
11
  require 'sunshine'
12
12
 
13
- deploy_env = ENV['env'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']
14
-
15
- Sunshine.setup 'deploy_env' => ( deploy_env || "development" )
13
+ # By default, Sunshine will deploy with env set from (in order):
14
+ # ENV['DEPLOY_ENV'] || ENV['env'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']
15
+ #
16
+ # If using Rails, you may want to setup Sunshine with the same environment:
17
+ # Sunshine.setup 'deploy_env' => Rails.environment
16
18
 
17
19
 
18
20
  # View the Sunshine README, scripts in the sunshine/examples
@@ -25,6 +27,9 @@ namespace :sunshine do
25
27
  end
26
28
 
27
29
 
30
+ ##
31
+ # Put your deploy-specific logic in the deploy task...
32
+
28
33
  desc "Deploy the app"
29
34
  task :deploy => :app do
30
35
  Sunshine.setup 'trace' => true
@@ -43,6 +48,18 @@ namespace :sunshine do
43
48
  end
44
49
 
45
50
 
51
+ ##
52
+ # Server setup logic that doesn't need to be run on every deploy
53
+ # can be put in the :setup task.
54
+ #
55
+ # Note: By default, Sunshine will attempt to install missing server
56
+ # dependencies that it uses if they are not present (e.g. Nginx, Apache...).
57
+ # If you would like to disable this behavior and handle these dependencies
58
+ # explicitely, add this setup configuration to your :app or :deploy task:
59
+ # Sunshine.setup 'auto_dependencies' => false
60
+ #
61
+ # If you do so, ensure that the dependency bins are available in $PATH.
62
+
46
63
  desc "Sets up deploy servers"
47
64
  task :setup => :app do
48
65
  Sunshine.setup 'trace' => true
@@ -279,7 +279,7 @@ class TestApp < Test::Unit::TestCase
279
279
 
280
280
  def test_deployed?
281
281
  set_mock_response_for @app, 0,
282
- "cat #{@app.current_path}/info" => [:out,
282
+ "cat #{@app.scripts_path}/info" => [:out,
283
283
  "---\n:deploy_name: '#{@app.deploy_name}'"]
284
284
 
285
285
  deployed = @app.deployed?
@@ -37,9 +37,9 @@ job for otherapp
37
37
 
38
38
  def test_parse
39
39
  jobs = @cron.parse @crontab_str
40
- assert_equal "this job should stay\n", jobs['job1']
41
- assert_equal "job2 part 1\njob2 part 2\n", jobs['job2']
42
- assert jobs['blah'].nil?
40
+ assert_equal ["this job should stay"], jobs['job1']
41
+ assert_equal ["job2 part 1","job2 part 2"], jobs['job2']
42
+ assert jobs['blah'].empty?
43
43
  end
44
44
 
45
45
 
@@ -76,6 +76,7 @@ job for otherapp
76
76
  def test_write!
77
77
  @cron.jobs["job2"] << "new job2"
78
78
  @cron.jobs["job3"] = "new job3"
79
+ @cron.jobs["invalid"] = nil
79
80
 
80
81
  @shell.set_mock_response 0, "crontab -l" => [:out, @crontab_str]
81
82
 
@@ -84,6 +85,7 @@ job for otherapp
84
85
  assert_cronjob "job1", "this job should stay"
85
86
  assert_cronjob "job2", "job2 part 1\njob2 part 2\nnew job2"
86
87
  assert_cronjob "job3", "new job3"
88
+ assert_not_cronjob "invalid"
87
89
 
88
90
  assert_cronjob "blah", "otherapp blah job", @othercron
89
91
  assert_cronjob "job1", "job for otherapp", @othercron
@@ -118,10 +120,18 @@ job for otherapp
118
120
  end
119
121
 
120
122
 
123
+ def assert_not_cronjob namespace, crontab=@cron
124
+ job = cronjob(namespace, [], crontab).split("\n")
125
+ assert !@crontab_str.include?(job[0])
126
+ end
127
+
128
+
121
129
  def cronjob namespace, job, crontab
130
+ job = job.join("\n") if Array === job
131
+
122
132
  <<-STR
123
133
  # sunshine #{crontab.name}:#{namespace}:begin
124
- #{job}
134
+ #{ job }
125
135
  # sunshine #{crontab.name}:#{namespace}:end
126
136
  STR
127
137
  end
@@ -119,7 +119,7 @@ class TestServerApp < Test::Unit::TestCase
119
119
  deploy_details = {:item => "thing"}
120
120
  other_details = {:key => "value"}
121
121
 
122
- @sa.shell.mock :call, :args => ["cat #{@sa.current_path}/info"],
122
+ @sa.shell.mock :call, :args => ["cat #{@sa.scripts_path}/info"],
123
123
  :return => other_details.to_yaml
124
124
 
125
125
  @sa.instance_variable_set "@deploy_details", deploy_details
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunshine
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: true
4
+ hash: 31
5
+ prerelease: false
5
6
  segments:
6
7
  - 1
7
- - 1
8
- - 3
9
- - pre
10
- version: 1.1.3.pre
8
+ - 2
9
+ - 0
10
+ version: 1.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jeremie Castagna
@@ -15,16 +15,18 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-07 00:00:00 -07:00
18
+ date: 2010-09-09 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: open4
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
25
26
  requirements:
26
27
  - - ">="
27
28
  - !ruby/object:Gem::Version
29
+ hash: 21
28
30
  segments:
29
31
  - 1
30
32
  - 0
@@ -36,9 +38,11 @@ dependencies:
36
38
  name: rainbow
37
39
  prerelease: false
38
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
39
42
  requirements:
40
43
  - - ">="
41
44
  - !ruby/object:Gem::Version
45
+ hash: 31
42
46
  segments:
43
47
  - 1
44
48
  - 0
@@ -50,9 +54,11 @@ dependencies:
50
54
  name: highline
51
55
  prerelease: false
52
56
  requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
53
58
  requirements:
54
59
  - - ">="
55
60
  - !ruby/object:Gem::Version
61
+ hash: 1
56
62
  segments:
57
63
  - 1
58
64
  - 5
@@ -64,9 +70,11 @@ dependencies:
64
70
  name: json
65
71
  prerelease: false
66
72
  requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
67
74
  requirements:
68
75
  - - ">="
69
76
  - !ruby/object:Gem::Version
77
+ hash: 31
70
78
  segments:
71
79
  - 1
72
80
  - 2
@@ -75,19 +83,37 @@ dependencies:
75
83
  type: :runtime
76
84
  version_requirements: *id004
77
85
  - !ruby/object:Gem::Dependency
78
- name: hoe
86
+ name: rubyforge
79
87
  prerelease: false
80
88
  requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
81
90
  requirements:
82
91
  - - ">="
83
92
  - !ruby/object:Gem::Version
93
+ hash: 7
84
94
  segments:
85
95
  - 2
86
- - 3
87
- - 3
88
- version: 2.3.3
96
+ - 0
97
+ - 4
98
+ version: 2.0.4
89
99
  type: :development
90
100
  version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ name: hoe
103
+ prerelease: false
104
+ requirement: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ hash: 21
110
+ segments:
111
+ - 2
112
+ - 6
113
+ - 1
114
+ version: 2.6.1
115
+ type: :development
116
+ version_requirements: *id006
91
117
  description: |-
92
118
  Sunshine is a framework for rack and rails application deployment.
93
119
 
@@ -118,6 +144,7 @@ files:
118
144
  - lib/commands/restart.rb
119
145
  - lib/commands/rm.rb
120
146
  - lib/commands/run.rb
147
+ - lib/commands/script.rb
121
148
  - lib/commands/start.rb
122
149
  - lib/commands/stop.rb
123
150
  - lib/sunshine.rb
@@ -195,25 +222,27 @@ rdoc_options:
195
222
  require_paths:
196
223
  - lib
197
224
  required_ruby_version: !ruby/object:Gem::Requirement
225
+ none: false
198
226
  requirements:
199
227
  - - ">="
200
228
  - !ruby/object:Gem::Version
229
+ hash: 3
201
230
  segments:
202
231
  - 0
203
232
  version: "0"
204
233
  required_rubygems_version: !ruby/object:Gem::Requirement
234
+ none: false
205
235
  requirements:
206
- - - ">"
236
+ - - ">="
207
237
  - !ruby/object:Gem::Version
238
+ hash: 3
208
239
  segments:
209
- - 1
210
- - 3
211
- - 1
212
- version: 1.3.1
240
+ - 0
241
+ version: "0"
213
242
  requirements: []
214
243
 
215
244
  rubyforge_project: sunshine
216
- rubygems_version: 1.3.6
245
+ rubygems_version: 1.3.7
217
246
  signing_key:
218
247
  specification_version: 3
219
248
  summary: Sunshine is a framework for rack and rails application deployment