deployml 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +3 -0
- data/.rspec +1 -0
- data/.yardopts +1 -0
- data/ChangeLog.md +22 -0
- data/LICENSE.txt +22 -0
- data/README.md +107 -0
- data/Rakefile +35 -0
- data/bin/deployml +5 -0
- data/deployml.gemspec +10 -0
- data/gemspec.yml +21 -0
- data/lib/deployml/cli.rb +192 -0
- data/lib/deployml/configuration.rb +149 -0
- data/lib/deployml/environment.rb +273 -0
- data/lib/deployml/exceptions/config_not_found.rb +4 -0
- data/lib/deployml/exceptions/invalid_config.rb +4 -0
- data/lib/deployml/exceptions/missing_option.rb +6 -0
- data/lib/deployml/exceptions/unknown_environment.rb +4 -0
- data/lib/deployml/exceptions/unknown_framework.rb +6 -0
- data/lib/deployml/exceptions/unknown_server.rb +6 -0
- data/lib/deployml/frameworks/rails2.rb +9 -0
- data/lib/deployml/frameworks/rails3.rb +20 -0
- data/lib/deployml/frameworks.rb +2 -0
- data/lib/deployml/local_shell.rb +54 -0
- data/lib/deployml/options/mongrel.rb +46 -0
- data/lib/deployml/options/thin.rb +72 -0
- data/lib/deployml/options.rb +1 -0
- data/lib/deployml/project.rb +304 -0
- data/lib/deployml/remote_shell.rb +130 -0
- data/lib/deployml/servers/apache.rb +19 -0
- data/lib/deployml/servers/mongrel.rb +41 -0
- data/lib/deployml/servers/thin.rb +41 -0
- data/lib/deployml/servers.rb +3 -0
- data/lib/deployml/shell.rb +46 -0
- data/lib/deployml/version.rb +4 -0
- data/lib/deployml.rb +2 -0
- data/spec/configuration_spec.rb +73 -0
- data/spec/deployml_spec.rb +11 -0
- data/spec/environment_spec.rb +34 -0
- data/spec/helpers/projects/bad_config/config/deploy.yml +1 -0
- data/spec/helpers/projects/basic/config/deploy.yml +3 -0
- data/spec/helpers/projects/invalid_server/config/deploy.yml +4 -0
- data/spec/helpers/projects/missing_config/.gitkeep +0 -0
- data/spec/helpers/projects/missing_dest/config/deploy.yml +2 -0
- data/spec/helpers/projects/missing_source/config/deploy.yml +2 -0
- data/spec/helpers/projects/rails/config/deploy/production.yml +10 -0
- data/spec/helpers/projects/rails/config/deploy/staging.yml +10 -0
- data/spec/helpers/projects/rails/config/deploy.yml +3 -0
- data/spec/helpers/projects.rb +11 -0
- data/spec/project_spec.rb +66 -0
- data/spec/spec_helper.rb +8 -0
- metadata +207 -0
@@ -0,0 +1,304 @@
|
|
1
|
+
require 'deployml/exceptions/config_not_found'
|
2
|
+
require 'deployml/exceptions/invalid_config'
|
3
|
+
require 'deployml/exceptions/unknown_environment'
|
4
|
+
require 'deployml/environment'
|
5
|
+
require 'deployml/remote_shell'
|
6
|
+
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
module DeploYML
|
10
|
+
class Project
|
11
|
+
|
12
|
+
# The general configuration directory.
|
13
|
+
CONFIG_DIR = 'config'
|
14
|
+
|
15
|
+
# The configuration file name.
|
16
|
+
CONFIG_FILE = 'deploy.yml'
|
17
|
+
|
18
|
+
# The configuration directory.
|
19
|
+
ENVIRONMENTS_DIR = 'deploy'
|
20
|
+
|
21
|
+
# The name of the directory to stage deployments in.
|
22
|
+
STAGING_DIR = '.deploy'
|
23
|
+
|
24
|
+
# The root directory of the project
|
25
|
+
attr_reader :root
|
26
|
+
|
27
|
+
# The deployment environments of the project
|
28
|
+
attr_reader :environments
|
29
|
+
|
30
|
+
#
|
31
|
+
# Creates a new project using the given configuration file.
|
32
|
+
#
|
33
|
+
# @param [String] root
|
34
|
+
# The root directory of the project.
|
35
|
+
#
|
36
|
+
# @raise [ConfigNotFound]
|
37
|
+
# The configuration file for the project could not be found
|
38
|
+
# in any of the common directories.
|
39
|
+
#
|
40
|
+
def initialize(root)
|
41
|
+
@root = File.expand_path(root)
|
42
|
+
@config_file = File.join(@root,CONFIG_DIR,CONFIG_FILE)
|
43
|
+
@environments_dir = File.join(@root,CONFIG_DIR,ENVIRONMENTS_DIR)
|
44
|
+
|
45
|
+
unless (File.file?(@config_file) || File.directory?(@environments_dir))
|
46
|
+
raise(ConfigNotFound,"could not find '#{CONFIG_FILE}' or '#{ENVIRONMENTS_DIR}' in #{root}")
|
47
|
+
end
|
48
|
+
|
49
|
+
load_environments!
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# @param [Symbol, String] name
|
54
|
+
# The name of the environment to use.
|
55
|
+
#
|
56
|
+
# @return [Environment]
|
57
|
+
# The environment with the given name.
|
58
|
+
#
|
59
|
+
# @raise [UnknownEnvironment]
|
60
|
+
# No environment was configured with the given name.
|
61
|
+
#
|
62
|
+
# @since 0.3.0
|
63
|
+
#
|
64
|
+
def environment(name=:production)
|
65
|
+
name = name.to_sym
|
66
|
+
|
67
|
+
unless @environments[name]
|
68
|
+
raise(UnknownEnvironment,"unknown environment: #{name}")
|
69
|
+
end
|
70
|
+
|
71
|
+
return @environments[name]
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# Conveniance method for accessing the development environment.
|
76
|
+
#
|
77
|
+
# @return [Environment]
|
78
|
+
# The development environment.
|
79
|
+
#
|
80
|
+
# @since 0.3.0
|
81
|
+
#
|
82
|
+
def development
|
83
|
+
environment(:development)
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# Conveniance method for accessing the staging environment.
|
88
|
+
#
|
89
|
+
# @return [Environment]
|
90
|
+
# The staging environment.
|
91
|
+
#
|
92
|
+
# @since 0.3.0
|
93
|
+
#
|
94
|
+
def staging
|
95
|
+
environment(:staging)
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Conveniance method for accessing the production environment.
|
100
|
+
#
|
101
|
+
# @return [Environment]
|
102
|
+
# The production environment.
|
103
|
+
#
|
104
|
+
# @since 0.3.0
|
105
|
+
#
|
106
|
+
def production
|
107
|
+
environment(:production)
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Deploys the project.
|
112
|
+
#
|
113
|
+
# @param [Array<Symbol>] tasks
|
114
|
+
# The tasks to run during the deployment.
|
115
|
+
#
|
116
|
+
# @param [Symbol, String] env
|
117
|
+
# The environment to deploy to.
|
118
|
+
#
|
119
|
+
# @return [true]
|
120
|
+
#
|
121
|
+
# @since 0.2.0
|
122
|
+
#
|
123
|
+
def invoke(tasks,env=:production)
|
124
|
+
env = environment(env)
|
125
|
+
|
126
|
+
env.remote_shell do |shell|
|
127
|
+
# setup the deployment repository
|
128
|
+
env.setup(shell) if tasks.include?(:setup)
|
129
|
+
|
130
|
+
# cd into the deployment repository
|
131
|
+
shell.cd env.dest.path
|
132
|
+
|
133
|
+
# update the deployment repository
|
134
|
+
env.update(shell) if tasks.include?(:update)
|
135
|
+
|
136
|
+
# framework tasks
|
137
|
+
env.install(shell) if tasks.include?(:install)
|
138
|
+
env.migrate(shell) if tasks.include?(:migrate)
|
139
|
+
|
140
|
+
# server tasks
|
141
|
+
if tasks.include?(:config)
|
142
|
+
env.server_config(shell)
|
143
|
+
elsif tasks.include?(:start)
|
144
|
+
env.server_start(shell)
|
145
|
+
elsif tasks.include?(:stop)
|
146
|
+
env.server_stop(shell)
|
147
|
+
elsif tasks.include?(:restart)
|
148
|
+
env.server_restart(shell)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
return true
|
153
|
+
end
|
154
|
+
|
155
|
+
#
|
156
|
+
# Sets up the deployment repository for the project.
|
157
|
+
#
|
158
|
+
# @param [Symbol, String] env
|
159
|
+
# The environment to deploy to.
|
160
|
+
#
|
161
|
+
def setup!(env=:production)
|
162
|
+
invoke [:setup], env
|
163
|
+
end
|
164
|
+
|
165
|
+
#
|
166
|
+
# Updates the deployed repository of the project.
|
167
|
+
#
|
168
|
+
# @param [Symbol, String] env
|
169
|
+
# The environment to deploy to.
|
170
|
+
#
|
171
|
+
def update!(env=:production)
|
172
|
+
invoke [:update], env
|
173
|
+
end
|
174
|
+
|
175
|
+
#
|
176
|
+
# Installs the project on the destination server.
|
177
|
+
#
|
178
|
+
# @param [Symbol, String] env
|
179
|
+
# The environment to deploy to.
|
180
|
+
#
|
181
|
+
def install!(env=:production)
|
182
|
+
invoke [:install], env
|
183
|
+
end
|
184
|
+
|
185
|
+
#
|
186
|
+
# Migrates the database used by the project.
|
187
|
+
#
|
188
|
+
# @param [Symbol, String] env
|
189
|
+
# The environment to deploy to.
|
190
|
+
#
|
191
|
+
def migrate!(env=:production)
|
192
|
+
invoke [:migrate], env
|
193
|
+
end
|
194
|
+
|
195
|
+
#
|
196
|
+
# Configures the Web server to be ran on the destination server.
|
197
|
+
#
|
198
|
+
# @param [Symbol, String] env
|
199
|
+
# The environment to deploy to.
|
200
|
+
#
|
201
|
+
def config!(env=:production)
|
202
|
+
invoke [:config], env
|
203
|
+
end
|
204
|
+
|
205
|
+
#
|
206
|
+
# Starts the Web server for the project.
|
207
|
+
#
|
208
|
+
# @param [Symbol, String] env
|
209
|
+
# The environment to deploy to.
|
210
|
+
#
|
211
|
+
def start!(env=:production)
|
212
|
+
invoke [:start], env
|
213
|
+
end
|
214
|
+
|
215
|
+
#
|
216
|
+
# Stops the Web server for the project.
|
217
|
+
#
|
218
|
+
# @param [Symbol, String] env
|
219
|
+
# The environment to deploy to.
|
220
|
+
#
|
221
|
+
def stop!(env=:production)
|
222
|
+
invoke [:stop], env
|
223
|
+
end
|
224
|
+
|
225
|
+
#
|
226
|
+
# Restarts the Web server for the project.
|
227
|
+
#
|
228
|
+
# @param [Symbol, String] env
|
229
|
+
# The environment to deploy to.
|
230
|
+
#
|
231
|
+
def restart!(env=:production)
|
232
|
+
invoke [:restart], env
|
233
|
+
end
|
234
|
+
|
235
|
+
#
|
236
|
+
# Deploys a new project.
|
237
|
+
#
|
238
|
+
# @param [Symbol, String] env
|
239
|
+
# The environment to deploy to.
|
240
|
+
#
|
241
|
+
# @since 0.2.0
|
242
|
+
#
|
243
|
+
def deploy!(env=:production)
|
244
|
+
invoke [:setup, :install, :migrate, :config, :start], env
|
245
|
+
end
|
246
|
+
|
247
|
+
#
|
248
|
+
# Redeploys a project.
|
249
|
+
#
|
250
|
+
# @param [Symbol, String] env
|
251
|
+
# The environment to deploy to.
|
252
|
+
#
|
253
|
+
# @since 0.2.0
|
254
|
+
#
|
255
|
+
def redeploy!(env=:production)
|
256
|
+
invoke [:update, :install, :migrate, :restart], env
|
257
|
+
end
|
258
|
+
|
259
|
+
protected
|
260
|
+
|
261
|
+
#
|
262
|
+
# Loads the project configuration.
|
263
|
+
#
|
264
|
+
# @raise [InvalidConfig]
|
265
|
+
# The YAML configuration file did not contain a Hash.
|
266
|
+
#
|
267
|
+
# @raise [MissingOption]
|
268
|
+
# The `source` or `dest` options were not specified.
|
269
|
+
#
|
270
|
+
# @since 0.3.0
|
271
|
+
#
|
272
|
+
def load_environments!
|
273
|
+
base_config = {}
|
274
|
+
|
275
|
+
load_config_data = lambda { |path|
|
276
|
+
config_data = YAML.load_file(path)
|
277
|
+
|
278
|
+
unless config_data.kind_of?(Hash)
|
279
|
+
raise(InvalidConfig,"DeploYML file '#{path}' does not contain a Hash")
|
280
|
+
end
|
281
|
+
|
282
|
+
config_data
|
283
|
+
}
|
284
|
+
|
285
|
+
if File.file?(@config_file)
|
286
|
+
base_config.merge!(load_config_data[@config_file])
|
287
|
+
end
|
288
|
+
|
289
|
+
@environments = {}
|
290
|
+
|
291
|
+
if File.directory?(@environments_dir)
|
292
|
+
Dir.glob(File.join(@environments_dir,'*.yml')) do |path|
|
293
|
+
config_data = base_config.merge(load_config_data[path])
|
294
|
+
name = File.basename(path).sub(/\.yml$/,'').to_sym
|
295
|
+
|
296
|
+
@environments[name] = Environment.new(name,config_data)
|
297
|
+
end
|
298
|
+
else
|
299
|
+
@environments[:production] = Environment.new(:production,base_config)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
end
|
304
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'deployml/shell'
|
2
|
+
|
3
|
+
module DeploYML
|
4
|
+
class RemoteShell
|
5
|
+
|
6
|
+
include Shell
|
7
|
+
|
8
|
+
#
|
9
|
+
# Initializes a remote shell session.
|
10
|
+
#
|
11
|
+
# @param [Addressable::URI, String] uri
|
12
|
+
# The URI of the host to connect to.
|
13
|
+
#
|
14
|
+
# @yield [session]
|
15
|
+
# If a block is given, it will be passed the new remote shell session.
|
16
|
+
#
|
17
|
+
# @yieldparam [ShellSession] session
|
18
|
+
# The remote shell session.
|
19
|
+
#
|
20
|
+
def initialize(uri,&block)
|
21
|
+
case uri
|
22
|
+
when Addressable::URI
|
23
|
+
@uri = uri
|
24
|
+
else
|
25
|
+
@uri = Addressable::URI.parse(uri.to_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
@history = []
|
29
|
+
|
30
|
+
super(&block)
|
31
|
+
|
32
|
+
replay if block
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Enqueues a program to be ran in the session.
|
37
|
+
#
|
38
|
+
# @param [String] program
|
39
|
+
# The name or path of the program to run.
|
40
|
+
#
|
41
|
+
# @param [Array<String>] args
|
42
|
+
# Additional arguments for the program.
|
43
|
+
#
|
44
|
+
def run(program,*args)
|
45
|
+
@history << [program, *args]
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Enqueues an `echo` command to be ran in the session.
|
50
|
+
#
|
51
|
+
# @param [String] message
|
52
|
+
# The message to echo.
|
53
|
+
#
|
54
|
+
def each(message)
|
55
|
+
run 'echo', message
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# Enqueues a directory change for the session.
|
60
|
+
#
|
61
|
+
# @param [String] path
|
62
|
+
# The path of the new current working directory to use.
|
63
|
+
#
|
64
|
+
# @yield []
|
65
|
+
# If a block is given, then the directory will be changed back after
|
66
|
+
# the block has returned.
|
67
|
+
#
|
68
|
+
def cd(path,&block)
|
69
|
+
@history << ['cd', path]
|
70
|
+
|
71
|
+
if block
|
72
|
+
block.call() if block
|
73
|
+
|
74
|
+
@history << ['cd', '-']
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
#
|
79
|
+
# Joins the command history together with ` && `, to form a
|
80
|
+
# single command.
|
81
|
+
#
|
82
|
+
# @return [String]
|
83
|
+
# A single command string.
|
84
|
+
#
|
85
|
+
def join
|
86
|
+
@history.map { |command| command.join(' ') }.join(' && ')
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Converts the URI to one compatible with SSH.
|
91
|
+
#
|
92
|
+
# @return [String]
|
93
|
+
# The SSH compatible URI.
|
94
|
+
#
|
95
|
+
def ssh_uri
|
96
|
+
new_uri = @uri.host
|
97
|
+
new_uri = "#{@uri.user}@#{new_uri}" if @uri.user
|
98
|
+
|
99
|
+
return new_uri
|
100
|
+
end
|
101
|
+
|
102
|
+
#
|
103
|
+
# Starts a SSH session with the destination server.
|
104
|
+
#
|
105
|
+
# @param [Array] args
|
106
|
+
# Additional arguments to pass to SSH.
|
107
|
+
#
|
108
|
+
def ssh(*args)
|
109
|
+
options = []
|
110
|
+
|
111
|
+
# Add the -p option if an alternate destination port is given
|
112
|
+
if @uri.port
|
113
|
+
options += ['-p', @uri.port.to_s]
|
114
|
+
end
|
115
|
+
|
116
|
+
options << ssh_uri
|
117
|
+
options += args
|
118
|
+
|
119
|
+
return system('ssh',*options)
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Replays the command history on the remote server.
|
124
|
+
#
|
125
|
+
def replay
|
126
|
+
ssh(self.join) unless @history.empty?
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'deployml/exceptions/invalid_config'
|
2
|
+
|
3
|
+
module DeploYML
|
4
|
+
module Servers
|
5
|
+
module Apache
|
6
|
+
def server_start(shell)
|
7
|
+
shell.run 'apachectl', 'start'
|
8
|
+
end
|
9
|
+
|
10
|
+
def server_restart(shell)
|
11
|
+
shell.run 'apachectl', 'restart'
|
12
|
+
end
|
13
|
+
|
14
|
+
def server_stop(shell)
|
15
|
+
shell.run 'apachectl', 'stop'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'deployml/exceptions/missing_option'
|
2
|
+
require 'deployml/options/mongrel'
|
3
|
+
|
4
|
+
module DeploYML
|
5
|
+
module Servers
|
6
|
+
module Mongrel
|
7
|
+
def initialize_server
|
8
|
+
@mongrel = Options::Mongrel.new(@server_options)
|
9
|
+
@mongrel.environment ||= @name
|
10
|
+
end
|
11
|
+
|
12
|
+
def mongrel_cluster(shell,*args)
|
13
|
+
options = args + ['-c', @mongrel.config]
|
14
|
+
|
15
|
+
shell.run 'mongrel_rails', *options
|
16
|
+
end
|
17
|
+
|
18
|
+
def server_config(shell)
|
19
|
+
unless @mongrel.config
|
20
|
+
raise(MissingOption,"No 'config' option specified under server options",caller)
|
21
|
+
end
|
22
|
+
|
23
|
+
options = ['-c', dest.path] + @mongrel.arguments
|
24
|
+
|
25
|
+
shell.run 'mongrel_rails', 'cluster::configure', *options
|
26
|
+
end
|
27
|
+
|
28
|
+
def server_start(shell)
|
29
|
+
mongrel_cluster 'cluster::start'
|
30
|
+
end
|
31
|
+
|
32
|
+
def server_stop(shell)
|
33
|
+
mongrel_cluster 'cluster::stop'
|
34
|
+
end
|
35
|
+
|
36
|
+
def server_restart(shell)
|
37
|
+
mongrel_cluster 'cluster::restart'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'deployml/exceptions/missing_option'
|
2
|
+
require 'deployml/options/thin'
|
3
|
+
|
4
|
+
module DeploYML
|
5
|
+
module Servers
|
6
|
+
module Thin
|
7
|
+
def initialize_server
|
8
|
+
@thin = Options::Thin.new(@server_options)
|
9
|
+
@thin.environment ||= @name
|
10
|
+
end
|
11
|
+
|
12
|
+
def thin(shell,*args)
|
13
|
+
options = args + ['-C', @thin.config, '-s', @thin.servers]
|
14
|
+
|
15
|
+
shell.run 'thin', *options
|
16
|
+
end
|
17
|
+
|
18
|
+
def server_config(shell)
|
19
|
+
unless @thin.config
|
20
|
+
raise(MissingOption,"No 'config' option specified under the server options",caller)
|
21
|
+
end
|
22
|
+
|
23
|
+
options = ['-c', dest.path] + @thin.arguments
|
24
|
+
|
25
|
+
shell.run 'thin', 'config', *options
|
26
|
+
end
|
27
|
+
|
28
|
+
def server_start(shell)
|
29
|
+
thin shell, 'start'
|
30
|
+
end
|
31
|
+
|
32
|
+
def server_stop(shell)
|
33
|
+
thin shell, 'stop'
|
34
|
+
end
|
35
|
+
|
36
|
+
def server_restart(shell)
|
37
|
+
thin shell, 'restart'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module DeploYML
|
2
|
+
module Shell
|
3
|
+
|
4
|
+
def initialize(&block)
|
5
|
+
block.call(self) if block
|
6
|
+
end
|
7
|
+
|
8
|
+
#
|
9
|
+
# Place-holder method.
|
10
|
+
#
|
11
|
+
# @param [String] program
|
12
|
+
# The name or path of the program to run.
|
13
|
+
#
|
14
|
+
# @param [Array<String>] args
|
15
|
+
# Additional arguments for the program.
|
16
|
+
#
|
17
|
+
def run(program,*args)
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Executes a Rake task.
|
22
|
+
#
|
23
|
+
# @param [Symbol, String] task
|
24
|
+
# Name of the Rake task to run.
|
25
|
+
#
|
26
|
+
# @param [Array<String>] args
|
27
|
+
# Additional arguments for the Rake task.
|
28
|
+
#
|
29
|
+
def rake(task,*args)
|
30
|
+
run 'rake', rake_task(task,*args)
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def rake_task(name,*args)
|
36
|
+
name = name.to_s
|
37
|
+
|
38
|
+
unless args.empty?
|
39
|
+
name += ('[' + args.join(',') + ']')
|
40
|
+
end
|
41
|
+
|
42
|
+
return name
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
data/lib/deployml.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'deployml/configuration'
|
4
|
+
|
5
|
+
describe Configuration do
|
6
|
+
it "should accept String keys" do
|
7
|
+
config = Configuration.new('orm' => :datamapper)
|
8
|
+
|
9
|
+
config.orm.should == :datamapper
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should accept Symbol keys" do
|
13
|
+
config = Configuration.new(:orm => :datamapper)
|
14
|
+
|
15
|
+
config.orm.should == :datamapper
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should parse 'dest' String URIs" do
|
19
|
+
config = Configuration.new(
|
20
|
+
:dest => 'ssh://user@www.example.com/srv/project'
|
21
|
+
)
|
22
|
+
|
23
|
+
config.dest.scheme.should == 'ssh'
|
24
|
+
config.dest.user.should == 'user'
|
25
|
+
config.dest.host.should == 'www.example.com'
|
26
|
+
config.dest.path.should == '/srv/project'
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should parse 'dest' Hash URIs" do
|
30
|
+
config = Configuration.new(:dest => {
|
31
|
+
'scheme' => 'ssh',
|
32
|
+
'user' => 'user',
|
33
|
+
'host' => 'www.example.com',
|
34
|
+
'path' => '/srv/project'
|
35
|
+
})
|
36
|
+
|
37
|
+
config.dest.scheme.should == 'ssh'
|
38
|
+
config.dest.user.should == 'user'
|
39
|
+
config.dest.host.should == 'www.example.com'
|
40
|
+
config.dest.path.should == '/srv/project'
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should default the 'debug' option to false" do
|
44
|
+
config = Configuration.new
|
45
|
+
|
46
|
+
config.debug.should == false
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should default the environment to nil" do
|
50
|
+
config = Configuration.new
|
51
|
+
|
52
|
+
config.environment.should be_nil
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should accept a Symbol for the 'server' option" do
|
56
|
+
config = Configuration.new(:server => :thin)
|
57
|
+
|
58
|
+
config.server_name.should == :thin
|
59
|
+
config.server_options.should be_empty
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should accept a Hash for the 'server' option" do
|
63
|
+
config = Configuration.new(
|
64
|
+
:server => {
|
65
|
+
:name => :thin,
|
66
|
+
:options => {:address => '127.0.0.1'}
|
67
|
+
}
|
68
|
+
)
|
69
|
+
|
70
|
+
config.server_name.should == :thin
|
71
|
+
config.server_options.should == {:address => '127.0.0.1'}
|
72
|
+
end
|
73
|
+
end
|