moose-inventory 1.0.8 → 2.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.
Files changed (104) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +49 -0
  3. data/.github/workflows/release.yml +58 -0
  4. data/.gitignore +1 -1
  5. data/.gitleaks.toml +9 -0
  6. data/.rubocop.yml +19 -784
  7. data/BACKLOG.md +290 -0
  8. data/Gemfile.lock +95 -0
  9. data/README.md +38 -9
  10. data/Rakefile +1 -1
  11. data/bin/moose-inventory +1 -1
  12. data/docs/release/publishing.md +109 -0
  13. data/docs/release/release-readiness.md +55 -0
  14. data/docs/security-audit-2026-05-21.md +71 -0
  15. data/docs/security-audit-2026-05-26-rerun.md +75 -0
  16. data/docs/security-audit-2026-05-26.md +63 -0
  17. data/lib/moose_inventory/cli/formatter.rb +16 -17
  18. data/lib/moose_inventory/cli/group.rb +4 -1
  19. data/lib/moose_inventory/cli/group_add.rb +89 -75
  20. data/lib/moose_inventory/cli/group_addchild.rb +84 -71
  21. data/lib/moose_inventory/cli/group_addhost.rb +78 -69
  22. data/lib/moose_inventory/cli/group_addvar.rb +37 -37
  23. data/lib/moose_inventory/cli/group_get.rb +23 -26
  24. data/lib/moose_inventory/cli/group_list.rb +12 -15
  25. data/lib/moose_inventory/cli/group_listvars.rb +12 -14
  26. data/lib/moose_inventory/cli/group_rm.rb +104 -76
  27. data/lib/moose_inventory/cli/group_rmchild.rb +99 -54
  28. data/lib/moose_inventory/cli/group_rmhost.rb +64 -60
  29. data/lib/moose_inventory/cli/group_rmvar.rb +5 -5
  30. data/lib/moose_inventory/cli/helpers.rb +76 -0
  31. data/lib/moose_inventory/cli/host.rb +4 -1
  32. data/lib/moose_inventory/cli/host_add.rb +51 -66
  33. data/lib/moose_inventory/cli/host_addgroup.rb +77 -68
  34. data/lib/moose_inventory/cli/host_addvar.rb +6 -6
  35. data/lib/moose_inventory/cli/host_get.rb +15 -18
  36. data/lib/moose_inventory/cli/host_list.rb +3 -3
  37. data/lib/moose_inventory/cli/host_listvars.rb +21 -23
  38. data/lib/moose_inventory/cli/host_rm.rb +9 -9
  39. data/lib/moose_inventory/cli/host_rmgroup.rb +63 -60
  40. data/lib/moose_inventory/cli/host_rmvar.rb +3 -3
  41. data/lib/moose_inventory/config/config.rb +43 -40
  42. data/lib/moose_inventory/db/db.rb +92 -52
  43. data/lib/moose_inventory/db/models.rb +11 -12
  44. data/lib/moose_inventory/inventory_context.rb +50 -0
  45. data/lib/moose_inventory/operations/add_associations.rb +127 -0
  46. data/lib/moose_inventory/operations/add_groups.rb +115 -0
  47. data/lib/moose_inventory/operations/add_hosts.rb +110 -0
  48. data/lib/moose_inventory/operations/group_child_relations.rb +118 -0
  49. data/lib/moose_inventory/operations/group_cleanup.rb +55 -0
  50. data/lib/moose_inventory/operations/remove_associations.rb +101 -0
  51. data/lib/moose_inventory/operations/remove_groups.rb +79 -0
  52. data/lib/moose_inventory/version.rb +1 -1
  53. data/moose-inventory.gemspec +38 -20
  54. data/scripts/check.sh +10 -0
  55. data/scripts/ci/check_permissions.sh +35 -0
  56. data/scripts/ci/check_rubocop.sh +28 -0
  57. data/scripts/ci/check_secrets.sh +26 -0
  58. data/scripts/ci/check_security.sh +68 -0
  59. data/scripts/ci/install_security_tools.sh +47 -0
  60. data/scripts/ci/package_sanity.sh +46 -0
  61. data/scripts/files.rb +1 -4
  62. data/scripts/install_dependencies.sh +19 -0
  63. data/scripts/reports.sh +2 -2
  64. data/spec/lib/moose_inventory/cli/cli_spec.rb +13 -14
  65. data/spec/lib/moose_inventory/cli/group_add_spec.rb +118 -119
  66. data/spec/lib/moose_inventory/cli/group_addchild_spec.rb +49 -51
  67. data/spec/lib/moose_inventory/cli/group_addhost_spec.rb +80 -83
  68. data/spec/lib/moose_inventory/cli/group_addvar_spec.rb +91 -91
  69. data/spec/lib/moose_inventory/cli/group_get_spec.rb +22 -23
  70. data/spec/lib/moose_inventory/cli/group_list_spec.rb +19 -20
  71. data/spec/lib/moose_inventory/cli/group_listvar_spec.rb +35 -36
  72. data/spec/lib/moose_inventory/cli/group_rm_spec.rb +115 -78
  73. data/spec/lib/moose_inventory/cli/group_rmchild_spec.rb +86 -45
  74. data/spec/lib/moose_inventory/cli/group_rmhost_spec.rb +43 -46
  75. data/spec/lib/moose_inventory/cli/group_rmvar_spec.rb +131 -131
  76. data/spec/lib/moose_inventory/cli/group_spec.rb +9 -9
  77. data/spec/lib/moose_inventory/cli/host_add_spec.rb +103 -43
  78. data/spec/lib/moose_inventory/cli/host_addgroup_spec.rb +78 -80
  79. data/spec/lib/moose_inventory/cli/host_addvar_spec.rb +122 -122
  80. data/spec/lib/moose_inventory/cli/host_get_spec.rb +16 -16
  81. data/spec/lib/moose_inventory/cli/host_list_spec.rb +8 -8
  82. data/spec/lib/moose_inventory/cli/host_listvar_spec.rb +50 -52
  83. data/spec/lib/moose_inventory/cli/host_rm_spec.rb +12 -12
  84. data/spec/lib/moose_inventory/cli/host_rmgroup_spec.rb +48 -51
  85. data/spec/lib/moose_inventory/cli/host_rmvar_spec.rb +136 -136
  86. data/spec/lib/moose_inventory/config/config_spec.rb +16 -3
  87. data/spec/lib/moose_inventory/db/db_spec.rb +386 -2
  88. data/spec/lib/moose_inventory/db/models_spec.rb +10 -11
  89. data/spec/lib/moose_inventory/operations/add_associations_spec.rb +77 -0
  90. data/spec/lib/moose_inventory/operations/add_groups_spec.rb +65 -0
  91. data/spec/lib/moose_inventory/operations/add_hosts_spec.rb +69 -0
  92. data/spec/lib/moose_inventory/operations/group_child_relations_spec.rb +76 -0
  93. data/spec/lib/moose_inventory/operations/remove_associations_spec.rb +78 -0
  94. data/spec/lib/moose_inventory/operations/remove_groups_spec.rb +57 -0
  95. data/spec/shared/shared_config_setup.rb +2 -2
  96. data/spec/spec_helper.rb +7 -8
  97. metadata +157 -105
  98. data/.coveralls.yml +0 -0
  99. data/Guardfile +0 -38
  100. data/config/dotfiles/coveralls.yml +0 -0
  101. data/config/dotfiles/gitignore +0 -20
  102. data/config/dotfiles/rubocop.yml +0 -793
  103. data/scripts/guard_quality.sh +0 -3
  104. data/scripts/guard_test.sh +0 -2
