MuranoCLI 3.2.0.beta.9 → 3.2.1.pre.beta.3

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/Rakefile +5 -0
  4. data/dockers/README.rst +7 -0
  5. data/dockers/RELEASE.rst +6 -3
  6. data/dockers/docker-test.sh +45 -17
  7. data/docs/completions/murano_completion-bash +211 -86
  8. data/lib/MrMurano/Account.rb +72 -4
  9. data/lib/MrMurano/Business.rb +163 -2
  10. data/lib/MrMurano/Commander-Entry.rb +1 -2
  11. data/lib/MrMurano/Config.rb +19 -18
  12. data/lib/MrMurano/Content.rb +26 -19
  13. data/lib/MrMurano/Gateway.rb +51 -10
  14. data/lib/MrMurano/ReCommander.rb +1 -1
  15. data/lib/MrMurano/Solution-Services.rb +80 -35
  16. data/lib/MrMurano/Solution-Users.rb +1 -0
  17. data/lib/MrMurano/SyncRoot.rb +10 -3
  18. data/lib/MrMurano/SyncUpDown-Core.rb +47 -36
  19. data/lib/MrMurano/SyncUpDown-Item.rb +46 -14
  20. data/lib/MrMurano/SyncUpDown.rb +22 -20
  21. data/lib/MrMurano/Webservice-Endpoint.rb +20 -18
  22. data/lib/MrMurano/Webservice-File.rb +63 -20
  23. data/lib/MrMurano/commands/business.rb +14 -1
  24. data/lib/MrMurano/commands/child.rb +148 -0
  25. data/lib/MrMurano/commands/devices.rb +298 -149
  26. data/lib/MrMurano/commands/element.rb +2 -1
  27. data/lib/MrMurano/commands/globals.rb +3 -0
  28. data/lib/MrMurano/commands/network.rb +152 -33
  29. data/lib/MrMurano/commands/sync.rb +2 -2
  30. data/lib/MrMurano/commands.rb +1 -0
  31. data/lib/MrMurano/verbosing.rb +13 -2
  32. data/lib/MrMurano/version.rb +1 -1
  33. data/spec/Account_spec.rb +43 -11
  34. data/spec/Content_spec.rb +5 -3
  35. data/spec/GatewayBase_spec.rb +1 -1
  36. data/spec/GatewayDevice_spec.rb +47 -8
  37. data/spec/GatewayResource_spec.rb +1 -1
  38. data/spec/GatewaySettings_spec.rb +1 -1
  39. data/spec/HttpAuthed_spec.rb +17 -3
  40. data/spec/ProjectFile_spec.rb +59 -23
  41. data/spec/Setting_spec.rb +2 -1
  42. data/spec/Solution-ServiceConfig_spec.rb +1 -1
  43. data/spec/Solution-ServiceEventHandler_spec.rb +27 -20
  44. data/spec/Solution-ServiceModules_spec.rb +7 -5
  45. data/spec/Solution-UsersRoles_spec.rb +7 -1
  46. data/spec/Solution_spec.rb +9 -1
  47. data/spec/SyncRoot_spec.rb +5 -5
  48. data/spec/SyncUpDown_spec.rb +262 -211
  49. data/spec/Verbosing_spec.rb +49 -8
  50. data/spec/Webservice-Cors_spec.rb +10 -1
  51. data/spec/Webservice-Endpoint_spec.rb +84 -65
  52. data/spec/Webservice-File_spec.rb +16 -11
  53. data/spec/Webservice-Setting_spec.rb +7 -1
  54. data/spec/_workspace.rb +9 -0
  55. data/spec/cmd_business_spec.rb +5 -10
  56. data/spec/cmd_common.rb +67 -32
  57. data/spec/cmd_config_spec.rb +9 -14
  58. data/spec/cmd_content_spec.rb +15 -26
  59. data/spec/cmd_cors_spec.rb +9 -12
  60. data/spec/cmd_device_spec.rb +31 -45
  61. data/spec/cmd_domain_spec.rb +12 -10
  62. data/spec/cmd_element_spec.rb +18 -17
  63. data/spec/cmd_exchange_spec.rb +1 -4
  64. data/spec/cmd_init_spec.rb +56 -72
  65. data/spec/cmd_keystore_spec.rb +17 -26
  66. data/spec/cmd_link_spec.rb +13 -17
  67. data/spec/cmd_password_spec.rb +9 -10
  68. data/spec/cmd_setting_application_spec.rb +95 -68
  69. data/spec/cmd_setting_product_spec.rb +59 -37
  70. data/spec/cmd_status_spec.rb +46 -84
  71. data/spec/cmd_syncdown_application_spec.rb +28 -50
  72. data/spec/cmd_syncdown_both_spec.rb +44 -93
  73. data/spec/cmd_syncdown_unit_spec.rb +858 -0
  74. data/spec/cmd_syncup_spec.rb +21 -56
  75. data/spec/cmd_token_spec.rb +0 -3
  76. data/spec/cmd_usage_spec.rb +15 -10
  77. data/spec/dry_run_formatter.rb +1 -0
  78. data/spec/fixtures/dumped_config +4 -4
  79. data/spec/spec_helper.rb +3 -0
  80. metadata +4 -2
