orats 0.4.10 → 0.5.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.
- checksums.yaml +4 -4
- data/README.md +30 -3
- data/lib/orats/cli.rb +31 -0
- data/lib/orats/command.rb +4 -0
- data/lib/orats/shell.rb +270 -2
- data/lib/orats/templates/includes/Galaxyfile +12 -0
- data/lib/orats/version.rb +1 -1
- data/test/integration/cli_test.rb +16 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04ca394edc402343a74153e8b1b7a2f8f61eb4c4
|
4
|
+
data.tar.gz: 302ace76f892bc1d4e17e6c66a3ee5d02c749f45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84ef1382a808fc7b08fbbe1bc99422e3560da9e198fb2fbf122b4b2671de61aece9b67c5f7cffd8fbfd00d483298d884dd3b895787d08c0dcedc4377601643a1
|
7
|
+
data.tar.gz: d06a4516543e945daa0c42fc8dc28d58f72b10f505b21efea7c985a2bcb3b479ff1c3ae669c93643a8e8968ef934371f5547a1ec9bc39d5a47c8baf1d530a511
|
data/README.md
CHANGED
@@ -73,6 +73,9 @@ running `orats <command name> help` from your terminal. You can also type `orats
|
|
73
73
|
- Project features:
|
74
74
|
- Optionally takes: `--skip-extras [false]`
|
75
75
|
- Optionally takes: `--skip-foreman-start [false]`
|
76
|
+
- Ansible features:
|
77
|
+
- Optionally takes: `--sudo-password []`
|
78
|
+
- Optionally takes: `--skip-galaxy [false]`
|
76
79
|
|
77
80
|
- Create an ansible playbook
|
78
81
|
- `orats play <PATH>`
|
@@ -81,6 +84,11 @@ running `orats <command name> help` from your terminal. You can also type `orats
|
|
81
84
|
- `orats nuke <APP_PATH>`
|
82
85
|
- Optionally takes: `--skip-data [false]`
|
83
86
|
|
87
|
+
- Detect whether or not orats, the playbook or inventory is outdated
|
88
|
+
- `orats outdated [options]`
|
89
|
+
- Optionally takes: `--playbook-file []`
|
90
|
+
- Optionally takes: `--inventory-file []`
|
91
|
+
|
84
92
|
#### Why is it asking me for my development postgres password?
|
85
93
|
|
86
94
|
In order to automate certain tasks such as running database migrations the script must be able to talk to your database.
|
@@ -89,6 +97,22 @@ location will be `localhost` and the username will be `postgres` so these values
|
|
89
97
|
|
90
98
|
Remember, this is only your development postgres password. It will **never** ask for your production passwords.
|
91
99
|
|
100
|
+
#### Is the outdated detection guaranteed to be accurate?
|
101
|
+
|
102
|
+
The version comparisons can be fully trusted but when comparing a specific playbook or inventory file it's not really
|
103
|
+
possible to guarantee a valid comparison.
|
104
|
+
|
105
|
+
When passing in `--playbook-file` or `--inventory-file` it will look for certain keywords in the file. If it finds the
|
106
|
+
keyword then it will assume that keyword is working and up to date. Since you can edit these files freely there may be
|
107
|
+
cases where it reports a false positive.
|
108
|
+
|
109
|
+
It's better than nothing and it also doubles as an upgrade guide too if you wanted to add in new role lines to your
|
110
|
+
playbook file or paste in a few new variables in your inventory that exist in a newer version of orats that you planned
|
111
|
+
to update.
|
112
|
+
|
113
|
+
It will detect missing, outdated and extra keywords between your version of orats, your user generated files and the
|
114
|
+
latest version on github. Execute `orats help outdated` if you get confused.
|
115
|
+
|
92
116
|
## Base
|
93
117
|
|
94
118
|
This is the starter template that every other template will append to. I feel like when I make a new project, 95% of the time
|
@@ -129,6 +153,11 @@ Everything has been added with proper git commits so you have a trail of changes
|
|
129
153
|
|
130
154
|
`orats new myapp --pg-password <development postgres db password>`
|
131
155
|
|
156
|
+
Towards the end of the run you might get prompted for a sudo password if you have not skipped installing the ansible
|
157
|
+
roles from the galaxy. It will only try to use sudo if it fails with a permission error first.
|
158
|
+
|
159
|
+
You can also provide a `--sudo-password=foo` flag to set your password so orats can finish without any user input.
|
160
|
+
|
132
161
|
#### What's with the services directory?
|
133
162
|
|
134
163
|
It is just a naming convention that I like to apply, you can name it whatever you want later or remove it with a flag. My thought
|
@@ -255,9 +284,7 @@ check out each role then here's a link to their repos:
|
|
255
284
|
- `nickjj.nginx` https://github.com/nickjj/ansible-nginx
|
256
285
|
- `DavidWittman.redis` https://github.com/DavidWittman/ansible-redis
|
257
286
|
|
258
|
-
|
259
|
-
|
260
|
-
`ansible-galaxy install nickjj.user nickjj.security nickjj.postgres nickjj.ruby nickjj.nodejs nickjj.nginx nickjj.rails nickjj.whenever nickjj.pumacorn nickjj.sidekiq nickjj.monit DavidWittman.redis --force`
|
287
|
+
All of the above roles will get installed and updated whenever you generate a `new` orats application.
|
261
288
|
|
262
289
|
### Try it
|
263
290
|
|
data/lib/orats/cli.rb
CHANGED
@@ -11,6 +11,8 @@ module Orats
|
|
11
11
|
option :auth, type: :boolean, default: false, aliases: '-a'
|
12
12
|
option :skip_extras, type: :boolean, default: false, aliases: '-E'
|
13
13
|
option :skip_foreman_start, type: :boolean, default: false, aliases: '-F'
|
14
|
+
option :sudo_password, default: ''
|
15
|
+
option :skip_galaxy, type: :boolean, default: false, aliases: '-G'
|
14
16
|
desc 'new APP_PATH [options]', ''
|
15
17
|
long_desc <<-D
|
16
18
|
`orats new myapp --pg-password supersecret` will create a new rails project and it will also create an ansible inventory to go with it by default.
|
@@ -38,6 +40,12 @@ module Orats
|
|
38
40
|
`--skip-extras` skip creating the services directory and ansible inventory/secrets [false]
|
39
41
|
|
40
42
|
`--skip-foreman-start` skip automatically running puma and sidekiq [false]
|
43
|
+
|
44
|
+
Ansible features:
|
45
|
+
|
46
|
+
`--sudo-password` to install ansible roles from the galaxy to a path outside of your user privileges []
|
47
|
+
|
48
|
+
`--skip-galaxy` skip automatically installing roles from the galaxy [false]
|
41
49
|
D
|
42
50
|
def new(app_name)
|
43
51
|
Command.new(app_name, options).new
|
@@ -64,6 +72,28 @@ module Orats
|
|
64
72
|
Command.new(app_name, options).nuke
|
65
73
|
end
|
66
74
|
|
75
|
+
option :playbook_file, default: ''
|
76
|
+
option :inventory_file, default: ''
|
77
|
+
desc 'outdated [options]', ''
|
78
|
+
long_desc <<-D
|
79
|
+
`orats outdated` will run various comparisons on your ansible files.
|
80
|
+
|
81
|
+
Help:
|
82
|
+
|
83
|
+
`The green/yellow labels` denote a remote check to compare the files contained in your version of orats to the latest files on github.
|
84
|
+
|
85
|
+
`The blue/cyan labels` denote a local check between the files contained in your version of orats to the files you have generated such as your own playbook or inventories.
|
86
|
+
|
87
|
+
Options:
|
88
|
+
|
89
|
+
`--playbook-file` to supply a playbook file for comparison []
|
90
|
+
|
91
|
+
`--inventory-file` to supply an inventory file for comparison []
|
92
|
+
D
|
93
|
+
def outdated
|
94
|
+
Command.new(nil, options).outdated
|
95
|
+
end
|
96
|
+
|
67
97
|
desc 'version', ''
|
68
98
|
long_desc <<-D
|
69
99
|
`orats version` will print the current version.
|
@@ -74,6 +104,7 @@ module Orats
|
|
74
104
|
map %w(-v --version) => :version
|
75
105
|
|
76
106
|
private
|
107
|
+
|
77
108
|
def invoked?
|
78
109
|
caller_locations(0).any? { |backtrace| backtrace.label == 'invoke' }
|
79
110
|
end
|
data/lib/orats/command.rb
CHANGED
data/lib/orats/shell.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'securerandom'
|
2
|
+
require 'open-uri'
|
2
3
|
|
3
4
|
module Orats
|
4
5
|
module Shell
|
@@ -12,6 +13,21 @@ module Orats
|
|
12
13
|
puts '-'*80, ''; sleep 0.25
|
13
14
|
end
|
14
15
|
|
16
|
+
def log_status(type, message, color)
|
17
|
+
puts
|
18
|
+
say_status type, set_color(message, :bold), color
|
19
|
+
end
|
20
|
+
|
21
|
+
def log_status_under(type, message, color)
|
22
|
+
say_status type, message, color
|
23
|
+
puts
|
24
|
+
end
|
25
|
+
|
26
|
+
def log_results(results, message)
|
27
|
+
log_status 'results', results, :magenta
|
28
|
+
log_status_under 'message', message, :white
|
29
|
+
end
|
30
|
+
|
15
31
|
def git_commit(message)
|
16
32
|
run_from @active_path, "git add . && git commit -m '#{message}'"
|
17
33
|
end
|
@@ -166,14 +182,266 @@ module Orats
|
|
166
182
|
run "ssh-keygen -t rsa -P '' -f #{secrets_path}/id_rsa"
|
167
183
|
|
168
184
|
log_message 'shell', 'Creating self signed ssl certificates'
|
169
|
-
run
|
185
|
+
run create_rsa_certificate(secrets_path, 'sslkey.key', 'sslcert.crt')
|
170
186
|
|
171
187
|
log_message 'shell', 'Creating monit pem file'
|
172
|
-
run "
|
188
|
+
run "#{create_rsa_certificate(secrets_path, 'monit.pem', 'monit.pem')} && openssl gendh 512 >> #{secrets_path}/monit.pem"
|
189
|
+
|
190
|
+
install_role_dependencies unless @options[:skip_galaxy]
|
191
|
+
end
|
192
|
+
|
193
|
+
def outdated_init
|
194
|
+
github_repo = 'https://raw.githubusercontent.com/nickjj/orats/master/lib/orats'
|
195
|
+
|
196
|
+
version_url = "#{github_repo}/version.rb"
|
197
|
+
galaxy_url = "#{github_repo}/templates/includes/Galaxyfile"
|
198
|
+
playbook_url = "#{github_repo}/templates/play.rb"
|
199
|
+
inventory_url = "#{github_repo}/templates/includes/inventory/group_vars/all.yml"
|
200
|
+
|
201
|
+
remote_version_contents = url_to_string(version_url)
|
202
|
+
remote_galaxy_contents = url_to_string(galaxy_url)
|
203
|
+
remote_playbook_contents = url_to_string(playbook_url)
|
204
|
+
remote_inventory_contents = url_to_string(inventory_url)
|
205
|
+
|
206
|
+
compare_gem_version remote_version_contents
|
207
|
+
|
208
|
+
compare_remote_role_version_to_local remote_galaxy_contents
|
209
|
+
|
210
|
+
local_playbook = compare_remote_to_local('playbook',
|
211
|
+
'roles',
|
212
|
+
playbook_file_stats(remote_playbook_contents),
|
213
|
+
playbook_file_stats(IO.read(playbook_file_path)))
|
214
|
+
|
215
|
+
local_inventory = compare_remote_to_local('inventory',
|
216
|
+
'variables',
|
217
|
+
inventory_file_stats(remote_inventory_contents),
|
218
|
+
inventory_file_stats(IO.read(inventory_file_path)))
|
219
|
+
|
220
|
+
unless @options[:playbook_file].empty?
|
221
|
+
compare_user_to_local('playbook', 'roles', @options[:playbook_file], local_playbook) do
|
222
|
+
playbook_file_stats IO.read(@options[:playbook_file])
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
unless @options[:inventory_file].empty?
|
227
|
+
compare_user_to_local('inventory', 'variables', @options[:inventory_file], local_inventory) do
|
228
|
+
inventory_file_stats IO.read(@options[:inventory_file])
|
229
|
+
end
|
230
|
+
end
|
173
231
|
end
|
174
232
|
|
175
233
|
private
|
176
234
|
|
235
|
+
def inventory_file_stats(file)
|
236
|
+
# pluck out all of the values contained with {{ }}
|
237
|
+
ansible_variable_list = file.scan(/\{\{([^{{}}]*)\}\}/)
|
238
|
+
|
239
|
+
# remove the leading space
|
240
|
+
ansible_variable_list.map! { |line| line.first[0] = '' }
|
241
|
+
|
242
|
+
# match every line that is not a comment and contains a colon
|
243
|
+
inventory_variable_list = file.scan(/^[^#].*:/)
|
244
|
+
|
245
|
+
inventory_variable_list.map! do |line|
|
246
|
+
# only strip lines that need it
|
247
|
+
line.strip! if line.include?(' ') || line.include?("\n")
|
248
|
+
|
249
|
+
# get rid of the trailing colon
|
250
|
+
line.chomp(':')
|
251
|
+
|
252
|
+
# if a value of a certain variable has a colon then the regex
|
253
|
+
# picks this up as a match. only take the variable name
|
254
|
+
# if this happens to occur
|
255
|
+
line.split(':').first if line.include?(':')
|
256
|
+
end
|
257
|
+
|
258
|
+
(ansible_variable_list + inventory_variable_list).uniq
|
259
|
+
end
|
260
|
+
|
261
|
+
def playbook_file_stats(file)
|
262
|
+
# match every line that is not a comment and has a role defined
|
263
|
+
roles_list = file.scan(/^.*role:.*/)
|
264
|
+
|
265
|
+
roles_list.map! do |line|
|
266
|
+
# only strip lines that need it
|
267
|
+
line.strip! if line.include?(' ') || line.include?("\n")
|
268
|
+
|
269
|
+
role_parts = line.split('role:')
|
270
|
+
|
271
|
+
line = role_parts[1]
|
272
|
+
|
273
|
+
if line.include?(',')
|
274
|
+
line = line.split(',').first
|
275
|
+
end
|
276
|
+
|
277
|
+
line.strip! if line.include?(' ')
|
278
|
+
end
|
279
|
+
|
280
|
+
roles_list.reject! { |line| line.start_with?('#') }
|
281
|
+
|
282
|
+
roles_list.uniq
|
283
|
+
end
|
284
|
+
|
285
|
+
def compare_gem_version(latest_contents)
|
286
|
+
latest = latest_contents.match(/\'(.*)\'/)[1..-1].first
|
287
|
+
|
288
|
+
log_status 'gem', 'Comparing this version of orats to the latest orats version:', :green
|
289
|
+
log_status_under 'version', "Latest: v#{latest}, Yours: v#{VERSION}", :yellow
|
290
|
+
end
|
291
|
+
|
292
|
+
def compare_remote_role_version_to_local(remote_galaxy_contents)
|
293
|
+
remote_galaxy_list = remote_galaxy_contents.split
|
294
|
+
local_galaxy_contents = IO.read(galaxy_file_path)
|
295
|
+
local_galaxy_list = local_galaxy_contents.split
|
296
|
+
|
297
|
+
galaxy_difference = remote_galaxy_list - local_galaxy_list
|
298
|
+
|
299
|
+
local_role_count = local_galaxy_list.size
|
300
|
+
different_roles = galaxy_difference.size
|
301
|
+
|
302
|
+
log_status 'roles', "Comparing this version of orats' roles to the latest version:", :green
|
303
|
+
|
304
|
+
if different_roles == 0
|
305
|
+
log_status_under 'message', "All #{local_role_count} roles are up to date", :yellow
|
306
|
+
else
|
307
|
+
log_status_under 'message', "There are #{different_roles} differences", :yellow
|
308
|
+
|
309
|
+
galaxy_difference.each do |role_line|
|
310
|
+
name = role_line.split(',').first
|
311
|
+
status = 'outdated'
|
312
|
+
color = :yellow
|
313
|
+
|
314
|
+
unless local_galaxy_contents.include?(name)
|
315
|
+
status = 'missing'
|
316
|
+
color = :red
|
317
|
+
end
|
318
|
+
|
319
|
+
say_status status, name, color
|
320
|
+
end
|
321
|
+
|
322
|
+
log_results 'The latest version of orats may benefit you:', 'Check github to see if the changes interest you'
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
def compare_remote_to_local(label, keyword, remote_list, local_list)
|
327
|
+
list_difference = remote_list - local_list
|
328
|
+
|
329
|
+
remote_count = list_difference.size#log_unmatched remote_list, local_list, 'remote', :yellow
|
330
|
+
|
331
|
+
log_status label, "Comparing this version of orats' #{label} to the latest version:", :green
|
332
|
+
log_status_under 'file', label == 'playbook' ? 'site.yml' : 'all.yml', :yellow
|
333
|
+
|
334
|
+
list_difference.each do |line|
|
335
|
+
say_status 'missing', line, :red unless local_list.include?(line)
|
336
|
+
end
|
337
|
+
|
338
|
+
if remote_count > 0
|
339
|
+
log_results "#{remote_count} new #{keyword} are available:", 'You may benefit from upgrading to the latest orats'
|
340
|
+
else
|
341
|
+
log_results 'Everything appears to be in order:', "No missing #{keyword} were found"
|
342
|
+
end
|
343
|
+
|
344
|
+
local_list
|
345
|
+
end
|
346
|
+
|
347
|
+
def compare_user_to_local(label, keyword, user_path, local_list)
|
348
|
+
if File.exist?(user_path) && File.file?(user_path)
|
349
|
+
user_list = yield
|
350
|
+
|
351
|
+
just_file_name = user_path.split('/').last
|
352
|
+
|
353
|
+
log_status label, "Comparing this version of orats' #{label} to #{just_file_name}:", :blue
|
354
|
+
log_status_under 'path', user_path, :cyan
|
355
|
+
|
356
|
+
# really ugly hack to not count rails ENV variables as "missing" for each inventory that was generated
|
357
|
+
local_list = local_list.join("\n").gsub!('TESTPROJ_', '').split("\n") if label == 'inventory'
|
358
|
+
|
359
|
+
missing_count = log_unmatched local_list, user_list, 'missing', :red
|
360
|
+
extra_count = log_unmatched user_list, local_list, 'extra', :yellow
|
361
|
+
|
362
|
+
if missing_count > 0
|
363
|
+
log_results "#{missing_count} #{keyword} are missing:", "Your ansible run will likely fail with this #{label}"
|
364
|
+
else
|
365
|
+
log_results 'Everything appears to be in order:', "No missing #{keyword} were found"
|
366
|
+
end
|
367
|
+
|
368
|
+
if extra_count > 0
|
369
|
+
log_results "#{extra_count} extra #{keyword} were detected:", "No problem but remember to add them to a future #{keyword}"
|
370
|
+
else
|
371
|
+
log_results "No extra #{keyword} were found:", "Extra #{keyword} are fine but you have none"
|
372
|
+
end
|
373
|
+
else
|
374
|
+
log_status label, "Comparing this version of orats' #{label} to ???:", :blue
|
375
|
+
puts
|
376
|
+
say_status 'error', "\e[1mError comparing #{label}:\e[0m", :red
|
377
|
+
say_status 'path', user_path, :yellow
|
378
|
+
say_status 'help', 'Make sure you supply a file name', :white
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
def url_to_string(url)
|
383
|
+
begin
|
384
|
+
file_contents = open(url).read
|
385
|
+
rescue OpenURI::HTTPError => ex
|
386
|
+
say_status 'error', "\e[1mError browsing #{url}:\e[0m", :red
|
387
|
+
say_status 'msg', ex, :yellow
|
388
|
+
exit 1
|
389
|
+
end
|
390
|
+
|
391
|
+
file_contents
|
392
|
+
end
|
393
|
+
|
394
|
+
def log_unmatched(compare, against, label, color)
|
395
|
+
count = 0
|
396
|
+
|
397
|
+
against = against.join
|
398
|
+
|
399
|
+
compare.each do |item|
|
400
|
+
unless against.include?(item)
|
401
|
+
# really ugly hack to not count rails ENV variables as "extra" for each inventory that was generated
|
402
|
+
unless item == item.upcase && item.count('_') > 1
|
403
|
+
say_status label, item, color
|
404
|
+
count += 1
|
405
|
+
end
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
count
|
410
|
+
end
|
411
|
+
|
412
|
+
def create_rsa_certificate(secrets_path, keyout, out)
|
413
|
+
"openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -subj '/C=US/ST=Foo/L=Bar/O=Baz/CN=qux.com' -keyout #{secrets_path}/#{keyout} -out #{secrets_path}/#{out}"
|
414
|
+
end
|
415
|
+
|
416
|
+
def galaxy_file_path
|
417
|
+
"#{File.expand_path File.dirname(__FILE__)}/templates/includes/Galaxyfile"
|
418
|
+
end
|
419
|
+
|
420
|
+
def inventory_file_path
|
421
|
+
"#{File.expand_path File.dirname(__FILE__)}/templates/includes/inventory/group_vars/all.yml"
|
422
|
+
end
|
423
|
+
|
424
|
+
def playbook_file_path
|
425
|
+
"#{File.expand_path File.dirname(__FILE__)}/templates/play.rb"
|
426
|
+
end
|
427
|
+
|
428
|
+
def install_role_dependencies
|
429
|
+
log_message 'shell', 'Updating ansible roles from the galaxy'
|
430
|
+
|
431
|
+
galaxy_install = "ansible-galaxy install -r #{galaxy_file_path} --force"
|
432
|
+
galaxy_out = run(galaxy_install, capture: true)
|
433
|
+
|
434
|
+
if galaxy_out.include?('you do not have permission')
|
435
|
+
if @options[:sudo_password].empty?
|
436
|
+
sudo_galaxy_command = 'sudo'
|
437
|
+
else
|
438
|
+
sudo_galaxy_command = "echo #{@options[:sudo_password]} | sudo -S"
|
439
|
+
end
|
440
|
+
|
441
|
+
run("#{sudo_galaxy_command} #{galaxy_install}")
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
177
445
|
def save_secret_string(file)
|
178
446
|
File.open(file, 'w+') { |f| f.write(SecureRandom.hex(64)) }
|
179
447
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
nickjj.user,v0.1.0
|
2
|
+
nickjj.security,v0.1.1
|
3
|
+
nickjj.postgres,v0.1.1
|
4
|
+
nickjj.ruby,v0.1.3
|
5
|
+
nickjj.nodejs,v0.1.1
|
6
|
+
nickjj.nginx,v0.1.3
|
7
|
+
nickjj.rails,v0.1.9
|
8
|
+
nickjj.whenever,v0.1.0
|
9
|
+
nickjj.pumacorn,v0.1.1
|
10
|
+
nickjj.sidekiq,v0.1.1
|
11
|
+
nickjj.monit,v0.1.2
|
12
|
+
DavidWittman.redis
|
data/lib/orats/version.rb
CHANGED
@@ -65,6 +65,22 @@ class TestCLI < Minitest::Test
|
|
65
65
|
assert_nuked app_name
|
66
66
|
end
|
67
67
|
|
68
|
+
def test_outdated
|
69
|
+
app_name = generate_app_name
|
70
|
+
|
71
|
+
out, err = capture_subprocess_io do
|
72
|
+
orats "play #{app_name}"
|
73
|
+
end
|
74
|
+
assert_match /success/, out
|
75
|
+
|
76
|
+
out, err = capture_subprocess_io do
|
77
|
+
orats 'outdated'
|
78
|
+
end
|
79
|
+
assert_match /Comparing this version of/, out
|
80
|
+
|
81
|
+
assert_nuked app_name
|
82
|
+
end
|
83
|
+
|
68
84
|
def test_version
|
69
85
|
out, err = capture_subprocess_io do
|
70
86
|
orats 'version'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Janetakis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- lib/orats/shell.rb
|
90
90
|
- lib/orats/templates/auth.rb
|
91
91
|
- lib/orats/templates/base.rb
|
92
|
+
- lib/orats/templates/includes/Galaxyfile
|
92
93
|
- lib/orats/templates/includes/Gemfile
|
93
94
|
- lib/orats/templates/includes/inventory/group_vars/all.yml
|
94
95
|
- lib/orats/templates/includes/inventory/hosts
|