@@ -9,7 +9,7 @@ RSpec.describe Moose::Inventory::Cli::Group do
9
9
  @mockarg_parts = {
10
10
  config: File.join(spec_root, 'config/config.yml'),
11
11
  format: 'yaml',
12
- env: 'test'
12
+ env: 'test',
13
13
  }
14
14
 
15
15
  @mockargs = []
@@ -19,7 +19,7 @@ RSpec.describe Moose::Inventory::Cli::Group do
19
19
  end
20
20
 
21
21
  @console = Moose::Inventory::Cli::Formatter
22
-
22
+
23
23
  @config = Moose::Inventory::Config
24
24
  @config.init(@mockargs)
25
25
 
@@ -49,65 +49,63 @@ RSpec.describe Moose::Inventory::Cli::Group do
49
49
  @app.start(%w(group addchild))
50
50
  end
51
51
 
52
- #@console.out(actual, 'y')
53
-
52
+ # @console.out(actual, 'y')
53
+
54
54
  # Check output
55
- desired = { aborted: true}
55
+ desired = { aborted: true }
56
56
  desired[:STDERR] = "ERROR: Wrong number of arguments, 0 for 2 or more.\n"
57
57
  expected(actual, desired)
58
58
  end
59
-
59
+
60
60
  #------------------------