@@ -16,68 +16,78 @@ RSpec.describe 'murano product setting', :cmd, :needs_password do
16
16
 
17
17
  before(:example) do
18
18
  @product_name = rname('settingtest')
19
- out, err, status = Open3.capture3(capcmd('murano', 'product', 'create', @product_name, '--save'))
19
+ out, err = murano_command_run(
20
+ 'solution create', '--type', 'product', @product_name, '--save',
21
+ )
20
22
  expect(err).to eq('')
21
23
  expect(out.chomp).to match(/^[a-zA-Z0-9]+$/)
22
- expect(status.exitstatus).to eq(0)
23
24
  end
25
+
24
26
  after(:example) do
25
- out, err, status = Open3.capture3(capcmd('murano', 'solution', 'delete', @product_name, '-y'))
27
+ out, err = murano_command_run('solution delete', @product_name, '-y')
26
28
  expect(out).to eq('')
27
29
  expect(err).to eq('')
28
- expect(status.exitstatus).to eq(0)
29
30
  end
30
31
 
31
32
  context 'Writes (using Device2.identity_format)' do
32
33
  before(:example) do
33
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Device2.identity_format', '-c', 'outformat=json'))
34
+ out, err = murano_command_run(
35
+ 'setting read', 'Device2.identity_format', '-c', 'outformat=json',
36
+ )
34
37
  expect { @json_before = JSON.parse(out) }.to_not raise_error
35
38
  expect(err).to eq('')
36
- expect(status.exitstatus).to eq(0)
37
39
  end
38
40
  # {'prefix'=>'', 'type'=>'opaque', 'options'=>{'casing'=>'mixed', 'length'=>0}}
39
41
 
40
42
  it 'a string value', :club_10s do
41
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'write', 'Device2.identity_format', 'prefix', 'fidget'))
43
+ out, err = murano_command_run(
44
+ 'setting write', 'Device2.identity_format', 'prefix', 'fidget',
45
+ )
42
46
  expect(err).to eq('')
43
47
  expect(out).to eq('')
44
- expect(status.exitstatus).to eq(0)
45
48
 
46
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Device2.identity_format', '-c', 'outformat=json'))
49
+ out, err = murano_command_run(
50
+ 'setting read', 'Device2.identity_format', '-c', 'outformat=json',
51
+ )
47
52
  json_after = nil
48
53
  expect { json_after = JSON.parse(out) }.to_not raise_error
49
54
  expect(err).to eq('')
50
- expect(status.exitstatus).to eq(0)
51
55
  @json_before['prefix'] = 'fidget'
52
56
  expect(json_after).to match(@json_before)
53
57
  end
54
58
 
55
59
  it 'a forced string value', :club_10s do
56
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'write', 'Device2.identity_format', 'prefix', '--string', 'fidget'))
60
+ out, err = murano_command_run(
61
+ 'setting write', 'Device2.identity_format', 'prefix', '--string', 'fidget',
62
+ )
57
63
  expect(err).to eq('')
58
64
  expect(out).to eq('')
59
- expect(status.exitstatus).to eq(0)
60
65
 
61
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Device2.identity_format', '-c', 'outformat=json'))
66
+ out, err = murano_command_run(
67
+ 'setting read', 'Device2.identity_format', '-c', 'outformat=json',
68
+ )
62
69
  json_after = nil
