onceover 3.11.1 → 3.12.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 +5 -5
- data/Gemfile +2 -0
- data/features/formatting.feature +36 -0
- data/features/step_definitions/formatter.rb +41 -0
- data/lib/onceover/cli/run.rb +1 -1
- data/lib/onceover/controlrepo.rb +1 -1
- data/lib/onceover/rspec/formatters.rb +239 -0
- data/lib/onceover/testconfig.rb +1 -1
- data/onceover.gemspec +1 -1
- data/templates/error_summary.yaml.erb +14 -0
- data/templates/spec_helper.rb.erb +9 -21
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3e2b22d1ea208cdaeeeb71b5a99e2f55f6056cb2
|
4
|
+
data.tar.gz: d29bad7de9cfd34c55ece9b69bbb73b5b48cb182
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: add796e1d03519fb411c5b2bc5a27b5ff0f00e52b9cea682aeb06b21ec31d36ddfcbbf5209a88fe9eda2a26650d49be47d611096f264b21e97302134faa7b8f0
|
7
|
+
data.tar.gz: 73ec3b013c0c02598fa04d99dee1721b91c40d40ec2bd174e24393177f3052ee084d222afbf8791bbaeda8ae0263679e2a88e5c53b78e31ad3728c934b142d55
|
data/Gemfile
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
@formatting
|
2
|
+
Feature: Format errors nicely
|
3
|
+
I would like Onceover to format errors nicely so that they are easily read
|
4
|
+
|
5
|
+
Background:
|
6
|
+
Given the OnceoverFormatter
|
7
|
+
|
8
|
+
Scenario: Parse a missing class error
|
9
|
+
When Puppet throws the error: "error during compilation: Evaluation Error: Error while evaluating a Function Call, Could not find class ::role::websevrer for server01.foo.com (line: 17, column: 1) on node server01.foo.com"
|
10
|
+
Then the error should parse successfully
|
11
|
+
And it should find 1 error
|
12
|
+
And the parsed error should contain the following keys: text, line, column
|
13
|
+
|
14
|
+
Scenario: Parse an incorrect parameter error
|
15
|
+
When Puppet throws the error: "error during compilation: Evaluation Error: Error while evaluating a Resource Statement, Class[Docker]: has no parameter named 'package_name' (file: /some/path/tp/the/file/module/manifests/profile/docker.pp, line: 8, column: 1) on node server01.foo.com"
|
16
|
+
Then the error should parse successfully
|
17
|
+
And it should find 1 error
|
18
|
+
And the parsed error should contain the following keys: text, file, line, column
|
19
|
+
|
20
|
+
Scenario: Parse a duplication declaration error
|
21
|
+
When Puppet throws the error: "error during compilation: Evaluation Error: Error while evaluating a Resource Statement, Duplicate declaration: Package[virtualenv] is already declared at (file: /some/path/tp/the/file/foo/manifests/profile/ti2.pp, line: 31); cannot redeclare (file: /some/path/tp/the/file/python/manifests/install.pp, line: 54) (file: /some/path/tp/the/file/python/manifests/install.pp, line: 54, column: 3) on node server01.foo.co"
|
22
|
+
Then the error should parse successfully
|
23
|
+
And it should find 2 errors
|
24
|
+
And the parsed errors should contain the following keys: text, file, line, column
|
25
|
+
|
26
|
+
Scenario: Parse a lookup failure error
|
27
|
+
When Puppet throws the error: "error during compilation: Function lookup() did not find a value for the name 'archvsync::repositories' on node server01.foo.com"
|
28
|
+
Then the error should parse successfully
|
29
|
+
And it should find 1 errors
|
30
|
+
And the parsed errors should contain the following keys: text
|
31
|
+
|
32
|
+
Scenario: Fail to parse an error and survive anyway
|
33
|
+
When Puppet throws the error: "Derp derp derp. This error is 💩"
|
34
|
+
Then the error should parse successfully
|
35
|
+
And it should find 1 errors
|
36
|
+
And the parsed errors should contain the following keys: text
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Given(/^the OnceoverFormatter$/) do
|
2
|
+
require 'rspec'
|
3
|
+
require 'onceover/rspec/formatters'
|
4
|
+
|
5
|
+
RSpec.configure do |c|
|
6
|
+
# Create onceover settings to be accessed by formatters
|
7
|
+
c.add_setting :onceover_tempdir
|
8
|
+
c.add_setting :onceover_root
|
9
|
+
c.add_setting :onceover_environmentpath
|
10
|
+
|
11
|
+
c.onceover_tempdir = "/Users/foo/git/controlrepo/.onceover"
|
12
|
+
c.onceover_root = "/Users/foo/git/controlrepo"
|
13
|
+
c.onceover_environmentpath = "etc/puppetlabs/code/environments"
|
14
|
+
end
|
15
|
+
|
16
|
+
@formatter = OnceoverFormatter.new(STDOUT)
|
17
|
+
end
|
18
|
+
|
19
|
+
When(/^Puppet throws the error: "(.*)"$/) do |error|
|
20
|
+
@error = error
|
21
|
+
end
|
22
|
+
|
23
|
+
Then(/^the error should parse successfully$/) do
|
24
|
+
expect do
|
25
|
+
@parsed_error = @formatter.parse_errors(@error)
|
26
|
+
end.to_not raise_error
|
27
|
+
end
|
28
|
+
|
29
|
+
Then(/^it should find (\d+) errors?$/) do |number|
|
30
|
+
expect(@parsed_error.length).to be(number.to_i)
|
31
|
+
end
|
32
|
+
|
33
|
+
Then(/^the parsed errors? should contain the following keys: (.*)$/) do |keys|
|
34
|
+
# Split the keys into an array
|
35
|
+
keys = keys.split(',').map(&:strip)
|
36
|
+
@parsed_error.each do |error|
|
37
|
+
keys.each do |k|
|
38
|
+
expect(error).to have_key(k.to_sym)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/onceover/cli/run.rb
CHANGED
@@ -41,7 +41,7 @@ This includes deploying using r10k and running all custom tests.
|
|
41
41
|
summary 'Runs spec tests'
|
42
42
|
|
43
43
|
optional :p, :parallel, 'Runs spec tests in parallel. This increases speed at the cost of poorly formatted logs and irrelevant junit output.'
|
44
|
-
optional nil, :format, 'Which RSpec formatter to use, valid options are: documentation, progress, FailureCollector. You also specify this multiple times', multiple: true, default: :defaults
|
44
|
+
optional nil, :format, 'Which RSpec formatter to use, valid options are: documentation, progress, FailureCollector, OnceoverFormatter. You also specify this multiple times', multiple: true, default: :defaults
|
45
45
|
|
46
46
|
run do |opts, args, cmd|
|
47
47
|
repo = Onceover::Controlrepo.new(opts)
|
data/lib/onceover/controlrepo.rb
CHANGED
@@ -297,7 +297,7 @@ class Onceover
|
|
297
297
|
threads.map(&:join)
|
298
298
|
puppetfile_string = queue.pop
|
299
299
|
|
300
|
-
File.open(@puppetfile, 'w') {|f| f.
|
300
|
+
File.open(@puppetfile, 'w') {|f| f.puts(puppetfile_string.join("\n")) }
|
301
301
|
puts "#{'changed'.yellow} #{@puppetfile}"
|
302
302
|
end
|
303
303
|
|
@@ -0,0 +1,239 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
class OnceoverFormatter
|
4
|
+
RSpec::Core::Formatters.register self, :example_group_started,
|
5
|
+
:example_passed, :example_failed, :example_pending, :dump_failures#, :dump_summary
|
6
|
+
|
7
|
+
COMPILATION_ERROR = %r{error during compilation: (?<error>.*)}
|
8
|
+
ERROR_WITH_LOCATION = %r{(?<error>.*?)\s(at )?(\((file: (?<file>.*?), )?line: (?<line>\d+)(, column: (?<column>\d+))?\))(; )?}
|
9
|
+
ERROR_WITHOUT_LOCATION = %r{(?<error>.*?)\son node}
|
10
|
+
|
11
|
+
def initialize output
|
12
|
+
@output = output
|
13
|
+
@previous_role = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def example_group_started notification
|
17
|
+
if notification.group.parent_groups == [notification.group]
|
18
|
+
# If this is the highest level group (The role)
|
19
|
+
role = notification.group.description
|
20
|
+
if role != @previous_role
|
21
|
+
@output << "\n"
|
22
|
+
@output << class_name("#{notification.group.description}:")
|
23
|
+
|
24
|
+
# Calculate the padding required
|
25
|
+
padding = (longest_group - role.length) + 1
|
26
|
+
# Create padding
|
27
|
+
padding.times { @output << ' ' }
|
28
|
+
|
29
|
+
# Save the role name
|
30
|
+
@previous_role = role
|
31
|
+
end
|
32
|
+
else
|
33
|
+
# If not then this will be a test for that role
|
34
|
+
@output << '? '
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def example_passed notification
|
39
|
+
@output << "\b\b"
|
40
|
+
@output << "#{green('P')} "
|
41
|
+
end
|
42
|
+
|
43
|
+
def example_failed notification
|
44
|
+
@output << "\b\b"
|
45
|
+
@output << "#{red('F')} "
|
46
|
+
end
|
47
|
+
|
48
|
+
def example_pending notification
|
49
|
+
@output << "\b\b"
|
50
|
+
@output << "#{yellow('?')} "
|
51
|
+
end
|
52
|
+
|
53
|
+
def dump_failures notification
|
54
|
+
require 'onceover/controlrepo'
|
55
|
+
|
56
|
+
# Group by role
|
57
|
+
grouped = notification.failed_examples.group_by { |e| e.metadata[:example_group][:parent_example_group][:description]}
|
58
|
+
|
59
|
+
# Further group by error
|
60
|
+
grouped.each do |role, failures|
|
61
|
+
grouped[role] = failures.uniq { |f| f.metadata[:execution_result].exception.to_s }
|
62
|
+
end
|
63
|
+
|
64
|
+
# Put some spacing before the results
|
65
|
+
@output << "\n\n\n"
|
66
|
+
|
67
|
+
grouped.each do |role, failures|
|
68
|
+
role = {
|
69
|
+
name: role,
|
70
|
+
errors: failures.map { |f| parse_errors(f.metadata[:execution_result].exception.to_s)}.flatten,
|
71
|
+
}
|
72
|
+
|
73
|
+
@output << Onceover::Controlrepo.evaluate_template('error_summary.yaml.erb', binding)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def parse_errors(raw_error)
|
78
|
+
# Check if the error is a compilation error
|
79
|
+
match = COMPILATION_ERROR.match(raw_error)
|
80
|
+
if match
|
81
|
+
compilation_error = match['error']
|
82
|
+
# Check if we car parse it
|
83
|
+
if ERROR_WITH_LOCATION.match(compilation_error)
|
84
|
+
scanned_errors = match['error'].scan(ERROR_WITH_LOCATION)
|
85
|
+
|
86
|
+
# Delete any matches where there was no error text
|
87
|
+
scanned_errors.delete_if { |e| e.first.empty? }
|
88
|
+
|
89
|
+
scanned_errors.map do |error_matches|
|
90
|
+
{
|
91
|
+
text: error_matches[0],
|
92
|
+
file: calculate_relative_source(error_matches[1]),
|
93
|
+
line: error_matches[2],
|
94
|
+
column: error_matches[3],
|
95
|
+
}
|
96
|
+
end
|
97
|
+
elsif ERROR_WITHOUT_LOCATION.match(compilation_error)
|
98
|
+
scanned_errors = match['error'].scan(ERROR_WITHOUT_LOCATION)
|
99
|
+
|
100
|
+
# Delete any matches where there was no error text
|
101
|
+
scanned_errors.delete_if { |e| e.first.empty? }
|
102
|
+
|
103
|
+
scanned_errors.map do |error_matches|
|
104
|
+
{
|
105
|
+
text: error_matches[0],
|
106
|
+
}
|
107
|
+
end
|
108
|
+
else
|
109
|
+
[{
|
110
|
+
text: raw_error,
|
111
|
+
}]
|
112
|
+
end
|
113
|
+
else
|
114
|
+
[{
|
115
|
+
text: raw_error,
|
116
|
+
}]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# This method calculates where the original source file is relative to the
|
121
|
+
# user's current location. This is more compliacted than it sounds because
|
122
|
+
# if we are running from the root of the controlrepo and we have an error in:
|
123
|
+
#
|
124
|
+
# /Users/dylan/git/puppet_controlrepo/.onceover/etc/puppetlabs/code/environments/production/site/role/manifests/lb.pp
|
125
|
+
#
|
126
|
+
# We need that to end up pointing at the original source file not the cached
|
127
|
+
# one i.e.
|
128
|
+
#
|
129
|
+
# site/role/manifests/lb.pp
|
130
|
+
#
|
131
|
+
def calculate_relative_source(file)
|
132
|
+
return nil if file.nil?
|
133
|
+
|
134
|
+
file = Pathname.new(file)
|
135
|
+
tempdir = Pathname.new(RSpec.configuration.onceover_tempdir)
|
136
|
+
root = Pathname.new(RSpec.configuration.onceover_root)
|
137
|
+
environmentpath = Pathname.new(RSpec.configuration.onceover_environmentpath)
|
138
|
+
|
139
|
+
# Calculate the full relative path
|
140
|
+
file.relative_path_from(tempdir + environmentpath + "production").to_s
|
141
|
+
end
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
# Below are defined the styles for the output
|
146
|
+
def class_name(text)
|
147
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :bold)
|
148
|
+
end
|
149
|
+
|
150
|
+
def black(text)
|
151
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :black)
|
152
|
+
end
|
153
|
+
|
154
|
+
def red(text)
|
155
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :red)
|
156
|
+
end
|
157
|
+
|
158
|
+
def green(text)
|
159
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :green)
|
160
|
+
end
|
161
|
+
|
162
|
+
def yellow(text)
|
163
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :yellow)
|
164
|
+
end
|
165
|
+
|
166
|
+
def blue(text)
|
167
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :blue)
|
168
|
+
end
|
169
|
+
|
170
|
+
def magenta(text)
|
171
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :magenta)
|
172
|
+
end
|
173
|
+
|
174
|
+
def cyan(text)
|
175
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :cyan)
|
176
|
+
end
|
177
|
+
|
178
|
+
def white(text)
|
179
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :white)
|
180
|
+
end
|
181
|
+
|
182
|
+
def bold(text)
|
183
|
+
RSpec::Core::Formatters::ConsoleCodes.wrap(text, :bold)
|
184
|
+
end
|
185
|
+
|
186
|
+
def longest_group
|
187
|
+
RSpec.configuration.world.example_groups.max { |a,b| a.description.length <=> b.description.length}.description.length
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
# class OnceoverFormatterParallel < OnceoverFormatter
|
193
|
+
# require 'yaml'
|
194
|
+
|
195
|
+
# def example_group_started notification
|
196
|
+
# # Do nothing
|
197
|
+
# end
|
198
|
+
|
199
|
+
# def example_passed notification
|
200
|
+
# @output << green('P')
|
201
|
+
# end
|
202
|
+
|
203
|
+
# def example_failed notification
|
204
|
+
# @output << red('F')
|
205
|
+
# end
|
206
|
+
|
207
|
+
# def example_pending notification
|
208
|
+
# @output << yellow('?')
|
209
|
+
# end
|
210
|
+
|
211
|
+
# def dump_failures
|
212
|
+
# # TODO: This should write to a file and then get picked up and formatted by onceover itself
|
213
|
+
# # might need to use a module for the formatting
|
214
|
+
# require 'pry'
|
215
|
+
# binding.pry
|
216
|
+
# RSpec.configuration.onceover_tempdir
|
217
|
+
# end
|
218
|
+
|
219
|
+
# end
|
220
|
+
|
221
|
+
class FailureCollector
|
222
|
+
RSpec::Core::Formatters.register self, :dump_failures
|
223
|
+
|
224
|
+
def initialize(output)
|
225
|
+
FileUtils.touch(File.expand_path("#{RSpec.configuration.onceover_tempdir}/failures.out"))
|
226
|
+
end
|
227
|
+
|
228
|
+
def dump_failures(failures)
|
229
|
+
open(File.expand_path("#{RSpec.configuration.onceover_tempdir}/failures.out"), 'a') { |f|
|
230
|
+
failures.failed_examples.each do |fe|
|
231
|
+
f.puts
|
232
|
+
f.puts "#{fe.metadata[:description]}"
|
233
|
+
f.puts "#{fe.metadata[:execution_result].exception.to_s}"
|
234
|
+
f.puts "#{fe.metadata[:file_path]}:#{fe.metadata[:line_number]}"
|
235
|
+
f.puts "------------------------------------------------------"
|
236
|
+
end
|
237
|
+
}
|
238
|
+
end
|
239
|
+
end
|
data/lib/onceover/testconfig.rb
CHANGED
@@ -53,7 +53,7 @@ class Onceover
|
|
53
53
|
|
54
54
|
# Set dynamic defaults for format
|
55
55
|
if opts[:format] == [:defaults]
|
56
|
-
@formatters = opts[:parallel] ? ['documentation', 'FailureCollector'] : ['
|
56
|
+
@formatters = opts[:parallel] ? ['documentation', 'FailureCollector'] : ['OnceoverFormatter']
|
57
57
|
else
|
58
58
|
@formatters = opts[:format]
|
59
59
|
end
|
data/onceover.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "onceover"
|
7
|
-
s.version = "3.
|
7
|
+
s.version = "3.12.0"
|
8
8
|
s.authors = ["Dylan Ratcliffe"]
|
9
9
|
s.email = ["dylan.ratcliffe@puppet.com"]
|
10
10
|
s.homepage = "https://github.com/dylanratcliffe/onceover"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<%= bold(role[:name]) %>: <%= red('failed') %>
|
2
|
+
errors:
|
3
|
+
<% role[:errors].each do |error| -%>
|
4
|
+
<%= red(error[:text]) %>
|
5
|
+
<% if error[:file] -%>
|
6
|
+
file: <%= bold(error[:file]) %>
|
7
|
+
<% end -%>
|
8
|
+
<% if error[:line] -%>
|
9
|
+
line: <%= bold(error[:line]) %>
|
10
|
+
<% end -%>
|
11
|
+
<% if error[:column] -%>
|
12
|
+
column: <%= bold(error[:column]) %>
|
13
|
+
<% end -%>
|
14
|
+
<% end -%>
|
@@ -14,30 +14,18 @@ end
|
|
14
14
|
|
15
15
|
require 'puppetlabs_spec_helper/module_spec_helper'
|
16
16
|
require 'rspec_junit_formatter'
|
17
|
+
require 'onceover/rspec/formatters'
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
puts "Initializing FailureCollector"
|
24
|
-
FileUtils.touch(File.expand_path('<%= repo.tempdir %>/failures.out'))
|
25
|
-
end
|
19
|
+
RSpec.configure do |c|
|
20
|
+
# Create onceover settings to be accessed by formatters
|
21
|
+
c.add_setting :onceover_tempdir
|
22
|
+
c.add_setting :onceover_root
|
23
|
+
c.add_setting :onceover_environmentpath
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
f.puts
|
31
|
-
f.puts "#{fe.metadata[:description]}"
|
32
|
-
f.puts "#{fe.metadata[:execution_result].exception.to_s}"
|
33
|
-
f.puts "#{fe.metadata[:file_path]}:#{fe.metadata[:line_number]}"
|
34
|
-
f.puts "------------------------------------------------------"
|
35
|
-
end
|
36
|
-
}
|
37
|
-
end
|
38
|
-
end
|
25
|
+
c.onceover_tempdir = <%= repo.tempdir.inspect %>
|
26
|
+
c.onceover_root = <%= repo.root.inspect %>
|
27
|
+
c.onceover_environmentpath = <%= repo.environmentpath.inspect %>
|
39
28
|
|
40
|
-
RSpec.configure do |c|
|
41
29
|
# Also add JUnit output in case people want to use that
|
42
30
|
c.add_formatter('RSpecJUnitFormatter','<%= repo.tempdir %>/spec.xml')
|
43
31
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onceover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dylan Ratcliffe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -343,12 +343,14 @@ files:
|
|
343
343
|
- factsets/solaris-11.2-sparc-64.json
|
344
344
|
- factsets/windows-10-64.json
|
345
345
|
- features/cache.feature
|
346
|
+
- features/formatting.feature
|
346
347
|
- features/help.feature
|
347
348
|
- features/init.feature
|
348
349
|
- features/run.feature
|
349
350
|
- features/show.feature
|
350
351
|
- features/step_definitions/cache.rb
|
351
352
|
- features/step_definitions/common.rb
|
353
|
+
- features/step_definitions/formatter.rb
|
352
354
|
- features/step_definitions/init.rb
|
353
355
|
- features/step_definitions/run.rb
|
354
356
|
- features/support/cache_helper.rb
|
@@ -370,6 +372,7 @@ files:
|
|
370
372
|
- lib/onceover/logger.rb
|
371
373
|
- lib/onceover/node.rb
|
372
374
|
- lib/onceover/rake_tasks.rb
|
375
|
+
- lib/onceover/rspec/formatters.rb
|
373
376
|
- lib/onceover/runner.rb
|
374
377
|
- lib/onceover/test.rb
|
375
378
|
- lib/onceover/testconfig.rb
|
@@ -423,6 +426,7 @@ files:
|
|
423
426
|
- templates/Rakefile.erb
|
424
427
|
- templates/acceptance_test_spec.rb.erb
|
425
428
|
- templates/controlrepo.yaml.erb
|
429
|
+
- templates/error_summary.yaml.erb
|
426
430
|
- templates/factsets_README.md.erb
|
427
431
|
- templates/nodeset.yaml.erb
|
428
432
|
- templates/pre_conditions_README.md.erb
|
@@ -449,7 +453,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
449
453
|
- !ruby/object:Gem::Version
|
450
454
|
version: '0'
|
451
455
|
requirements: []
|
452
|
-
|
456
|
+
rubyforge_project:
|
457
|
+
rubygems_version: 2.2.5
|
453
458
|
signing_key:
|
454
459
|
specification_version: 4
|
455
460
|
summary: Testing tools for Puppet controlrepos
|