61
61
  it 'ungrouped ... should abort with an error' do
62
- parent_name = "ungrouped"
63
- child_name = "fake"
64
-
65
- actual = runner do
62
+ parent_name = 'ungrouped'
63
+ child_name = 'fake'
64
+
65
+ actual = runner do
66
66
  @app.start(%W(group addchild #{parent_name} #{child_name}))
67
67
  end
68
68
 
69
- #@console.out(actual, 'y')
70
-
69
+ # @console.out(actual, 'y')
70
+
71
71
  # Check output
72
- desired = { aborted: true}
72
+ desired = { aborted: true }
73
73
  desired[:STDERR] = "ERROR: Cannot manually manipulate the automatic group 'ungrouped'.\n"
74
74
  expected(actual, desired)
75
-
75
+
76
76
  ############################
77
- # Should work the other way round too, when the child in the ungrouped item
78
- parent_name = "fake"
79
- child_name = "ungrouped"
80
-
81
- actual = runner do
77
+ # Should work the other way round too, when the child in the ungrouped item
78
+ parent_name = 'fake'
79
+ child_name = 'ungrouped'
80
+
81
+ actual = runner do
82
82
  @app.start(%W(group rmchild #{parent_name} #{child_name}))
83
83
  end
84
84
 
85
- #@console.out(actual, 'y')
86
-
85
+ # @console.out(actual, 'y')
86
+
87
87
  # Check output
88
- desired = { aborted: true}
88
+ desired = { aborted: true }
89
89
  desired[:STDERR] = "ERROR: Cannot manually manipulate the automatic group 'ungrouped'.\n"
90
90
  expected(actual, desired)
91
-
92
- end
91
+ end
93
92
 
94
93
  #------------------------
95
94
  it 'GROUP CHILDGROUP ... should abort if GROUP does not exist' do
96
-
97
95
  pname = 'parent_group'
98
96
  cname = 'child group'
99
-
97
+
100
98
  actual = runner do
101
99
  @app.start(%W(group rmchild #{pname} #{cname}))
102
100
  end
103
101
 
104
- #@console.out(actual, 'y')
102
+ # @console.out(actual, 'y')
105
103
  # Check output
106
- desired = { aborted: true}
107
- desired[:STDOUT] =
104
+ desired = { aborted: true }
105
+ desired[:STDOUT] =
108
106
  "Dissociate parent group '#{pname}' from child group(s) '#{cname}':\n"\
109
107
  " - retrieve group '#{pname}'...\n"
110
- desired[:STDERR] =
108
+ desired[:STDERR] =
111
109
  "ERROR: The group '#{pname}' does not exist.\n"\
112
110
  "An error occurred during a transaction, any changes have been rolled back.\n"
113
111
  expected(actual, desired)
@@ -115,21 +113,20 @@ RSpec.describe Moose::Inventory::Cli::Group do
115
113
 
116
114
  #------------------------
117
115
  it 'GROUP CHILDGROUP ... should succeed with warnings if CHILDGROUP is not associated' do
118
-
119
116
  pname = 'parent_group'
120
117
  cname = 'child group'
121
118
 
122
119
  runner { @app.start(%W(group add #{pname} #{cname})) }
123
-
120
+
124
121
  actual = runner do
125
122
  @app.start(%W(group rmchild #{pname} #{cname}))
126
123
  end
127
124
 
128
- #@console.out(actual, 'y')
129
-
125
+ # @console.out(actual, 'y')
126
+
130
127
  # Check output
131
128
  desired = {}
132
- desired[:STDOUT] =
129
+ desired[:STDOUT] =
133
130
  "Dissociate parent group '#{pname}' from child group(s) '#{cname}':\n"\
134
131
  " - retrieve group '#{pname}'...\n"\
135
132
  " - OK\n"\
@@ -137,9 +134,9 @@ RSpec.describe Moose::Inventory::Cli::Group do
137
134
  " - doesn't exist, skipping.\n"\
138
135
  " - OK\n"\
139
136
  " - all OK\n"\
140
- "Succeeded, with warnings.\n"
141
-
142
- desired[:STDERR] =
137
+ "Succeeded, with warnings.\n"
138
+
139
+ desired[:STDERR] =
143
140
  "WARNING: Association {group:#{pname} <-> group:#{cname}} does not exist, skipping.\n"
144
141
 
145
142
  expected(actual, desired)
@@ -147,31 +144,75 @@ RSpec.describe Moose::Inventory::Cli::Group do
147
144
 
148
145
  #------------------------
149
146
  it 'GROUP CHILDGROUP ... should succeed without warnings if CHILDGROUP is associated' do
150
-
151
147
  pname = 'parent_group'
152
148
  cname = 'child group'
153
149
 
154
150
  runner { @app.start(%W(group add #{pname} #{cname})) }
155
151
  runner { @app.start(%W(group addchild #{pname} #{cname})) }
156
-
152
+
157
153
  actual = runner do
158
154
  @app.start(%W(group rmchild #{pname} #{cname}))
159
155
  end
160
156
 
161
- #@console.out(actual, 'y')
162
-
157
+ # @console.out(actual, 'y')
158
+
163
159
  # Check output
164
160
  desired = {}
165
- desired[:STDOUT] =
161
+ desired[:STDOUT] =
166
162
  "Dissociate parent group '#{pname}' from child group(s) '#{cname}':\n"\
167
163
  " - retrieve group '#{pname}'...\n"\
168
164
  " - OK\n"\
169
165
  " - remove association {group:#{pname} <-> group:#{cname}}...\n"\
170
166
  " - OK\n"\
171
167
  " - all OK\n"\
172
- "Succeeded.\n"
173
-
168
+ "Succeeded.\n"
169
+
174
170
  expected(actual, desired)
175
171
  end
172
+
173
+ #------------------------
174
+ it 'GROUP CHILDGROUP --delete-orphans ... should delete orphaned child groups recursively' do
175
+ runner { @app.start(%w(group add parent)) }
176
+ runner { @app.start(%w(group add child --hosts child-host)) }
177
+ runner { @app.start(%w(group add grandchild)) }
178
+ runner { @app.start(%w(group addchild parent child)) }
179
+ runner { @app.start(%w(group addchild child grandchild)) }
180
+
181
+ actual = runner do
182
+ @app.start(%w(group rmchild --delete-orphans parent child))
183
+ end
184
+
185
+ expect(actual[:unexpected]).to eq(false)
186
+ expect(actual[:aborted]).to eq(false)
187
+ expect(actual[:STDOUT]).to include("- Recursively delete orphaned group 'child'...\n")
188
+ expect(actual[:STDOUT]).to include("- Recursively delete orphaned group 'grandchild'...\n")
189
+
190
+ expect(@db.models[:group].find(name: 'parent')).not_to be_nil
191
+ %w(child grandchild).each do |name|
192
+ expect(@db.models[:group].find(name: name)).to be_nil
193
+ end
194
+
195
+ host = @db.models[:host].find(name: 'child-host')
196
+ expect(host.groups_dataset[name: 'ungrouped']).not_to be_nil
197
+ end
198
+
199
+ #------------------------
200
+ it 'GROUP CHILDGROUP --delete-orphans ... should preserve child groups with another parent' do
201
+ runner { @app.start(%w(group add parent other-parent)) }
202
+ runner { @app.start(%w(group addchild parent child)) }
203
+ runner { @app.start(%w(group addchild other-parent child)) }
204
+
205
+ actual = runner do
206
+ @app.start(%w(group rmchild --delete-orphans parent child))
207
+ end
208
+
209
+ expect(actual[:unexpected]).to eq(false)
210
+ expect(actual[:aborted]).to eq(false)
211
+
212
+ child = @db.models[:group].find(name: 'child')
213
+ expect(child).not_to be_nil
214
+ expect(child.parents_dataset[name: 'parent']).to be_nil
215
+ expect(child.parents_dataset[name: 'other-parent']).not_to be_nil
216
+ end
176
217
  end
177
218
  end
@@ -9,7 +9,7 @@ RSpec.describe Moose::Inventory::Cli::Group do
9
9
  @mockarg_parts = {
10
10
  config: File.join(spec_root, 'config/config.yml'),
11
11
  format: 'yaml',
12
- env: 'test'
12
+ env: 'test',
13
13
  }
14
14
 
15
15
  @mockargs = []
@@ -41,7 +41,7 @@ RSpec.describe Moose::Inventory::Cli::Group do
41
41
  result = @group.instance_methods(false).include?(:rmhost)
42
42
  expect(result).to eq(true)
43
43
  end
44
-
44
+
45
45
  #----------------
46
46
 
47
47
  #------------------------
@@ -51,7 +51,7 @@ RSpec.describe Moose::Inventory::Cli::Group do
51
51
  end
52
52
 
53
53
  # Check output
54
- desired = { aborted: true}
54
+ desired = { aborted: true }
55
55
  desired[:STDERR] = "ERROR: Wrong number of arguments, 0 for 2 or more.\n"
56
56
  expected(actual, desired)
57
57
  end
@@ -65,16 +65,16 @@ RSpec.describe Moose::Inventory::Cli::Group do
65
65
  end
66
66
 
67
67
  # Check output
68
- desired = { aborted: true}
69
- desired[:STDOUT] =
68
+ desired = { aborted: true }
69
+ desired[:STDOUT] =
70
70
  "Dissociate group '#{group_name}' from host(s) '#{host_name}':\n"\
71
71
  " - retrieve group '#{group_name}'...\n"
72
- desired[:STDERR] =
72
+ desired[:STDERR] =
73
73
  "ERROR: The group '#{group_name}' does not exist.\n"\
74
74
  "An error occurred during a transaction, any changes have been rolled back.\n"
75
75
  expected(actual, desired)
76
76
  end
77
-
77
+
78
78
  #------------------------
79
79
  it 'GROUP HOST ... should dissociate the group from an existing group' do
80
80
  host_name = 'test1'
@@ -82,22 +82,22 @@ RSpec.describe Moose::Inventory::Cli::Group do
82
82
 
83
83
  runner { @app.start(%W(host add #{host_name})) }
84
84
  runner { @app.start(%W(group add #{group_name})) }
85
- runner { @app.start(%W(group addhost #{group_name} #{host_name} )) }
85
+ runner { @app.start(%W(group addhost #{group_name} #{host_name})) }
86
86
 
87
87
  #
88
88
  # Dissociate the host
89
89
  # 1. expect that the group association is removed
90
90
  # 2. expect that no association with ungrouped is made.
91
-
91
+
92
92
  actual = runner do
93
- @app.start(%W(group rmhost #{group_name} #{host_name} ))
93
+ @app.start(%W(group rmhost #{group_name} #{host_name}))
94
94
  end
95
-
96
- #@console.dump(actual, 'y')
97
-
95
+
96
+ # @console.dump(actual, 'y')
97
+
98
98
  # rubocop:disable Metrics/LineLength
99
- desired = { aborted: false}
100
- desired[:STDOUT] =
99
+ desired = { aborted: false }
100
+ desired[:STDOUT] =
101
101
  "Dissociate group '#{group_name}' from host(s) '#{host_name}':\n"\
102
102
  " - retrieve group '#{group_name}'...\n"\
103
103
  " - OK\n"\
@@ -115,56 +115,55 @@ RSpec.describe Moose::Inventory::Cli::Group do
115
115
  hosts = group.hosts_dataset
116
116
  expect(hosts.count).to eq(0)
117
117
  end
118
-
118
+
119
119
  #------------------------
120
120
  it 'GROUP HOST ... should warn about non-existing associations' do
121
121
  # 1. Should warn that the association doesn't exist.
122
- # 2. Should complete with success. (desired state == actual state)
123
-
122
+ # 2. Should complete with success. (desired state == actual state)
123
+
124
124
  host_name = 'test_host'
125
125
  group_name = 'test_group'
126
126
  runner { @app.start(%W(host add #{host_name})) }
127
127
  runner { @app.start(%W(group add #{group_name})) }
128
128
  runner { @app.start(%W(group addhost #{host_name})) }
129
-
129
+
130
130
  actual = runner do
131
- @app.start(%W(group rmhost #{group_name} #{host_name}))
131
+ @app.start(%W(group rmhost #{group_name} #{host_name}))
132
132
  end
133
-
133
+
134
134
  # rubocop:disable Metrics/LineLength
135
- desired = { aborted: false}
136
- desired[:STDOUT] =
135
+ desired = { aborted: false }
136
+ desired[:STDOUT] =
137
137
  "Dissociate group '#{group_name}' from host(s) '#{host_name}':\n"\
138
138
  " - retrieve group \'#{group_name}\'...\n"\
139
139
  " - OK\n"\
140
- " - remove association {group:#{group_name } <-> host:#{host_name}}...\n"\
140
+ " - remove association {group:#{group_name} <-> host:#{host_name}}...\n"\
141
141
  " - doesn't exist, skipping.\n"\
142
142
  " - OK\n"\
143
143
  " - all OK\n"\
144
144
  "Succeeded, with warnings.\n"
145
- desired[:STDERR] =
145
+ desired[:STDERR] =
146
146
  "WARNING: Association {group:#{group_name} <-> host:#{host_name}} "\
147
- "doesn't exist, skipping.\n"
147
+ "doesn't exist, skipping.\n"
148
148
 
149
149
  expected(actual, desired)
150
- end
150
+ end
151
151
 
152
152
  #------------------------
153
153
  it '\'ungrouped\' HOST ... should abort with an error' do
154
-
155
154
  host_name = 'test_host'
156
155
  group_name = 'ungrouped'
157
156
 
158
157
  runner { @app.start(%W(host add #{name})) } # <- auto creates the association with ungrouped
159
158
 
160
- actual = runner { @app.start(%W(group rmhost #{group_name} #{host_name} )) }
159
+ actual = runner { @app.start(%W(group rmhost #{group_name} #{host_name})) }
161
160
 
162
- desired = { aborted: true}
161
+ desired = { aborted: true }
163
162
  desired[:STDERR] =
164
163
  "ERROR: Cannot manually manipulate the automatic group 'ungrouped'.\n"
165
164
  expected(actual, desired)
166
165
  end
167
-
166
+
168
167
  #------------------------
169
168
  it 'GROUP HOST1 HOST2 ... should dissociate the group from'\
170
169
  ' multiple hosts at once' do
@@ -173,33 +172,31 @@ RSpec.describe Moose::Inventory::Cli::Group do
173
172
  # if it has no other groups.
174
173
 
175
174
  group_name = 'test_group'
176
- host_names = %W( test_host1 test_host2 test_host3 )
175
+ host_names = %w(test_host1 test_host2 test_host3)
176
+
177
+ runner { @app.start(%W(group add #{group_name})) }
178
+ runner { @app.start(%W(group addhost #{group_name}) + host_names) }
177
179
 
178
- runner { @app.start(%W(group add #{group_name} )) }
179
- runner { @app.start(%W(group addhost #{group_name}) + host_names) }
180
-
181
180
  actual = runner do
182
181
  @app.start(%W(group rmhost #{group_name}) + host_names)
183
182
  end
184
183
 
185
- #@console.out(actual, 'y')
186
-
187
- # rubocop:disable Metrics/LineLength
188
- desired = { aborted: false}
184
+ # @console.out(actual, 'y')
185
+ desired = { aborted: false }
189
186
  desired[:STDOUT] =
190
187
  "Dissociate group '#{group_name}' from host(s) '#{host_names.join(',')}':\n"\
191
188
  " - retrieve group \'#{group_name}\'...\n"\
192
189
  " - OK\n"
193
190
  host_names.each do |host|
194
191
  desired[:STDOUT] = desired[:STDOUT] +
195
- " - remove association {group:#{group_name} <-> host:#{host}}...\n"\
196
- " - OK\n"\
197
- " - add automatic association {group:ungrouped <-> host:#{host}}...\n"\
198
- " - OK\n"\
192
+ " - remove association {group:#{group_name} <-> host:#{host}}...\n"\
193
+ " - OK\n"\
194
+ " - add automatic association {group:ungrouped <-> host:#{host}}...\n"\
195
+ " - OK\n"\
199
196
  end
200
197
  desired[:STDOUT] = desired[:STDOUT] +
201
- " - all OK\n"\
202
- "Succeeded.\n"
198
+ " - all OK\n"\
199
+ "Succeeded.\n"
203
200
  expected(actual, desired)
204
201
  # rubocop:enable Metrics/LineLength
205
202
 
@@ -210,6 +207,6 @@ RSpec.describe Moose::Inventory::Cli::Group do
210
207
  host_names.each do |host|
211
208
  expect(hosts[name: host]).to be_nil
212
209
  end
213
- end
210
+ end
214
211
  end
215
212
  end