63
70
  expect { json_after = JSON.parse(out) }.to_not raise_error
64
71
  expect(err).to eq('')
65
- expect(status.exitstatus).to eq(0)
66
72
  @json_before['prefix'] = 'fidget'
67
73
  expect(json_after).to match(@json_before)
68
74
  end
69
75
 
70
76
  it 'a forced string value on STDIN', :club_10s do
71
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'write', 'Device2.identity_format', 'prefix', '--string'), stdin_data: 'fidget')
77
+ # FIXME: (lb): Replace capcmd with murano_command_run (need to handle stdin_data).
78
+ out, err, status = Open3.capture3(capcmd(
79
+ 'murano', 'setting', 'write', 'Device2.identity_format', 'prefix', '--string',
80
+ ), stdin_data: 'fidget')
72
81
  expect(err).to eq('')
73
82
  expect(out).to eq('')
74
83
  expect(status.exitstatus).to eq(0)
75
84
 
76
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Device2.identity_format', '-c', 'outformat=json'))
85
+ out, err = murano_command_run(
86
+ 'setting read', 'Device2.identity_format', '-c', 'outformat=json',
87
+ )
77
88
  json_after = nil
78
89
  expect { json_after = JSON.parse(out) }.to_not raise_error
79
90
  expect(err).to eq('')
80
- expect(status.exitstatus).to eq(0)
81
91
  @json_before['prefix'] = 'fidget'
82
92
  expect(json_after).to match(@json_before)
83
93
  end
@@ -100,53 +110,62 @@ RSpec.describe 'murano product setting', :cmd, :needs_password do
100
110
 
101
111
  context 'a number value' do
102
112
  it 'integer 12', :club_10s do
103
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'write', 'Device2.identity_format', 'options.length', '--num', '12'))
113
+ out, err = murano_command_run(
114
+ 'setting write', 'Device2.identity_format', 'options.length', '--num', '12',
115
+ )
104
116
  expect(err).to eq('')
105
117
  expect(out).to eq('')
106
- expect(status.exitstatus).to eq(0)
107
118
 
108
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Device2.identity_format', '-c', 'outformat=json'))
119
+ out, err = murano_command_run(
120
+ 'setting read', 'Device2.identity_format', '-c', 'outformat=json',
121
+ )
109
122
  json_after = nil
110
123
  expect { json_after = JSON.parse(out) }.to_not raise_error
111
124
  expect(err).to eq('')
112
- expect(status.exitstatus).to eq(0)
113
125
  @json_before.set('options.length', 12)
114
126
  expect(json_after).to match(@json_before)
115
127
  end
116
128
 
117
129
  it 'float 12.67', :club_10s do
118
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'write', 'Device2.identity_format', 'options.length', '--num', '12.67'))
130
+ out, err = murano_command_run(
131
+ 'setting write', 'Device2.identity_format', 'options.length', '--num', '12.67',
132
+ )
119
133
  expect(err).to eq('')
120
134
  expect(out).to eq('')
121
- expect(status.exitstatus).to eq(0)
122
135
 
123
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Device2.identity_format', '-c', 'outformat=json'))
136
+ out, err = murano_command_run(
137
+ 'setting read', 'Device2.identity_format', '-c', 'outformat=json',
138
+ )
124
139
  json_after = nil
125
140
  expect { json_after = JSON.parse(out) }.to_not raise_error
126
141
  expect(err).to eq('')
127
- expect(status.exitstatus).to eq(0)
128
142
  @json_before.set('options.length', 12.67)
129
143
  expect(json_after).to match(@json_before)
130
144
  end
131
145
 
132
146
  it 'fiftyHalf' do
133
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'write', 'Device2.identity_format', 'options.length', '--num', 'fiftyHalf'))
134
- expect(err).to eq("\e[31mValue \"fiftyHalf\" is not a number\e[0m\n")
147
+ out, err = murano_command_exits(
148
+ 'setting write', 'Device2.identity_format', 'options.length', '--num', 'fiftyHalf',
149
+ )
150
+ expect(err).to eq("Value \"fiftyHalf\" is not a number\n")
135
151
  expect(out).to eq('')
136
- expect(status.exitstatus).to eq(2)
137
152
  end
