orats 0.7.3 → 0.8.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/.gitignore +2 -1
- data/Gemfile +1 -1
- data/{LICENSE.txt → LICENSE} +21 -21
- data/README.md +51 -346
- data/Rakefile +1 -1
- data/bin/orats +5 -2
- data/lib/orats/argv_adjust.rb +61 -0
- data/lib/orats/cli.rb +53 -141
- data/lib/orats/cli_help/new +27 -0
- data/lib/orats/cli_help/nuke +19 -0
- data/lib/orats/commands/new/exec.rb +59 -0
- data/lib/orats/commands/new/rails.rb +197 -0
- data/lib/orats/commands/new/server.rb +67 -0
- data/lib/orats/commands/nuke.rb +66 -44
- data/lib/orats/common.rb +76 -0
- data/lib/orats/postgres.rb +90 -0
- data/lib/orats/process.rb +35 -0
- data/lib/orats/redis.rb +25 -0
- data/lib/orats/shell.rb +12 -0
- data/lib/orats/templates/auth.rb +96 -82
- data/lib/orats/templates/base.rb +115 -110
- data/lib/orats/templates/includes/new/rails/.env +28 -28
- data/lib/orats/templates/includes/new/rails/Gemfile +4 -4
- data/lib/orats/templates/includes/new/rails/config/{whenever.rb → schedule.rb} +0 -0
- data/lib/orats/ui.rb +33 -0
- data/lib/orats/version.rb +3 -2
- data/lib/orats.rb +2 -1
- data/orats.gemspec +7 -5
- data/test/integration/cli_test.rb +28 -177
- data/test/test_helper.rb +24 -9
- metadata +17 -29
- data/lib/orats/commands/common.rb +0 -146
- data/lib/orats/commands/diff/compare.rb +0 -106
- data/lib/orats/commands/diff/exec.rb +0 -60
- data/lib/orats/commands/diff/parse.rb +0 -66
- data/lib/orats/commands/inventory.rb +0 -100
- data/lib/orats/commands/playbook.rb +0 -60
- data/lib/orats/commands/project/exec.rb +0 -74
- data/lib/orats/commands/project/rails.rb +0 -162
- data/lib/orats/commands/project/server.rb +0 -57
- data/lib/orats/commands/role.rb +0 -70
- data/lib/orats/commands/ui.rb +0 -47
- data/lib/orats/templates/includes/inventory/group_vars/all.yml +0 -202
- data/lib/orats/templates/includes/inventory/hosts +0 -8
- data/lib/orats/templates/includes/playbook/Galaxyfile +0 -15
- data/lib/orats/templates/includes/playbook/common.yml +0 -23
- data/lib/orats/templates/includes/playbook/site.yml +0 -36
- data/lib/orats/templates/includes/role/.travis.yml +0 -19
- data/lib/orats/templates/includes/role/README.md +0 -62
- data/lib/orats/templates/includes/role/meta/main.yml +0 -123
- data/lib/orats/templates/includes/role/tests/inventory +0 -1
- data/lib/orats/templates/includes/role/tests/main.yml +0 -7
- data/lib/orats/templates/playbook.rb +0 -119
- data/lib/orats/templates/role.rb +0 -144
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'yaml'
|
2
1
|
require_relative '../test_helper'
|
3
2
|
|
3
|
+
# integration tests for the orats cli
|
4
4
|
class TestCLI < Minitest::Test
|
5
5
|
include Orats::Test
|
6
6
|
|
@@ -15,104 +15,23 @@ class TestCLI < Minitest::Test
|
|
15
15
|
assert_nuked unless @target_path.nil?
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
18
|
+
def test_new
|
19
|
+
assert_new
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
|
22
|
+
def test_new_with_auth
|
23
|
+
assert_new '--template auth'
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
assert_project '--skip-ansible', ansible: :refute
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_project_with_invalid_template
|
26
|
+
def test_new_with_invalid_template
|
31
27
|
@target_path = generate_app_name
|
32
28
|
@extra_flags = "#{ORATS_NEW_FLAGS} --template foo"
|
33
29
|
|
34
|
-
assert_orats '
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_inventory
|
38
|
-
assert_inventory
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_playbook
|
42
|
-
assert_playbook
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_playbook_update_roles
|
46
|
-
target_path = generate_app_name
|
47
|
-
|
48
|
-
assert_playbook target_path
|
49
|
-
assert_playbook target_path
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_role
|
53
|
-
@target_path = 'githubname.myrole'
|
54
|
-
@extra_flags = '-r ansible-myrole'
|
55
|
-
|
56
|
-
out, err = capture_orats('role')
|
57
|
-
|
58
|
-
assert_match /success/, out, err
|
59
|
-
|
60
|
-
absolute_target_path = "#{TEST_PATH}/#{@target_path}"
|
61
|
-
|
62
|
-
assert_path "#{absolute_target_path}/.gitignore"
|
63
|
-
assert_path "#{absolute_target_path}/.travis.yml"
|
64
|
-
assert_path "#{absolute_target_path}/README.md"
|
65
|
-
assert_path "#{absolute_target_path}/LICENSE"
|
66
|
-
assert_path "#{absolute_target_path}/tests"
|
67
|
-
assert_path "#{absolute_target_path}/tests/main.yml"
|
68
|
-
assert_path "#{absolute_target_path}/tests/inventory"
|
69
|
-
refute_path "#{absolute_target_path}/files/main.yml"
|
70
|
-
refute_path "#{absolute_target_path}/templates/main.yml"
|
71
|
-
|
72
|
-
meta_main = IO.read("#{absolute_target_path}/meta/main.yml")
|
73
|
-
readme = IO.read("#{absolute_target_path}/README.md")
|
74
|
-
tests_main = IO.read("#{absolute_target_path}/tests/main.yml")
|
75
|
-
|
76
|
-
refute meta_main.include?('author_name')
|
77
|
-
assert_count readme, 'githubname.myrole', 2
|
78
|
-
assert_count readme, 'ansible-myrole', 3
|
79
|
-
assert_count tests_main, 'myrole', 1
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_diff
|
83
|
-
assert_diff
|
84
|
-
|
85
|
-
out, err = capture_orats('diff')
|
86
|
-
|
87
|
-
assert_count out, 'gem', 1
|
88
|
-
assert_count out, 'missing', 0
|
89
|
-
assert_count out, 'outdated', 0
|
90
|
-
assert_count out, 'extra', 0
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_diff_with_differences
|
94
|
-
file_paths = assert_diff
|
95
|
-
|
96
|
-
hosts_path = "#{file_paths[0]}/hosts"
|
97
|
-
inventory_path = "#{file_paths[0]}/group_vars/all.yml"
|
98
|
-
galaxyfile_path = "#{file_paths[1]}/Galaxyfile"
|
99
|
-
site_path = "#{file_paths[1]}/site.yml"
|
100
|
-
|
101
|
-
gsub_file(hosts_path, '[cache]', '[something]')
|
102
|
-
gsub_file(inventory_path, 'postgres_user', 'hello_world')
|
103
|
-
gsub_file(galaxyfile_path, /nickjj.ruby,v.*$/, "nickjj.ruby,v0.1.2\nfoo")
|
104
|
-
gsub_file(site_path, 'nickjj.whenever', 'bar')
|
105
|
-
|
106
|
-
out, err = capture_orats('diff')
|
107
|
-
|
108
|
-
assert_count out, 'gem', 1
|
109
|
-
assert_count out, 'missing', 3
|
110
|
-
assert_count out, 'outdated', 1
|
111
|
-
assert_count out, 'extra', 4
|
30
|
+
assert_orats 'new', 'not a valid template'
|
112
31
|
end
|
113
32
|
|
114
33
|
def test_templates
|
115
|
-
assert_orats 'templates', '
|
34
|
+
assert_orats 'templates', 'auth'
|
116
35
|
end
|
117
36
|
|
118
37
|
def test_version
|
@@ -121,30 +40,22 @@ class TestCLI < Minitest::Test
|
|
121
40
|
|
122
41
|
private
|
123
42
|
|
124
|
-
def assert_orats(command, match_regex
|
43
|
+
def assert_orats(command, match_regex)
|
125
44
|
out, err = capture_orats(command)
|
126
45
|
|
127
|
-
assert_match
|
128
|
-
|
129
|
-
assert_or_refute_ansible ansible if ansible
|
46
|
+
assert_match(/#{match_regex}/, out, err) unless match_regex.empty?
|
130
47
|
end
|
131
48
|
|
132
|
-
def
|
49
|
+
def assert_new(flags = '')
|
133
50
|
@target_path = generate_app_name
|
134
|
-
absolute_target_path = "#{TEST_PATH}/#{@target_path}"
|
135
51
|
@extra_flags = "#{ORATS_NEW_FLAGS} #{flags}"
|
52
|
+
absolute_target_path = "#{TEST_PATH}/#{@target_path}"
|
136
53
|
|
137
|
-
assert_orats '
|
138
|
-
|
139
|
-
if ansible == :assert
|
140
|
-
assert_ansible_yaml "#{absolute_target_path}/inventory/group_vars/all.yml"
|
141
|
-
end
|
142
|
-
|
143
|
-
absolute_target_path << "/services/#{@target_path}"
|
144
|
-
assert_project_tests_pass absolute_target_path
|
54
|
+
assert_orats 'new', 'Start your server'
|
55
|
+
assert_new_tests_pass absolute_target_path
|
145
56
|
end
|
146
57
|
|
147
|
-
def
|
58
|
+
def assert_new_tests_pass(target_path)
|
148
59
|
out, err = capture_subprocess_io do
|
149
60
|
system "cd #{target_path} && bundle exec rake test"
|
150
61
|
end
|
@@ -153,87 +64,32 @@ class TestCLI < Minitest::Test
|
|
153
64
|
assert out.include?('0 failures') && out.include?('0 errors'), err
|
154
65
|
end
|
155
66
|
|
156
|
-
def assert_inventory
|
157
|
-
@target_path = generate_app_name
|
158
|
-
|
159
|
-
assert_orats 'inventory', 'success'
|
160
|
-
assert_path "#{TEST_PATH}/#{@target_path}/inventory/hosts"
|
161
|
-
assert_ansible_yaml "#{TEST_PATH}/#{@target_path}/inventory/group_vars/all.yml"
|
162
|
-
end
|
163
|
-
|
164
|
-
def assert_playbook(target_path = generate_app_name)
|
165
|
-
@target_path = target_path
|
166
|
-
|
167
|
-
assert_orats 'playbook', 'success'
|
168
|
-
assert_path "#{TEST_PATH}/#{@target_path}/Galaxyfile"
|
169
|
-
assert_ansible_yaml "#{TEST_PATH}/#{@target_path}/common.yml"
|
170
|
-
assert_ansible_yaml "#{TEST_PATH}/#{@target_path}/site.yml"
|
171
|
-
end
|
172
|
-
|
173
|
-
def assert_diff
|
174
|
-
assert_inventory
|
175
|
-
inventory_path = "#{TEST_PATH}/#{@target_path}/inventory"
|
176
|
-
|
177
|
-
assert_playbook
|
178
|
-
playbook_path = "#{TEST_PATH}/#{@target_path}"
|
179
|
-
|
180
|
-
@target_path = ''
|
181
|
-
@extra_flags = "-i #{inventory_path} -p #{playbook_path}"
|
182
|
-
|
183
|
-
[inventory_path, playbook_path]
|
184
|
-
end
|
185
|
-
|
186
67
|
def assert_nuked(options = {})
|
187
|
-
out,
|
68
|
+
out, _ = capture_subprocess_io do
|
188
69
|
orats "nuke #{@target_path}", flags: options[:flags], answer: 'y'
|
189
70
|
end
|
190
71
|
|
191
|
-
assert_match
|
72
|
+
assert_match(/#{@target_path}/, out)
|
192
73
|
system "rm -rf #{TEST_PATH}"
|
193
74
|
end
|
194
75
|
|
195
76
|
def assert_count(input, regex, expected)
|
196
77
|
assert input.scan(regex).size == expected,
|
197
|
-
"Found #{input.scan(regex).size} matches for '#{regex}' but
|
78
|
+
"Found #{input.scan(regex).size} matches for '#{regex}' but " + \
|
79
|
+
"expected #{expected}"
|
198
80
|
end
|
199
81
|
|
200
82
|
def assert_in_file(file_path, match_regex)
|
201
83
|
file_contents = `cat #{file_path}`
|
202
|
-
assert_match
|
84
|
+
assert_match(/#{match_regex}/, file_contents)
|
203
85
|
end
|
204
86
|
|
205
87
|
def assert_path(file_or_dir)
|
206
|
-
assert File.
|
88
|
+
assert File.exist?(file_or_dir), "Expected path '#{file_or_dir}' to exist"
|
207
89
|
end
|
208
90
|
|
209
91
|
def refute_path(file_or_dir)
|
210
|
-
refute File.
|
211
|
-
end
|
212
|
-
|
213
|
-
def assert_or_refute_ansible(assert_or_refute)
|
214
|
-
absolute_target_path = "#{TEST_PATH}/#{@target_path}"
|
215
|
-
|
216
|
-
assert_path "#{absolute_target_path}/services"
|
217
|
-
send("#{assert_or_refute.to_s}_path",
|
218
|
-
"#{absolute_target_path}/inventory")
|
219
|
-
send("#{assert_or_refute.to_s}_path",
|
220
|
-
"#{absolute_target_path}/secrets")
|
221
|
-
end
|
222
|
-
|
223
|
-
def assert_ansible_yaml(file_path)
|
224
|
-
begin
|
225
|
-
file = IO.read(file_path)
|
226
|
-
invalid_ansible_yaml = file.match(/^([^#].\w): {/)
|
227
|
-
|
228
|
-
if invalid_ansible_yaml
|
229
|
-
assert false, "Invalid yaml syntax found near:\n #{invalid_ansible_yaml}\n\nYou need to include quotes around values that start with jinja template tags:\n Example, foo: '{{ bar }}'"
|
230
|
-
return
|
231
|
-
end
|
232
|
-
|
233
|
-
assert YAML.load(file)
|
234
|
-
rescue Psych::SyntaxError => ex
|
235
|
-
assert false, ex.message
|
236
|
-
end
|
92
|
+
refute File.exist?(file_or_dir), "Expected path '#{file_or_dir}' to exist"
|
237
93
|
end
|
238
94
|
|
239
95
|
def capture_orats(command)
|
@@ -252,20 +108,15 @@ class TestCLI < Minitest::Test
|
|
252
108
|
line.include?('Running') || line.include?('Run options') ||
|
253
109
|
line.empty?
|
254
110
|
end
|
111
|
+
end
|
255
112
|
|
113
|
+
def print_rails_test_results(out)
|
256
114
|
puts
|
257
|
-
puts '-'*80
|
115
|
+
puts '-' * 80
|
258
116
|
puts 'Results of running `bundle exec rake test` on the generated test app:'
|
259
|
-
puts '-'*80
|
260
|
-
puts
|
261
|
-
puts '-'*80
|
117
|
+
puts '-' * 80
|
118
|
+
puts out.join("\n\n").rstrip
|
119
|
+
puts '-' * 80
|
262
120
|
puts
|
263
121
|
end
|
264
|
-
|
265
|
-
def gsub_file(file_path, replace, with)
|
266
|
-
IO.write(file_path, File.open(file_path) do |f|
|
267
|
-
f.read.gsub(replace, with)
|
268
|
-
end
|
269
|
-
)
|
270
|
-
end
|
271
122
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,19 +1,25 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
2
|
require 'securerandom'
|
3
|
-
require_relative '../lib/orats/commands/
|
3
|
+
require_relative '../lib/orats/commands/new/server'
|
4
4
|
|
5
5
|
module Orats
|
6
|
+
# test helpers
|
6
7
|
module Test
|
7
|
-
include Commands::
|
8
|
+
include Commands::New::Server
|
9
|
+
|
10
|
+
# creating and destroying databases needs to be done with raw psql
|
11
|
+
# commands when the host isn't localhost or 127.0.0.1
|
8
12
|
|
9
13
|
TEST_PATH = ENV['TEST_PATH'] || '/tmp/orats'
|
10
14
|
POSTGRES_LOCATION = ENV['POSTGRES_LOCATION'] || 'localhost'
|
11
15
|
POSTGRES_USERNAME = ENV['POSTGRES_USERNAME'] || 'postgres'
|
12
|
-
POSTGRES_PASSWORD = ENV['POSTGRES_PASSWORD'] || '
|
16
|
+
POSTGRES_PASSWORD = ENV['POSTGRES_PASSWORD'] || ''
|
13
17
|
REDIS_LOCATION = ENV['REDIS_LOCATION'] || 'localhost'
|
14
18
|
REDIS_PASSWORD = ENV['REDIS_PASSWORD'] || ''
|
15
19
|
|
16
|
-
CREDENTIALS = "-l #{POSTGRES_LOCATION} -u #{POSTGRES_USERNAME}
|
20
|
+
CREDENTIALS = "-l #{POSTGRES_LOCATION} -u #{POSTGRES_USERNAME} " + \
|
21
|
+
" -p #{POSTGRES_PASSWORD} " + \
|
22
|
+
" -n #{REDIS_LOCATION} -d #{REDIS_PASSWORD}"
|
17
23
|
|
18
24
|
INCLUDES_PATH = File.absolute_path('../../lib/orats/templates/includes',
|
19
25
|
__FILE__)
|
@@ -22,14 +28,13 @@ module Orats
|
|
22
28
|
|
23
29
|
def orats(command, options = {})
|
24
30
|
cmd, app_name = command.split(' ')
|
25
|
-
prepend_command = ''
|
26
31
|
command = "#{cmd} #{TEST_PATH}/#{app_name}" unless app_name.nil?
|
27
32
|
|
28
|
-
|
29
|
-
|
30
|
-
insert_answer = 'yes' : insert_answer = 'echo'
|
31
|
-
|
33
|
+
insert_answer = answer(options)
|
34
|
+
if insert_answer
|
32
35
|
prepend_command = "#{insert_answer} | "
|
36
|
+
else
|
37
|
+
prepend_command = ''
|
33
38
|
end
|
34
39
|
|
35
40
|
system "#{prepend_command} #{BINARY_PATH} #{command} #{options[:flags]}"
|
@@ -37,6 +42,16 @@ module Orats
|
|
37
42
|
|
38
43
|
private
|
39
44
|
|
45
|
+
def answer(options)
|
46
|
+
return unless options.key?(:answer)
|
47
|
+
|
48
|
+
if options[:answer] == 'y' || options[:answer] == 'yes'
|
49
|
+
'yes'
|
50
|
+
else
|
51
|
+
'no'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
40
55
|
def generate_app_name
|
41
56
|
"a_#{SecureRandom.hex(8)}"
|
42
57
|
end
|
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.8.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-
|
11
|
+
date: 2014-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -66,8 +66,7 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '5.3'
|
69
|
-
description:
|
70
|
-
Ruby on Rails. Launch new applications and the infrastructure to run them in seconds.
|
69
|
+
description: Generate modern Ruby on Rails applications using best practices.
|
71
70
|
email:
|
72
71
|
- nick.janetakis@gmail.com
|
73
72
|
executables:
|
@@ -77,30 +76,28 @@ extra_rdoc_files: []
|
|
77
76
|
files:
|
78
77
|
- ".gitignore"
|
79
78
|
- Gemfile
|
80
|
-
- LICENSE
|
79
|
+
- LICENSE
|
81
80
|
- README.md
|
82
81
|
- Rakefile
|
83
82
|
- bin/orats
|
84
83
|
- lib/orats.rb
|
84
|
+
- lib/orats/argv_adjust.rb
|
85
85
|
- lib/orats/cli.rb
|
86
|
-
- lib/orats/
|
87
|
-
- lib/orats/
|
88
|
-
- lib/orats/commands/
|
89
|
-
- lib/orats/commands/
|
90
|
-
- lib/orats/commands/
|
86
|
+
- lib/orats/cli_help/new
|
87
|
+
- lib/orats/cli_help/nuke
|
88
|
+
- lib/orats/commands/new/exec.rb
|
89
|
+
- lib/orats/commands/new/rails.rb
|
90
|
+
- lib/orats/commands/new/server.rb
|
91
91
|
- lib/orats/commands/nuke.rb
|
92
|
-
- lib/orats/
|
93
|
-
- lib/orats/
|
94
|
-
- lib/orats/
|
95
|
-
- lib/orats/
|
96
|
-
- lib/orats/
|
97
|
-
- lib/orats/commands/ui.rb
|
92
|
+
- lib/orats/common.rb
|
93
|
+
- lib/orats/postgres.rb
|
94
|
+
- lib/orats/process.rb
|
95
|
+
- lib/orats/redis.rb
|
96
|
+
- lib/orats/shell.rb
|
98
97
|
- lib/orats/templates/auth.rb
|
99
98
|
- lib/orats/templates/base.rb
|
100
99
|
- lib/orats/templates/includes/common/.gitignore
|
101
100
|
- lib/orats/templates/includes/common/LICENSE
|
102
|
-
- lib/orats/templates/includes/inventory/group_vars/all.yml
|
103
|
-
- lib/orats/templates/includes/inventory/hosts
|
104
101
|
- lib/orats/templates/includes/new/rails/.env
|
105
102
|
- lib/orats/templates/includes/new/rails/Gemfile
|
106
103
|
- lib/orats/templates/includes/new/rails/Procfile
|
@@ -136,10 +133,10 @@ files:
|
|
136
133
|
- lib/orats/templates/includes/new/rails/config/initializers/mini_profiler.rb
|
137
134
|
- lib/orats/templates/includes/new/rails/config/initializers/sidekiq.rb
|
138
135
|
- lib/orats/templates/includes/new/rails/config/puma.rb
|
136
|
+
- lib/orats/templates/includes/new/rails/config/schedule.rb
|
139
137
|
- lib/orats/templates/includes/new/rails/config/secrets.yml
|
140
138
|
- lib/orats/templates/includes/new/rails/config/sidekiq.yml
|
141
139
|
- lib/orats/templates/includes/new/rails/config/sitemap.rb
|
142
|
-
- lib/orats/templates/includes/new/rails/config/whenever.rb
|
143
140
|
- lib/orats/templates/includes/new/rails/lib/backup/config.rb
|
144
141
|
- lib/orats/templates/includes/new/rails/lib/backup/models/backup.rb
|
145
142
|
- lib/orats/templates/includes/new/rails/lib/tasks/orats/backup.rake
|
@@ -150,16 +147,7 @@ files:
|
|
150
147
|
- lib/orats/templates/includes/new/rails/public/502.html
|
151
148
|
- lib/orats/templates/includes/new/rails/test/fixtures/accounts.yml
|
152
149
|
- lib/orats/templates/includes/new/rails/test/models/account_test.rb
|
153
|
-
- lib/orats/
|
154
|
-
- lib/orats/templates/includes/playbook/common.yml
|
155
|
-
- lib/orats/templates/includes/playbook/site.yml
|
156
|
-
- lib/orats/templates/includes/role/.travis.yml
|
157
|
-
- lib/orats/templates/includes/role/README.md
|
158
|
-
- lib/orats/templates/includes/role/meta/main.yml
|
159
|
-
- lib/orats/templates/includes/role/tests/inventory
|
160
|
-
- lib/orats/templates/includes/role/tests/main.yml
|
161
|
-
- lib/orats/templates/playbook.rb
|
162
|
-
- lib/orats/templates/role.rb
|
150
|
+
- lib/orats/ui.rb
|
163
151
|
- lib/orats/version.rb
|
164
152
|
- orats.gemspec
|
165
153
|
- test/integration/cli_test.rb
|
@@ -1,146 +0,0 @@
|
|
1
|
-
require 'orats/commands/ui'
|
2
|
-
require 'orats/commands/diff/parse'
|
3
|
-
|
4
|
-
module Orats
|
5
|
-
module Commands
|
6
|
-
class Common
|
7
|
-
include Thor::Base
|
8
|
-
include Thor::Shell
|
9
|
-
include Thor::Actions
|
10
|
-
include UI
|
11
|
-
include Diff::Parse
|
12
|
-
|
13
|
-
RELATIVE_PATHS = {
|
14
|
-
galaxyfile: 'templates/includes/playbook/Galaxyfile',
|
15
|
-
playbook: 'templates/includes/playbook/site.yml',
|
16
|
-
hosts: 'templates/includes/inventory/hosts',
|
17
|
-
inventory: 'templates/includes/inventory/group_vars/all.yml',
|
18
|
-
version: 'version.rb'
|
19
|
-
}
|
20
|
-
|
21
|
-
attr_accessor :remote_gem_version, :remote_paths, :local_paths
|
22
|
-
|
23
|
-
def initialize(target_path = '', options = {})
|
24
|
-
@target_path = target_path
|
25
|
-
@options = options
|
26
|
-
@active_path = @target_path
|
27
|
-
|
28
|
-
@local_paths = {}
|
29
|
-
@remote_paths = {}
|
30
|
-
|
31
|
-
build_common_paths
|
32
|
-
|
33
|
-
self.destination_root = Dir.pwd
|
34
|
-
@behavior = :invoke
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.copy_from_local_gem(source, dest)
|
38
|
-
base_path = File.join(File.expand_path(File.dirname(__FILE__)),
|
39
|
-
'..')
|
40
|
-
template_path = "#{base_path}/templates/includes"
|
41
|
-
|
42
|
-
system "mkdir -p #{File.dirname(dest)}" unless Dir.exist?(File.dirname(dest))
|
43
|
-
system "cp #{template_path}/#{source} #{dest}"
|
44
|
-
end
|
45
|
-
|
46
|
-
def base_path
|
47
|
-
File.join(File.expand_path(File.dirname(__FILE__)), '..')
|
48
|
-
end
|
49
|
-
|
50
|
-
def repo_path
|
51
|
-
%w(https://raw.githubusercontent.com/nickjj/orats lib/orats)
|
52
|
-
end
|
53
|
-
|
54
|
-
def url_to_string(url)
|
55
|
-
begin
|
56
|
-
open(url).read
|
57
|
-
rescue *[OpenURI::HTTPError, SocketError] => ex
|
58
|
-
log_error 'error', "Error accessing URL #{url}",
|
59
|
-
'message', ex
|
60
|
-
exit 1
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def file_to_string(path)
|
65
|
-
if File.exist?(path) && File.file?(path)
|
66
|
-
IO.read(path)
|
67
|
-
else
|
68
|
-
log_error 'error', 'Error finding file',
|
69
|
-
'message', path
|
70
|
-
exit 1
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def exit_if_path_exists(extend_path='')
|
75
|
-
log_task 'Check if this path exists'
|
76
|
-
|
77
|
-
extended_path = @active_path.dup
|
78
|
-
extended_path = File.join(extended_path, extend_path) unless extend_path
|
79
|
-
.empty?
|
80
|
-
|
81
|
-
if Dir.exist?(extended_path) || File.exist?(extended_path)
|
82
|
-
log_error 'error', 'A file or directory already exists at this location', 'path', extended_path
|
83
|
-
exit 1
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def exit_if_process(check_for, *processes)
|
88
|
-
case check_for
|
89
|
-
when :not_found
|
90
|
-
command = 'which'
|
91
|
-
phrase = 'on your system path'
|
92
|
-
when :not_running
|
93
|
-
command = 'ps cax | grep'
|
94
|
-
phrase = 'running'
|
95
|
-
else
|
96
|
-
command = ''
|
97
|
-
phrase = ''
|
98
|
-
end
|
99
|
-
|
100
|
-
processes.each do |process|
|
101
|
-
log_task "Check if #{process} is #{phrase}"
|
102
|
-
|
103
|
-
exit 1 if process_unusable?("#{command} #{process}", process, phrase)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
private
|
108
|
-
|
109
|
-
def build_common_paths
|
110
|
-
@remote_paths[:version] = select_branch 'master', RELATIVE_PATHS[:version]
|
111
|
-
@remote_gem_version = gem_version
|
112
|
-
|
113
|
-
RELATIVE_PATHS.each_pair do |key, value|
|
114
|
-
@local_paths[key] = "#{base_path}/#{value}"
|
115
|
-
@remote_paths[key] = select_branch @remote_gem_version,
|
116
|
-
check_old_remote_file_paths(value)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def check_old_remote_file_paths(url)
|
121
|
-
new_url = url.dup
|
122
|
-
|
123
|
-
if @remote_gem_version[1..-1] < '0.6.6'
|
124
|
-
new_url.gsub!('playbook/', '')
|
125
|
-
new_url.gsub!('includes/site.yml', 'play.rb')
|
126
|
-
end
|
127
|
-
|
128
|
-
new_url
|
129
|
-
end
|
130
|
-
|
131
|
-
def select_branch(branch, value)
|
132
|
-
"#{repo_path[0]}/#{branch}/#{repo_path[1]}/#{value}"
|
133
|
-
end
|
134
|
-
|
135
|
-
def process_unusable?(command, process, phrase)
|
136
|
-
command_output = run(command, capture: true)
|
137
|
-
|
138
|
-
log_error 'error', "Cannot detect #{process}", 'question', "Are you sure #{process} is #{phrase}?", true do
|
139
|
-
log_status_bottom 'tip', "#{process} must be #{phrase} before running this orats command", :white
|
140
|
-
end if command_output.empty?
|
141
|
-
|
142
|
-
command_output.empty?
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
@@ -1,106 +0,0 @@
|
|
1
|
-
module Orats
|
2
|
-
module Commands
|
3
|
-
module Diff
|
4
|
-
module Compare
|
5
|
-
def remote_gem_vs_yours
|
6
|
-
log_remote_info 'gem',
|
7
|
-
'Compare your orats version to the latest version',
|
8
|
-
'version',
|
9
|
-
"You have v#{VERSION} and the latest version is #{@remote_gem_version}"
|
10
|
-
end
|
11
|
-
|
12
|
-
def remote_vs_yours(label, remote, yours, exact_match)
|
13
|
-
log_remote_info label,
|
14
|
-
"Compare your #{label} to the latest version (#{@remote_gem_version})",
|
15
|
-
'file', File.basename(Common::RELATIVE_PATHS[label
|
16
|
-
.to_sym])
|
17
|
-
|
18
|
-
outdated_and_missing = difference(remote, yours, exact_match, true)
|
19
|
-
extras = difference(yours, remote, exact_match)
|
20
|
-
both_lists = outdated_and_missing + extras
|
21
|
-
sorted_diff = sort_difference(both_lists).uniq { |item| item[:name] }
|
22
|
-
|
23
|
-
if sorted_diff.empty?
|
24
|
-
log_status_bottom 'results', 'no differences were found',
|
25
|
-
:magenta, true
|
26
|
-
else
|
27
|
-
padded_length = pad_by(sorted_diff)
|
28
|
-
|
29
|
-
sorted_diff.each do |item|
|
30
|
-
name = sorted_diff.empty? ? item[:name] : item[:name].ljust(padded_length)
|
31
|
-
version = item[:version].empty? ? '' : "#{set_color('|',
|
32
|
-
:cyan)} #{item[:version]}"
|
33
|
-
|
34
|
-
log_status_bottom item[:status], "#{name} #{version}",
|
35
|
-
item[:color], true
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def name_and_version_from_line(line)
|
43
|
-
line.split(',')
|
44
|
-
end
|
45
|
-
|
46
|
-
def pad_by(sorted_diff)
|
47
|
-
longest_role = sorted_diff.max_by { |s| s[:name].length }
|
48
|
-
longest_role[:name].length
|
49
|
-
end
|
50
|
-
|
51
|
-
def sort_difference(diff_list)
|
52
|
-
# custom sort order on the color key
|
53
|
-
diff_list.sort_by { |item| {red: 1,
|
54
|
-
yellow: 2,
|
55
|
-
green: 3}[item[:color]] }
|
56
|
-
end
|
57
|
-
|
58
|
-
def difference(remote, yours, exact_match, missing_and_outdated = false)
|
59
|
-
@diff_list = []
|
60
|
-
yours_as_string = yours.join
|
61
|
-
|
62
|
-
if missing_and_outdated
|
63
|
-
diff = remote - yours
|
64
|
-
|
65
|
-
diff.each do |line|
|
66
|
-
line_parts = name_and_version_from_line(line)
|
67
|
-
status = 'outdated'
|
68
|
-
color = :yellow
|
69
|
-
search_contents = exact_match ? yours : yours_as_string
|
70
|
-
|
71
|
-
unless search_contents.include?(line_parts[0])
|
72
|
-
status = 'missing'
|
73
|
-
color = :red
|
74
|
-
end
|
75
|
-
|
76
|
-
@diff_list.push({
|
77
|
-
color: color,
|
78
|
-
status: status,
|
79
|
-
name: line_parts[0],
|
80
|
-
version: line_parts[1] || ''
|
81
|
-
})
|
82
|
-
|
83
|
-
end
|
84
|
-
else
|
85
|
-
remote.each do |line|
|
86
|
-
unless yours.include?(line)
|
87
|
-
line_parts = name_and_version_from_line(line)
|
88
|
-
status = 'extra'
|
89
|
-
color = :green
|
90
|
-
|
91
|
-
@diff_list.push({
|
92
|
-
color: color,
|
93
|
-
status: status,
|
94
|
-
name: line_parts[0],
|
95
|
-
version: line_parts[1] || ''
|
96
|
-
})
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
@diff_list
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|