sunshine 1.0.3 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +22 -2
- data/Manifest.txt +7 -0
- data/README.txt +333 -57
- data/Rakefile +1 -1
- data/lib/commands/add.rb +2 -2
- data/lib/commands/default.rb +15 -8
- data/lib/commands/list.rb +5 -3
- data/lib/commands/restart.rb +2 -2
- data/lib/commands/rm.rb +2 -2
- data/lib/commands/run.rb +2 -2
- data/lib/commands/start.rb +2 -2
- data/lib/commands/stop.rb +2 -2
- data/lib/sunshine.rb +117 -132
- data/lib/sunshine/app.rb +116 -10
- data/lib/sunshine/crontab.rb +11 -2
- data/lib/sunshine/daemon.rb +60 -46
- data/lib/sunshine/daemons/apache.rb +10 -2
- data/lib/sunshine/daemons/ar_sendmail.rb +0 -6
- data/lib/sunshine/daemons/delayed_job.rb +2 -0
- data/lib/sunshine/daemons/mongrel_rails.rb +32 -0
- data/lib/sunshine/daemons/nginx.rb +3 -0
- data/lib/sunshine/daemons/rainbows.rb +2 -0
- data/lib/sunshine/daemons/server.rb +51 -24
- data/lib/sunshine/daemons/server_cluster.rb +47 -0
- data/lib/sunshine/daemons/thin.rb +36 -0
- data/lib/sunshine/daemons/unicorn.rb +4 -1
- data/lib/sunshine/dependencies.rb +10 -3
- data/lib/sunshine/healthcheck.rb +2 -2
- data/lib/sunshine/remote_shell.rb +11 -2
- data/lib/sunshine/repo.rb +1 -1
- data/lib/sunshine/repos/rsync_repo.rb +1 -0
- data/templates/apache/apache.conf.erb +25 -18
- data/templates/mongrel_rails/mongrel_rails.conf.erb +9 -0
- data/templates/nginx/nginx.conf.erb +12 -9
- data/templates/thin/thin.conf.erb +12 -0
- data/test/helper_methods.rb +161 -0
- data/test/unit/test_daemon.rb +1 -8
- data/test/unit/test_nginx.rb +1 -1
- data/test/unit/test_server.rb +16 -0
- data/test/unit/test_server_cluster.rb +46 -0
- data/test/unit/test_sunshine.rb +18 -12
- metadata +14 -11
@@ -8,7 +8,7 @@ pid <%= expand_path pid %>;
|
|
8
8
|
error_log <%= expand_path log_file(:stderr) %> info;
|
9
9
|
|
10
10
|
events {
|
11
|
-
worker_connections
|
11
|
+
worker_connections <%= connections %>;
|
12
12
|
<% unless darwin %>
|
13
13
|
use epoll;
|
14
14
|
<% end %>
|
@@ -25,6 +25,7 @@ http {
|
|
25
25
|
client_body_temp_path <%= darwin ? '/var/tmp/nginx' : '/dev/shm' %>;
|
26
26
|
proxy_temp_path <%= darwin ? '/var/tmp/nginx' : '/dev/shm' %>;
|
27
27
|
|
28
|
+
include <%= File.dirname shell.call("which nginx") %>/../conf/mime.types;
|
28
29
|
default_type application/octet-stream;
|
29
30
|
|
30
31
|
log_format sunshine '$remote_addr - $remote_user [$time_local] '
|
@@ -49,11 +50,13 @@ http {
|
|
49
50
|
gzip_proxied any;
|
50
51
|
gzip_types text/plain text/html text/css application/x-javascript application/xml application/xml+rss text/javascript;
|
51
52
|
|
52
|
-
<%
|
53
|
-
upstream
|
54
|
-
|
53
|
+
<% unless App === target -%>
|
54
|
+
upstream <%= proxy_name %> {
|
55
|
+
<% [*target].each do |server| -%>
|
56
|
+
server 0:<%= server.port %> fail_timeout=<%= timeout %>;
|
57
|
+
<% end -%>
|
55
58
|
}
|
56
|
-
<% end
|
59
|
+
<% end -%>
|
57
60
|
|
58
61
|
##
|
59
62
|
# 301 redirect www to non-www host.
|
@@ -82,9 +85,9 @@ http {
|
|
82
85
|
##
|
83
86
|
# Main proxy
|
84
87
|
location / {
|
85
|
-
<% if darwin
|
88
|
+
<% if darwin -%>
|
86
89
|
ssi on;
|
87
|
-
<% end
|
90
|
+
<% end -%>
|
88
91
|
if (-f $request_filename) {
|
89
92
|
break;
|
90
93
|
}
|
@@ -92,9 +95,9 @@ http {
|
|
92
95
|
include <%= expand_path config_path %>/nginx_proxy.conf;
|
93
96
|
expires -1;
|
94
97
|
|
95
|
-
<%
|
98
|
+
<% unless App === target %>
|
96
99
|
if (!-f $request_filename) {
|
97
|
-
proxy_pass http
|
100
|
+
proxy_pass http://<%= proxy_name %>;
|
98
101
|
break;
|
99
102
|
}
|
100
103
|
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
address: 0.0.0.0
|
3
|
+
timeout: <%= timeout %>
|
4
|
+
port: <%= port %>
|
5
|
+
log: <%= expand_path log_file(:stdout) %>
|
6
|
+
max_conns: <%= connections %>
|
7
|
+
require: []
|
8
|
+
|
9
|
+
environment: <%= app.deploy_env %>
|
10
|
+
max_persistent_conns: <%= connections / 2 %>
|
11
|
+
servers: <%= processes %>
|
12
|
+
daemonize: true
|
@@ -0,0 +1,161 @@
|
|
1
|
+
module HelperMethods
|
2
|
+
|
3
|
+
def mock_app
|
4
|
+
Sunshine::App.new(TEST_APP_CONFIG_FILE).extend MockObject
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
def mock_remote_shell host=nil
|
9
|
+
host ||= "user@some_server.com"
|
10
|
+
remote_shell = Sunshine::RemoteShell.new host
|
11
|
+
|
12
|
+
remote_shell.extend MockOpen4
|
13
|
+
remote_shell.extend MockObject
|
14
|
+
|
15
|
+
use_remote_shell remote_shell
|
16
|
+
|
17
|
+
remote_shell.connect
|
18
|
+
remote_shell
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def mock_svn_response url=nil
|
23
|
+
url ||= "svn://subversion/path/to/my_app/trunk"
|
24
|
+
|
25
|
+
svn_response = <<-STR
|
26
|
+
<?xml version="1.0"?>
|
27
|
+
<log>
|
28
|
+
<logentry
|
29
|
+
revision="777">
|
30
|
+
<author>user</author>
|
31
|
+
<date>2010-01-26T01:49:17.372152Z</date>
|
32
|
+
<msg>finished testing server.rb</msg>
|
33
|
+
</logentry>
|
34
|
+
</log>
|
35
|
+
STR
|
36
|
+
|
37
|
+
Sunshine::SvnRepo.extend(MockObject) unless
|
38
|
+
Sunshine::SvnRepo.is_a?(MockObject)
|
39
|
+
|
40
|
+
Sunshine::SvnRepo.mock :svn_log, :return => svn_response
|
41
|
+
Sunshine::SvnRepo.mock :get_svn_url, :return => url
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def mock_remote_shell_popen4
|
46
|
+
Sunshine::RemoteShell.class_eval{ include MockOpen4 }
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def set_mock_response_for obj, code, stream_vals={}, options={}
|
51
|
+
case obj
|
52
|
+
when Sunshine::App then
|
53
|
+
obj.each do |sa|
|
54
|
+
sa.shell.set_mock_response code, stream_vals, options
|
55
|
+
end
|
56
|
+
when Sunshine::ServerApp then
|
57
|
+
obj.shell.set_mock_response code, stream_vals, options
|
58
|
+
when Sunshine::RemoteShell then
|
59
|
+
obj.set_mock_response code, stream_vals, options
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def assert_dep_install dep_name, type=Sunshine::Yum
|
65
|
+
prefered = type rescue nil
|
66
|
+
args = [{:call => @remote_shell, :prefer => prefered}]
|
67
|
+
|
68
|
+
dep = if Sunshine::Dependency === dep_name
|
69
|
+
dep_name
|
70
|
+
else
|
71
|
+
Sunshine.dependencies.get(dep_name, :prefer => prefered)
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
assert dep.method_called?(:install!, :args => args),
|
76
|
+
"Dependency '#{dep_name}' install was not called."
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def assert_not_called *args
|
81
|
+
assert !@remote_shell.method_called?(:call, :args => [*args]),
|
82
|
+
"Command called by #{@remote_shell.host} but should't have:\n #{args[0]}"
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
def assert_server_call *args
|
87
|
+
assert @remote_shell.method_called?(:call, :args => [*args]),
|
88
|
+
"Command was not called by #{@remote_shell.host}:\n #{args[0]}"
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
def assert_bash_script name, cmds, check_value
|
93
|
+
cmds = cmds.map{|cmd| "(#{cmd})" }
|
94
|
+
cmds << "echo true"
|
95
|
+
|
96
|
+
bash = <<-STR
|
97
|
+
#!/bin/bash
|
98
|
+
if [ "$1" == "--no-env" ]; then
|
99
|
+
#{cmds.flatten.join(" && ")}
|
100
|
+
else
|
101
|
+
#{@app.root_path}/env #{@app.root_path}/#{name} --no-env
|
102
|
+
fi
|
103
|
+
STR
|
104
|
+
|
105
|
+
assert_equal bash, check_value
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
def assert_ssh_call expected, ds=@remote_shell, options={}
|
110
|
+
expected = ds.send(:ssh_cmd, expected, options).join(" ")
|
111
|
+
|
112
|
+
error_msg = "No such command in remote_shell log [#{ds.host}]\n#{expected}"
|
113
|
+
error_msg << "\n\n#{ds.cmd_log.select{|c| c =~ /^ssh/}.join("\n\n")}"
|
114
|
+
|
115
|
+
assert ds.cmd_log.include?(expected), error_msg
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
def assert_rsync from, to, ds=@remote_shell, sudo=false
|
120
|
+
received = ds.cmd_log.last
|
121
|
+
|
122
|
+
rsync_path = if sudo
|
123
|
+
path = ds.sudo_cmd('rsync', sudo).join(' ')
|
124
|
+
"--rsync-path='#{ path }' "
|
125
|
+
end
|
126
|
+
|
127
|
+
rsync_cmd = "rsync -azP #{rsync_path}-e \"ssh #{ds.ssh_flags.join(' ')}\""
|
128
|
+
|
129
|
+
error_msg = "No such command in remote_shell log [#{ds.host}]\n#{rsync_cmd}"
|
130
|
+
error_msg << "#{from.inspect} #{to.inspect}"
|
131
|
+
error_msg << "\n\n#{ds.cmd_log.select{|c| c =~ /^rsync/}.join("\n\n")}"
|
132
|
+
|
133
|
+
if Regexp === from
|
134
|
+
found = ds.cmd_log.select do |cmd|
|
135
|
+
|
136
|
+
cmd_from = cmd.split(" ")[-2]
|
137
|
+
cmd_to = cmd.split(" ").last
|
138
|
+
|
139
|
+
cmd_from =~ from && cmd_to == to && cmd.index(rsync_cmd) == 0
|
140
|
+
end
|
141
|
+
|
142
|
+
assert !found.empty?, error_msg
|
143
|
+
else
|
144
|
+
expected = "#{rsync_cmd} #{from} #{to}"
|
145
|
+
assert ds.cmd_log.include?(expected), error_msg
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
|
150
|
+
def use_remote_shell remote_shell
|
151
|
+
@remote_shell = remote_shell
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
def each_remote_shell app=@app
|
156
|
+
app.server_apps.each do |sa|
|
157
|
+
use_remote_shell sa.shell
|
158
|
+
yield(sa.shell) if block_given?
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
data/test/unit/test_daemon.rb
CHANGED
@@ -12,7 +12,7 @@ class TestDaemon < Test::Unit::TestCase
|
|
12
12
|
end
|
13
13
|
|
14
14
|
|
15
|
-
def
|
15
|
+
def test_missing_start_cmd
|
16
16
|
daemon = Sunshine::Daemon.new @app
|
17
17
|
|
18
18
|
begin
|
@@ -21,13 +21,6 @@ class TestDaemon < Test::Unit::TestCase
|
|
21
21
|
rescue Sunshine::CriticalDeployError => e
|
22
22
|
assert_equal "@start_cmd undefined. Can't start daemon", e.message
|
23
23
|
end
|
24
|
-
|
25
|
-
begin
|
26
|
-
daemon.stop_cmd
|
27
|
-
raise "Should have thrown CriticalDeployError but didn't :("
|
28
|
-
rescue Sunshine::CriticalDeployError => e
|
29
|
-
assert_equal "@stop_cmd undefined. Can't stop daemon", e.message
|
30
|
-
end
|
31
24
|
end
|
32
25
|
|
33
26
|
end
|
data/test/unit/test_nginx.rb
CHANGED
@@ -106,6 +106,6 @@ passenger (2.2.4)
|
|
106
106
|
def stop_cmd svr
|
107
107
|
"test -f #{svr.pid} && kill -#{svr.sigkill} $(cat #{svr.pid}) && "+
|
108
108
|
"sleep 1 && rm -f #{svr.pid} || "+
|
109
|
-
"echo '
|
109
|
+
"echo 'Could not kill #{svr.name} pid for #{svr.app.name}';"
|
110
110
|
end
|
111
111
|
end
|
data/test/unit/test_server.rb
CHANGED
@@ -98,6 +98,22 @@ class TestServer < Test::Unit::TestCase
|
|
98
98
|
end
|
99
99
|
|
100
100
|
|
101
|
+
def test_new_cluster
|
102
|
+
cluster = Sunshine::Server.new_cluster 3, @app, :port => 5000
|
103
|
+
|
104
|
+
assert_equal Sunshine::ServerCluster, cluster.class
|
105
|
+
assert Array === cluster
|
106
|
+
assert_equal 3, cluster.length
|
107
|
+
|
108
|
+
cluster.each_with_index do |server, index|
|
109
|
+
port = 5000 + index
|
110
|
+
assert_equal Sunshine::Server, server.class
|
111
|
+
assert_equal port, server.port
|
112
|
+
assert_equal "server.#{port}", server.name
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
|
101
117
|
def test_start
|
102
118
|
server = @rainbows
|
103
119
|
@server_app.shell.mock :file?, :args => [server.config_file_path],
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestServerCluster < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@cluster =
|
7
|
+
Sunshine::ServerCluster.new Sunshine::Unicorn, 3, mock_app, :port => 2000
|
8
|
+
|
9
|
+
@cluster.each{|server| server.extend MockObject }
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def test_initialize
|
14
|
+
name = "someserver.3333"
|
15
|
+
|
16
|
+
cluster =
|
17
|
+
Sunshine::ServerCluster.new Sunshine::Thin, 3, mock_app,
|
18
|
+
:port => 3000, :name => name
|
19
|
+
|
20
|
+
assert_equal Sunshine::ServerCluster, cluster.class
|
21
|
+
assert Array === cluster
|
22
|
+
assert_equal 3, cluster.length
|
23
|
+
|
24
|
+
cluster.each_with_index do |server, index|
|
25
|
+
port = 3000 + index
|
26
|
+
assert_equal Sunshine::Thin, server.class
|
27
|
+
assert_equal port, server.port
|
28
|
+
assert_equal "#{name}.#{port}", server.name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def test_forwarded_methods
|
34
|
+
[:has_setup?, :status, :setup, :start, :stop, :restart].each do |method|
|
35
|
+
@cluster.each do |server|
|
36
|
+
server.mock method, :return => true
|
37
|
+
end
|
38
|
+
|
39
|
+
@cluster.send method
|
40
|
+
|
41
|
+
@cluster.each do |server|
|
42
|
+
assert server.method_called?(method)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/test/unit/test_sunshine.rb
CHANGED
@@ -28,12 +28,13 @@ class TestSunshine < Test::Unit::TestCase
|
|
28
28
|
|
29
29
|
def test_find_command
|
30
30
|
assert !Sunshine.find_command('st')
|
31
|
-
assert_equal
|
32
|
-
assert_equal
|
33
|
-
assert_equal
|
31
|
+
assert_equal Sunshine::StartCommand, Sunshine.find_command('sta')
|
32
|
+
assert_equal Sunshine::StopCommand, Sunshine.find_command('sto')
|
33
|
+
assert_equal Sunshine::AddCommand, Sunshine.find_command('a')
|
34
34
|
|
35
35
|
Sunshine::COMMANDS.each do |cmd|
|
36
|
-
|
36
|
+
const = Sunshine.const_get "#{cmd.capitalize}Command"
|
37
|
+
assert_equal const, Sunshine.find_command(cmd)
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
@@ -44,7 +45,7 @@ class TestSunshine < Test::Unit::TestCase
|
|
44
45
|
|
45
46
|
Sunshine.run %w{run somefile.rb -l debug -e prod --no-trace}
|
46
47
|
|
47
|
-
assert_command Sunshine::RunCommand, [['somefile.rb'], Sunshine.
|
48
|
+
assert_command Sunshine::RunCommand, [['somefile.rb'], Sunshine.config]
|
48
49
|
end
|
49
50
|
|
50
51
|
|
@@ -56,23 +57,28 @@ class TestSunshine < Test::Unit::TestCase
|
|
56
57
|
|
57
58
|
mock_sunshine_command cmd
|
58
59
|
|
59
|
-
|
60
|
+
argv = [name, 'thing1', 'thing2', '-r', 'remoteserver.com']
|
61
|
+
|
62
|
+
Sunshine.run argv
|
60
63
|
|
61
64
|
servers = [Sunshine::RemoteShell.new("remoteserver.com")]
|
62
65
|
|
63
|
-
args = [%w{thing1 thing2}, Sunshine.
|
66
|
+
args = [%w{thing1 thing2}, Sunshine.config]
|
64
67
|
assert_command cmd, args
|
65
68
|
|
66
|
-
assert_equal servers, Sunshine.
|
69
|
+
assert_equal servers, Sunshine.config['servers']
|
70
|
+
|
71
|
+
|
72
|
+
argv = [name, 'thing1', 'thing2', '-v']
|
67
73
|
|
68
|
-
Sunshine.run
|
74
|
+
Sunshine.run argv
|
69
75
|
servers = [Sunshine.shell]
|
70
76
|
|
71
|
-
args = [%w{thing1 thing2}, Sunshine.
|
77
|
+
args = [%w{thing1 thing2}, Sunshine.config]
|
72
78
|
assert_command cmd, args
|
73
79
|
|
74
|
-
assert_equal servers, Sunshine.
|
75
|
-
assert Sunshine.
|
80
|
+
assert_equal servers, Sunshine.config['servers']
|
81
|
+
assert Sunshine.config['verbose']
|
76
82
|
end
|
77
83
|
end
|
78
84
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 1.0.3
|
9
|
+
version: 1.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jeremie Castagna
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-04-02 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -88,12 +88,7 @@ dependencies:
|
|
88
88
|
type: :development
|
89
89
|
version_requirements: *id005
|
90
90
|
description: |-
|
91
|
-
Sunshine is
|
92
|
-
|
93
|
-
Sunshine is open and it can do a lot! It's meant to be dug into and understood.
|
94
|
-
Knowing how it works will let you do really neat things: classes are
|
95
|
-
decoupled as much as possible to allow for optimal flexibility,
|
96
|
-
and most can be used independently.
|
91
|
+
Sunshine is a framework for rack and rails application deployment.
|
97
92
|
|
98
93
|
This gem was made possible by the sponsoring of AT&T Interactive
|
99
94
|
(http://attinteractive.com).
|
@@ -132,9 +127,12 @@ files:
|
|
132
127
|
- lib/sunshine/daemons/apache.rb
|
133
128
|
- lib/sunshine/daemons/ar_sendmail.rb
|
134
129
|
- lib/sunshine/daemons/delayed_job.rb
|
130
|
+
- lib/sunshine/daemons/mongrel_rails.rb
|
135
131
|
- lib/sunshine/daemons/nginx.rb
|
136
132
|
- lib/sunshine/daemons/rainbows.rb
|
137
133
|
- lib/sunshine/daemons/server.rb
|
134
|
+
- lib/sunshine/daemons/server_cluster.rb
|
135
|
+
- lib/sunshine/daemons/thin.rb
|
138
136
|
- lib/sunshine/daemons/unicorn.rb
|
139
137
|
- lib/sunshine/dependencies.rb
|
140
138
|
- lib/sunshine/dependency_lib.rb
|
@@ -154,15 +152,18 @@ files:
|
|
154
152
|
- lib/sunshine/shell.rb
|
155
153
|
- templates/apache/apache.conf.erb
|
156
154
|
- templates/logrotate/logrotate.conf.erb
|
155
|
+
- templates/mongrel_rails/mongrel_rails.conf.erb
|
157
156
|
- templates/nginx/nginx.conf.erb
|
158
157
|
- templates/nginx/nginx_optimize.conf
|
159
158
|
- templates/nginx/nginx_proxy.conf
|
160
159
|
- templates/rainbows/rainbows.conf.erb
|
161
160
|
- templates/sunshine/middleware/health.rb
|
162
161
|
- templates/sunshine/sunshine.rake
|
162
|
+
- templates/thin/thin.conf.erb
|
163
163
|
- templates/unicorn/unicorn.conf.erb
|
164
164
|
- test/fixtures/app_configs/test_app.yml
|
165
165
|
- test/fixtures/sunshine_test/test_upload
|
166
|
+
- test/helper_methods.rb
|
166
167
|
- test/mocks/mock_object.rb
|
167
168
|
- test/mocks/mock_open4.rb
|
168
169
|
- test/test_helper.rb
|
@@ -178,12 +179,13 @@ files:
|
|
178
179
|
- test/unit/test_repo.rb
|
179
180
|
- test/unit/test_server.rb
|
180
181
|
- test/unit/test_server_app.rb
|
182
|
+
- test/unit/test_server_cluster.rb
|
181
183
|
- test/unit/test_shell.rb
|
182
184
|
- test/unit/test_sunshine.rb
|
183
185
|
- test/unit/test_svn_repo.rb
|
184
186
|
- test/unit/test_unicorn.rb
|
185
187
|
has_rdoc: true
|
186
|
-
homepage: http://
|
188
|
+
homepage: http://github.com/yaksnrainbows/sunshine
|
187
189
|
licenses: []
|
188
190
|
|
189
191
|
post_install_message:
|
@@ -212,7 +214,7 @@ rubyforge_project: sunshine
|
|
212
214
|
rubygems_version: 1.3.6
|
213
215
|
signing_key:
|
214
216
|
specification_version: 3
|
215
|
-
summary: Sunshine is
|
217
|
+
summary: Sunshine is a framework for rack and rails application deployment
|
216
218
|
test_files:
|
217
219
|
- test/test_helper.rb
|
218
220
|
- test/unit/test_app.rb
|
@@ -227,6 +229,7 @@ test_files:
|
|
227
229
|
- test/unit/test_repo.rb
|
228
230
|
- test/unit/test_server.rb
|
229
231
|
- test/unit/test_server_app.rb
|
232
|
+
- test/unit/test_server_cluster.rb
|
230
233
|
- test/unit/test_shell.rb
|
231
234
|
- test/unit/test_sunshine.rb
|
232
235
|
- test/unit/test_svn_repo.rb
|