138
153
 
139
154
  it 'on STDIN' do
140
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'write', 'Device2.identity_format', 'options.length', '--num'), stdin_data: '12')
155
+ # FIXME: (lb): Replace capcmd with murano_command_run (need to handle stdin_data).
156
+ out, err, status = Open3.capture3(capcmd(
157
+ 'murano', 'setting', 'write', 'Device2.identity_format', 'options.length', '--num'
158
+ ), stdin_data: '12')
141
159
  expect(err).to eq('')
142
160
  expect(out).to eq('')
143
161
  expect(status.exitstatus).to eq(0)
144
162
 
145
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Device2.identity_format', '-c', 'outformat=json'))
163
+ out, err = murano_command_run(
164
+ 'setting read', 'Device2.identity_format', '-c', 'outformat=json',
165
+ )
146
166
  json_after = nil
147
167
  expect { json_after = JSON.parse(out) }.to_not raise_error
148
168
  expect(err).to eq('')
149
- expect(status.exitstatus).to eq(0)
150
169
  @json_before.set('options.length', 12)
151
170
  expect(json_after).to match(@json_before)
152
171
  end
@@ -192,16 +211,18 @@ RSpec.describe 'murano product setting', :cmd, :needs_password do
192
211
  # end
193
212
 
194
213
  it 'merges into a dictionary', :club_10s do
195
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'write', 'Device2.identity_format', '.', '--dict', '--merge', 'prefix', 'tix', 'type', 'base10'))
214
+ out, err = murano_command_run(
215
+ 'setting write', 'Device2.identity_format', '.', '--dict', '--merge', 'prefix', 'tix', 'type', 'base10',
216
+ )
196
217
  expect(err).to eq('')
197
218
  expect(out).to eq('')
198
- expect(status.exitstatus).to eq(0)
199
219
 
200
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Device2.identity_format', '-c', 'outformat=json'))
220
+ out, err = murano_command_run(
221
+ 'setting read', 'Device2.identity_format', '-c', 'outformat=json',
222
+ )
201
223
  json_after = nil
202
224
  expect { json_after = JSON.parse(out) }.to_not raise_error
203
225
  expect(err).to eq('')
204
- expect(status.exitstatus).to eq(0)
205
226
  @json_before['prefix'] = 'tix'
206
227
  @json_before['type'] = 'base10'
207
228
  expect(json_after).to match(@json_before)
@@ -210,10 +231,11 @@ RSpec.describe 'murano product setting', :cmd, :needs_password do
210
231
 
211
232
  context 'Writes (using Webservice.cors)' do
212
233
  before(:example) do
213
- out, err, status = Open3.capture3(capcmd('murano', 'setting', 'read', 'Webservice.cors', '-c', 'outformat=json'))
234
+ out, err = murano_command_run(
235
+ 'setting read', 'Webservice.cors', '-c', 'outformat=json',
236
+ )
214
237
  expect { @json_before = JSON.parse(out) }.to_not raise_error
215
238
  expect(err).to eq('')
216
- expect(status.exitstatus).to eq(0)
217
239
  end
218
240
  # {'origin'=>true,
219
241
  # 'methods'=>['HEAD', 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'],
@@ -10,31 +10,40 @@ require 'json'
10
10
  require 'open3'
11
11
  require 'os'
12
12
  require 'rbconfig'
13
+ require 'time'
13
14
 
14
15
  require 'cmd_common'
15
16
 
16
17
  RSpec.describe 'murano status', :cmd, :needs_password do
17
18
  include_context 'CI_CMD'
18
19
 
20
+ before(:all) do
21
+ @timeit_time0 = Time.now
22
+ end
23
+
24
+ after(:all) do
25
+ # FIXME/DRY: Report elapsed time.
26
+ elapsed_secs = Time.now - @timeit_time0
27
+ puts "CI_CMD: elapsed_secs: #{elapsed_secs}"
28
+ end
29
+
19
30
  before(:example) do
20
31
  @product_name = rname('statusTest')
21
- out, err, status = Open3.capture3(
22
- capcmd('murano', 'product', 'create', @product_name, '--save')
32
+ out, err = murano_command_run(
33
+ 'solution create', '--type', 'product', @product_name, '--save',
23
34
  )
24
35
  expect(err).to eq('')
25
36
  expect(out.chomp).to match(/^[a-zA-Z0-9]+$/)
26
- expect(status.exitstatus).to eq(0)
27
37
 
28
38
  @applctn_name = rname('statusTest')
29
- out, err, status = Open3.capture3(
30
- capcmd('murano', 'application', 'create', @applctn_name, '--save')
39
+ out, err = murano_command_run(
40
+ 'solution create', '--type', 'application', @applctn_name, '--save',
31
41
  )
32
42
  expect(err).to eq('')
33
43
  expect(out.chomp).to match(/^[a-zA-Z0-9]+$/)
34
- expect(status.exitstatus).to eq(0)
35
44
 
36
- out, err, status = Open3.capture3(
37
- capcmd('murano', 'syncdown', '--services', '--no-delete', '--no-update')
45
+ out, err = murano_command_run(
46
+ 'syncdown', '--services', '--no-delete', '--no-update',
38
47
  )
39
48
  # NOTE: 2017-12-14: (landonb): The new behavior is that MurCLI will treat
40
49
  # platform scripts that are simply empty strings as not being in conflict
@@ -49,32 +58,29 @@ RSpec.describe 'murano status', :cmd, :needs_password do
49
58
  end
50
59
 
51
60
  expect(err).to eq('')
52
- expect(status.exitstatus).to eq(0)
53
61
  end
54
62
 
55
63
  after(:example) do
56
- out, err, status = Open3.capture3(
57
- capcmd('murano', 'solution', 'delete', @applctn_name, '-y')
64
+ out, err = murano_command_run(
65
+ 'solution delete', @applctn_name, '-y',
58
66
  )
59
67
  expect(out).to eq('')
60
68
  expect(err).to eq('')
61
- expect(status.exitstatus).to eq(0)
62
69
 
63
- out, err, status = Open3.capture3(
64
- capcmd('murano', 'solution', 'delete', @product_name, '-y')
70
+ out, err = murano_command_run(
71
+ 'solution delete', @product_name, '-y',
65
72
  )
66
73
  expect(out).to eq('')
67
74
  expect(err).to eq('')
68
- expect(status.exitstatus).to eq(0)
69
75
  end
70
76
 
71
77
  def match_syncable_contents(slice)
72
78
  expect(slice).to include(
73
79
  a_string_matching(%r{ \+ \w .*modules/table_util\.lua}),
74
- a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua}),
75
- a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:4}),
76
- a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:7}),
77
- a_string_matching(%r{ \+ \w .*routes/singleRoute\.lua}),
80
+ a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:1-4}),
81
+ a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:5-7}),
82
+ a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:8-11}),
83
+ a_string_matching(%r{ \+ \w .*routes/singleRoute\.lua:1-5}),
78
84
  a_string_matching(%r{ \+ \w .*files/js/script\.js}),
79
85
  a_string_matching(%r{ \+ \w .*files/icon\.png}),
80
86
  a_string_matching(%r{ \+ \w .*files/index\.html}),
@@ -93,9 +99,9 @@ RSpec.describe 'murano status', :cmd, :needs_password do
93
99
  def match_syncable_contents_except_single_route(slice)
94
100
  expect(slice).to include(
95
101
  a_string_matching(%r{ \+ \w .*modules/table_util\.lua}),
96
- a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua}),
97
- a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:4}),
98
- a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:7}),
102
+ a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:1-4}),
103
+ a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:5-7}),
104
+ a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:8-11}),
99
105
  a_string_matching(%r{ \+ \w .*files/icon\.png}),
100
106
  a_string_matching(%r{ \+ \w .*files/index\.html}),
101
107
  a_string_matching(%r{ \+ \w .*files/js/script\.js}),
@@ -104,11 +110,7 @@ RSpec.describe 'murano status', :cmd, :needs_password do
104
110
 
105
111
  def match_remote_boilerplate_v1_0_0_service(slice)
106
112
  expect(slice).to include(
107
- a_string_matching(/ - \w config_service/),
108
- a_string_matching(/ - \w config_status/),
109
- a_string_matching(/ - \w user_account\.lua/),
110
- a_string_matching(/ - \w config_service/),
111
- a_string_matching(/ - \w config_status/),
113
+ a_string_matching(/ - \w user_account\.lua \[phantom\]/),
112
114
  )
113
115
  end
114
116
 
@@ -124,50 +126,20 @@ RSpec.describe 'murano status', :cmd, :needs_password do
124
126
  end
125
127
 
126
128
  it 'status', :club_20s, :club_10s do
127
- out, err, status = Open3.capture3(capcmd('murano', 'status'))
129
+ out, err = murano_command_run('status')
128
130
  expect(err).to eq('')
129
- # Two problems with this output.
130
- # 1: Order of files is not set
131
- # 2: Path prefixes could be different.
132
131
  olines = out.lines
133
132
  expect(olines[0]).to eq("Only on local machine:\n")
134
133
  match_syncable_contents_resources(olines[1..4])
135
134
  match_syncable_contents(olines[5..12])
136
- #expect(olines[13]).to eq("Nothing new remotely\n")
137
- expect(olines[13]).to eq("Only on remote server:\n")
138
- expect(olines[14]).to eq(" - I config_service\n")
139
- expect(olines[15]).to eq(" - I config_status\n")
140
- # FIMXE/2017-06-23: We should DRY this long list which is same in each test.
141
- # FIXME/2017-06-23: The interfaces the server creates for a new project
142
- # will problem vary depending on what modules are loaded, and are likely
143
- # to change over time...
144
- #match_remote_boilerplate_v1_0_0_service(olines[14..35])
145
-
146
- # NOTE: On Windows, touch doesn't work, so items differ.
147
- # Check the platform, e.g., 'linux-gnu', or other.
148
- # 2017-07-14 08:51: Is there a race condition here? [lb] saw
149
- # differences earlier, but then not after adding this...
150
- #is_windows = (
151
- # RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
152
- #)
153
- #if OS.windows?
154
- # expect(olines[14]).to eq("Items that differ:\n")
155
- # expect(olines[15..16]).to contain_exactly(
156
- # a_string_matching(%r{ M \w .*services/timer_timer\.lua}),
157
- # a_string_matching(%r{ M \w .*services/tsdb_exportJob\.lua}),
158
- # )
159
- #else
160
- expect(olines[16]).to eq("Nothing that differs\n")
161
- #end
162
-
163
- expect(status.exitstatus).to eq(0)
135
+ expect(olines[13]).to eq("Nothing new remotely\n")
136
+ expect(olines[14]).to eq("Nothing that differs\n")
164
137
  end
165
138
 
166
139
  it 'matches file path', :broken_on_windows, :club_20s, :club_10s do
167
140
  # capcmd calls shellwords, which escapes strings so that Open3 doesn't
168
141
  # expand them. E.g., **/ would expand to the local directory name.
169
- status_cmd = capcmd('murano', 'status', '**/icon.png')
170
- out, err, status = Open3.capture3(status_cmd)
142
+ out, err = murano_command_run('status', '**/icon.png')
171
143
  expect(err).to eq('')
172
144
  expect(out.lines).to match(
173
145
  [
@@ -177,21 +149,19 @@ RSpec.describe 'murano status', :cmd, :needs_password do
177
149
  "Nothing that differs\n",
178
150
  ]
179
151
  )
180
- expect(status.exitstatus).to eq(0)
181
152
  end
182
153
 
183
154
  it 'matches route', :broken_on_windows, :club_20s, :club_10s do
184
- out, err, status = Open3.capture3(capcmd('murano', 'status', '#put#'))
155
+ out, err = murano_command_run('status', '#put#')
185
156
  expect(err).to eq('')
186
157
  expect(out.lines).to match(
187
158
  [
188
159
  "Only on local machine:\n",
189
- a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:4}),
160
+ a_string_matching(%r{ \+ \w .*routes/manyRoutes\.lua:5-7}),
190
161
  "Nothing new remotely\n",
191
162
  "Nothing that differs\n",
192
163
  ]
193
164
  )
194
- expect(status.exitstatus).to eq(0)
195
165
  end
196
166
  end
197
167
 
@@ -214,17 +184,14 @@ RSpec.describe 'murano status', :cmd, :needs_password do
214
184
  end
215
185
 
216
186
  it 'status', :club_20s, :club_10s do
217
- out, err, status = Open3.capture3(capcmd('murano', 'status'))
187
+ out, err = murano_command_run('status')
218
188
  expect(err).to eq('')
219
189
  olines = out.lines
220
190
 
221
191
  expect(olines[0]).to eq("Only on local machine:\n")
222
192
  match_syncable_contents_resources(olines[1..4])
223
193
  match_syncable_contents(olines[5..12])
224
- #expect(olines[13]).to eq("Nothing new remotely\n")
225
- expect(olines[13]).to eq("Only on remote server:\n")
226
- expect(olines[14]).to eq(" - I config_service\n")
227
- expect(olines[15]).to eq(" - I config_status\n")
194
+ expect(olines[13]).to eq("Nothing new remotely\n")
228
195
 
229
196
  # NOTE: On Windows, touch doesn't work, so items differ.
230
197
  # Check the platform, e.g., 'linux-gnu', or other.
@@ -232,20 +199,17 @@ RSpec.describe 'murano status', :cmd, :needs_password do
232
199
  # RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
233
200
  #)
234
201
  if OS.windows?
235
- expect(olines[16]).to eq("Items that differ:\n")
236
- expect(olines[17..18]).to include(
202
+ expect(olines[14]).to eq("Items that differ:\n")
203
+ expect(olines[15..16]).to include(
237
204
  a_string_matching(%r{ M \w .*services/timer_timer\.lua}),
238
205
  a_string_matching(%r{ M \w .*services/tsdb_exportJob\.lua}),
239
206
  )
240
207
  else
241
- expect(olines[16]).to eq("Nothing that differs\n")
208
+ expect(olines[14]).to eq("Nothing that differs\n")
242
209
  end
243
-
244
- expect(status.exitstatus).to eq(0)
245
210
  end
246
211
  end
247
212
 
248
- # XXX wait, should a Solutionfile even work with Okami?
249
213
  context 'with Solutionfile 0.2.0' do
250
214
  before(:example) do
251
215
  FileUtils.cp_r(File.join(@testdir, 'spec/fixtures/syncable_content/.'), '.')
@@ -273,7 +237,7 @@ RSpec.describe 'murano status', :cmd, :needs_password do
273
237
  end
274
238
 
275
239
  it 'status', :club_20s, :club_10s do
276
- out, err, status = Open3.capture3(capcmd('murano', 'status'))
240
+ out, err = murano_command_run('status')
277
241
  expect(err).to eq('')
278
242
  # Not a single match, because the order of items within groups can shift
279
243
  olines = out.lines
@@ -281,9 +245,8 @@ RSpec.describe 'murano status', :cmd, :needs_password do
281
245
  match_syncable_contents_resources(olines[1..4])
282
246
  match_syncable_contents_except_single_route(olines[5..11])
283
247
  expect(olines[12]).to eq("Only on remote server:\n")
284
- match_remote_boilerplate_v1_0_0_service(olines[13..17])
285
- expect(olines[18]).to eq("Nothing that differs\n")
286
- expect(status.exitstatus).to eq(0)
248
+ match_remote_boilerplate_v1_0_0_service(olines[13..13])
249
+ expect(olines[14]).to eq("Nothing that differs\n")
287
250
  end
288
251
  end
289
252
 
@@ -318,16 +281,15 @@ RSpec.describe 'murano status', :cmd, :needs_password do
318
281
  end
319
282
 
320
283
  it 'status', :club_20s, :club_10s do
321
- out, err, status = Open3.capture3(capcmd('murano', 'status'))
284
+ out, err = murano_command_run('status')
322
285
  expect(err).to eq('')
323
286
  olines = out.lines
324
287
  expect(olines[0]).to eq("Only on local machine:\n")
325
288
  match_syncable_contents_resources(olines[1..4])
326
289
  match_syncable_contents_except_single_route(olines[5..11])
327
290
  expect(olines[12]).to eq("Only on remote server:\n")
328
- match_remote_boilerplate_v1_0_0_service(olines[13..17])
329
- expect(olines[18]).to eq("Nothing that differs\n")
330
- expect(status.exitstatus).to eq(0)
291
+ match_remote_boilerplate_v1_0_0_service(olines[13..13])
292
+ expect(olines[14]).to eq("Nothing that differs\n")
331
293
  end
332
294
  end
333
295
  end