puppet-check 1.6.0 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -1
- data/README.md +5 -16
- data/lib/puppet-check.rb +1 -1
- data/lib/puppet-check/cli.rb +1 -1
- data/lib/puppet-check/data_parser.rb +44 -9
- data/lib/puppet-check/puppet_parser.rb +6 -6
- data/lib/puppet-check/rspec_puppet_support.rb +1 -1
- data/spec/fixtures/task_metadata/task_bad.json +10 -0
- data/spec/fixtures/task_metadata/task_good.json +16 -0
- data/spec/puppet-check/data_parser_spec.rb +13 -1
- data/spec/puppet-check/regression_check_spec.rb +0 -2
- data/spec/puppet-check_spec.rb +2 -2
- data/spec/system/system_spec.rb +4 -4
- metadata +16 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4351237d9dbb4f8790fb4b3aa77dce9a3274b9146b566261ca089c4759c634ee
|
4
|
+
data.tar.gz: 4a6c8d9e48b456bea5a130e3984613f7cb923891c9fe6779ac481ffdc043a3c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dcf4c5c9ec7906f130f8ae74f61b1efaab297d33276f1587c88ac68bea8f25a09aa1deeac0ede9cee835e0b2bed95b404e1a208649df29e76693d56a37ab867c
|
7
|
+
data.tar.gz: 1b4a1c372216d42d5e0e547e98a606866d0576da2e494d56340eb7a025e0f3763a9139ca18c24165a473c03429c1cf271ca0606017889e29dfbead14a0e5e7da
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
### 1.6.
|
1
|
+
### 1.6.1 (Next)
|
2
|
+
- Removed check for hieradata nil/undef value for Hiera >= 5.
|
3
|
+
- Add rudimentary checks for task metadata.
|
4
|
+
- Preliminary support for Puppet 6.
|
5
|
+
- RSpec Puppet fixed its default `spec_helper`. Revert to loading it instead of generating a working one.
|
6
|
+
|
7
|
+
### 1.6.0
|
2
8
|
- Minimum Ruby version increased to 2.1.
|
3
9
|
- Minimum Puppet version increased to 3.7.
|
4
10
|
- Minimum Puppet-Lint and Rubocop increased to 2.0 and 0.51.0.
|
data/README.md
CHANGED
@@ -121,19 +121,8 @@ The following files have unrecognized formats and therefore were not processed:
|
|
121
121
|
-- foobarbaz
|
122
122
|
```
|
123
123
|
|
124
|
-
###
|
125
|
-
|
126
|
-
- Puppetlabs Spec Helper performs fewer types of checks.
|
127
|
-
- Puppetlabs Spec Helper has extra layers of gems in between it and the gems executing the checks.
|
128
|
-
- Puppetlabs Spec Helper does not allow interfacing through it to the gems executing the checks.
|
129
|
-
- Puppetlabs Spec Helper has no CLI.
|
130
|
-
- Puppetlabs Spec Helper intrinsically only executes spec tests against one module at a time.
|
131
|
-
- Puppetlabs Spec Helper requires an additional config file for RSpec Puppet support.
|
132
|
-
- Puppetlabs Spec Helper does not update external module dependencies in a stateful/persistent workspace and fails gracefully instead.
|
133
|
-
- Puppetlabs Spec Helper requires extra configuration items to setup self-module RSpec testing.
|
134
|
-
- Puppetlabs Spec Helper does not frontend to Octocatalog Diff or Test-Kitchen.
|
135
|
-
|
136
|
-
It is worth nothing that there is no current development objective for Puppet Check to achieve the same advanced level of robustness for spec testing that Puppetlabs Spec Helper enables. If you are performing standard spec testing on your Puppet code and data, then Puppet Check's spec testing is a fantastic lighter and faster alternative to Puppetlabs Spec Helper. If you require advanced and intricate capabilities in your spec testing (e.g. direct interfacing to the `Puppet::Parser::Scope` API), then you will likely prefer Puppetlabs Spec Helper's spec testing in conjunction with Puppet Check's file validation.
|
124
|
+
### What About Puppet Development Kit?
|
125
|
+
The fairly recent release of the Puppet Development Kit (PDK) will hopefully eventually bring about the capability to test and validate your Puppet code and data in a streamlined, efficient, comprehensive, and accurate fashion comparable to Puppet Check. Unfortunately, the PDK has not yet achieved feature or efficiency parity with Puppet Check. The goal is for the PDK to one day replace Puppet Check and for Puppet Check to enter maintenance mode, but for now Puppet Check is still needed to lead Puppet testing.
|
137
126
|
|
138
127
|
## Usage
|
139
128
|
Please see the [Gemspec](puppet-check.gemspec) for dependency information. All other dependencies should be fine with various versions. Puppet Check can be used with a CLI, Rake tasks, or API, from your system, rbenv, rvm, Docker, or Vagrant. Please note all interfaces (API by default, but can be modified) will ignore any directories named `fixtures` or specified paths with that directory during file checks and spec tests.
|
@@ -295,7 +284,7 @@ You can also use Puppet Check inside of Docker for quick, portable, and disposab
|
|
295
284
|
|
296
285
|
```dockerfile
|
297
286
|
# a reliable and small container at the moment
|
298
|
-
FROM ubuntu:
|
287
|
+
FROM ubuntu:18.04
|
299
288
|
# you need ruby and any other extra dependencies that come from packages; in this example we install git to use it for downloading external module dependencies
|
300
289
|
RUN apt-get update && apt-get install ruby git -y
|
301
290
|
# you need puppet-check and any other extra dependencies that come from gems; in this example we install reek because the ruby ABI is 2.3 and then rspec-puppet and rake for extra testing
|
@@ -304,7 +293,7 @@ RUN gem install --no-document puppet-check reek rspec-puppet rake
|
|
304
293
|
ENV LANG en_US.UTF-8
|
305
294
|
# create the directory for your module, directory environment, etc. and change directory into it
|
306
295
|
WORKDIR /module_name_or_directory_environment_name
|
307
|
-
# copy the module, directory environment, etc. contents into the corresponding directory inside the container
|
296
|
+
# copy the module, directory environment, etc. contents into the corresponding directory inside the container; alternative, bind a volume mount for your module(s) into the container at runtime
|
308
297
|
COPY / .
|
309
298
|
# execute your tests; in this example we are executing the full suite of tests
|
310
299
|
ENTRYPOINT ["rake", "puppetcheck"]
|
@@ -319,7 +308,7 @@ As an alternative to Docker, you can also use Vagrant for quick and disposable t
|
|
319
308
|
```ruby
|
320
309
|
Vagrant.configure(2) do |config|
|
321
310
|
# a reliable and small box at the moment
|
322
|
-
config.vm.box = 'fedora/
|
311
|
+
config.vm.box = 'fedora/26-cloud-base'
|
323
312
|
|
324
313
|
config.vm.provision 'shell', inline: <<-SHELL
|
325
314
|
# cd to '/vagrant'
|
data/lib/puppet-check.rb
CHANGED
@@ -113,7 +113,7 @@ class PuppetCheck
|
|
113
113
|
|
114
114
|
# do not process fixtures, check that at least one file was found, and remove double slashes
|
115
115
|
files.reject! { |file| file =~ /fixtures/ }
|
116
|
-
raise "puppet-check: no files found in supplied paths #{paths.join(', ')}." if files.empty?
|
116
|
+
raise "puppet-check: no files found in supplied paths '#{paths.join(', ')}'." if files.empty?
|
117
117
|
files.map! { |file| file.gsub('//', '/') }
|
118
118
|
|
119
119
|
files.uniq
|
data/lib/puppet-check/cli.rb
CHANGED
@@ -160,11 +160,43 @@ class DataParser
|
|
160
160
|
warnings.push('Recommended field \'operatingsystem_support\' not found.')
|
161
161
|
end
|
162
162
|
|
163
|
-
# check for spdx license
|
164
|
-
|
165
|
-
|
163
|
+
# check for spdx license
|
164
|
+
begin
|
165
|
+
require 'rubygems/util/licenses'
|
166
|
+
|
167
|
+
if parsed.key?('license') && !Gem::Licenses.match?(parsed['license']) && parsed['license'] !~ /[pP]roprietary/
|
168
|
+
warnings.push("License identifier '#{parsed['license']}' is not in the SPDX list: http://spdx.org/licenses/")
|
169
|
+
end
|
170
|
+
rescue LoadError
|
171
|
+
if parsed.key?('license') && !SpdxLicenses.exist?(parsed['license']) && parsed['license'] !~ /[pP]roprietary/
|
172
|
+
warnings.push("License identifier '#{parsed['license']}' is not in the SPDX list: http://spdx.org/licenses/")
|
173
|
+
end
|
174
|
+
end
|
175
|
+
# assume this is task metadata if it has this key
|
176
|
+
elsif parsed.key?('description')
|
177
|
+
# check that description is a string
|
178
|
+
warnings.push('description value is not a String') unless parsed['description'].is_a?(String)
|
179
|
+
# check that input_method is one of three possible values
|
180
|
+
if parsed.key?('input_method')
|
181
|
+
if parsed['input_method'].is_a?(String)
|
182
|
+
warnings.push('input_method value is not one of environment, stdin, or powershell') unless %w[environment stdin powershell].include?(parsed['input_method'])
|
183
|
+
else
|
184
|
+
warnings.push('input_method value is not a String')
|
185
|
+
end
|
186
|
+
end
|
187
|
+
# check that parameters is a hash
|
188
|
+
if parsed.key?('parameters')
|
189
|
+
warnings.push('parameters value is not a Hash') unless parsed['parameters'].is_a?(Hash)
|
190
|
+
end
|
191
|
+
# check that puppet_task_version is an integer
|
192
|
+
if parsed.key?('puppet_task_version')
|
193
|
+
warnings.push('puppet_task_version value is not an Integer') unless parsed['puppet_task_version'].is_a?(Integer)
|
166
194
|
end
|
167
|
-
|
195
|
+
# check that supports_noop is a boolean
|
196
|
+
if parsed.key?('supports_noop')
|
197
|
+
warnings.push('supports_noop value is not a Boolean') unless parsed['supports_noop'].is_a?(TrueClass) || parsed['supports_noop'].is_a?(FalseClass)
|
198
|
+
end
|
199
|
+
# assume this is hieradata and ensure it is non-empty
|
168
200
|
elsif parsed
|
169
201
|
# perform some rudimentary hiera checks if data exists
|
170
202
|
warnings = hiera(parsed, file)
|
@@ -180,15 +212,18 @@ class DataParser
|
|
180
212
|
private_class_method :method
|
181
213
|
warnings = []
|
182
214
|
|
183
|
-
data
|
184
|
-
|
185
|
-
|
186
|
-
|
215
|
+
# disregard nil/undef value data check if default values (common)
|
216
|
+
unless file =~ /^common/
|
217
|
+
data.each do |key, value|
|
218
|
+
# check for nil values in the data (nil keys are fine)
|
219
|
+
if (value.is_a?(Hash) && value.values.any?(&:nil?)) || value.nil?
|
220
|
+
warnings.push("Value(s) missing in key '#{key}'.")
|
221
|
+
end
|
187
222
|
end
|
188
223
|
end
|
189
224
|
|
190
225
|
# check that '---' does not show up more than once in the hieradata
|
191
|
-
warnings.push('The string --- appears more than once in this data and Hiera
|
226
|
+
warnings.push('The string --- appears more than once in this data and Hiera may fail to parse it correctly.') if File.read(file).scan(/---/).count >= 2
|
192
227
|
|
193
228
|
warnings
|
194
229
|
end
|
@@ -36,12 +36,12 @@ class PuppetParser
|
|
36
36
|
warnings = "#{file}:"
|
37
37
|
unless errors.empty?
|
38
38
|
# puppet 5.4-5.x has a new validator output format
|
39
|
-
if Puppet::PUPPETVERSION.to_f >= 5.4
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
warnings << if Puppet::PUPPETVERSION.to_f >= 5.4
|
40
|
+
"\n#{errors.map(&:to_s).join("\n").gsub("file: #{File.absolute_path(file)}, ", '')}"
|
41
|
+
# puppet <= 5.3 validator output format
|
42
|
+
else
|
43
|
+
"\n#{errors.map(&:to_s).join("\n").gsub("#{File.absolute_path(file)}:", '')}"
|
44
|
+
end
|
45
45
|
end
|
46
46
|
Puppet::Util::Log.close_all
|
47
47
|
|
@@ -54,7 +54,7 @@ class RSpecPuppetSupport
|
|
54
54
|
|
55
55
|
# create spec_helper if missing
|
56
56
|
return if File.file?('spec/spec_helper.rb')
|
57
|
-
File.open('spec/spec_helper.rb', 'w') { |file| file.puts "require 'rspec-puppet'\n
|
57
|
+
File.open('spec/spec_helper.rb', 'w') { |file| file.puts "require 'rspec-puppet/spec_helper'\n" }
|
58
58
|
end
|
59
59
|
|
60
60
|
# setup the module dependencies for rspec-puppet testing
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"description": "Does the things.",
|
3
|
+
"supports_noop": false,
|
4
|
+
"input_method": "stdin",
|
5
|
+
"puppet_task_version": 1,
|
6
|
+
"parameters": {
|
7
|
+
"first": {
|
8
|
+
"description": "First param.",
|
9
|
+
"type": "Optional[String[1]]"
|
10
|
+
},
|
11
|
+
"second": {
|
12
|
+
"description": "Second param.",
|
13
|
+
"type": "Optional[String[1]]"
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
@@ -18,7 +18,7 @@ describe DataParser do
|
|
18
18
|
it 'puts a good yaml file with potential hiera issues in the warning files array' do
|
19
19
|
DataParser.yaml([fixtures_dir + 'hieradata/style.yaml'])
|
20
20
|
expect(PuppetCheck.settings[:error_files]).to eql([])
|
21
|
-
expect(PuppetCheck.settings[:warning_files][0]).to match(%r{^#{fixtures_dir}hieradata/style.yaml:\nValue\(s\) missing in key.*\nValue\(s\) missing in key.*\nThe string --- appears more than once in this data and Hiera
|
21
|
+
expect(PuppetCheck.settings[:warning_files][0]).to match(%r{^#{fixtures_dir}hieradata/style.yaml:\nValue\(s\) missing in key.*\nValue\(s\) missing in key.*\nThe string --- appears more than once in this data and Hiera may fail to parse it correctly})
|
22
22
|
expect(PuppetCheck.settings[:clean_files]).to eql([])
|
23
23
|
end
|
24
24
|
it 'puts a good yaml file in the clean files array' do
|
@@ -90,6 +90,12 @@ describe DataParser do
|
|
90
90
|
expect(PuppetCheck.settings[:warning_files][0]).to match(%r{^#{fixtures_dir}metadata_style_two/metadata.json:\n'puppetlabs/one' has non-semantic versioning.*\n'puppetlabs/two' is missing an upper bound\.\n.*operatingsystem.*\n.*operatingsystemrelease})
|
91
91
|
expect(PuppetCheck.settings[:clean_files]).to eql([])
|
92
92
|
end
|
93
|
+
it 'puts a bad task metadata json file in the warning files array' do
|
94
|
+
DataParser.json([fixtures_dir + 'task_metadata/task_bad.json'])
|
95
|
+
expect(PuppetCheck.settings[:error_files]).to eql([])
|
96
|
+
expect(PuppetCheck.settings[:warning_files][0]).to match(%r{^#{fixtures_dir}task_metadata/task_bad.json:\ndescription value is not a String\ninput_method value is not one of environment, stdin, or powershell\nparameters value is not a Hash\npuppet_task_version value is not an Integer\nsupports_noop value is not a Boolean})
|
97
|
+
expect(PuppetCheck.settings[:clean_files]).to eql([])
|
98
|
+
end
|
93
99
|
it 'puts a good json file in the clean files array' do
|
94
100
|
DataParser.json([fixtures_dir + 'hieradata/good.json'])
|
95
101
|
expect(PuppetCheck.settings[:error_files]).to eql([])
|
@@ -102,5 +108,11 @@ describe DataParser do
|
|
102
108
|
expect(PuppetCheck.settings[:warning_files]).to eql([])
|
103
109
|
expect(PuppetCheck.settings[:clean_files]).to eql(["#{fixtures_dir}metadata_good/metadata.json"])
|
104
110
|
end
|
111
|
+
it 'puts a good task metadata json file in the clean files array' do
|
112
|
+
DataParser.json([fixtures_dir + 'task_metadata/task_good.json'])
|
113
|
+
expect(PuppetCheck.settings[:error_files]).to eql([])
|
114
|
+
expect(PuppetCheck.settings[:warning_files]).to eql([])
|
115
|
+
expect(PuppetCheck.settings[:clean_files]).to eql(["#{fixtures_dir}task_metadata/task_good.json"])
|
116
|
+
end
|
105
117
|
end
|
106
118
|
end
|
@@ -14,7 +14,6 @@ describe RegressionCheck do
|
|
14
14
|
expect { RegressionCheck.config(octocatalog_diff_dir + 'octocatalog-diff.cfg.rb') }.not_to raise_exception
|
15
15
|
end
|
16
16
|
it 'loads in the settings from the file correctly' do
|
17
|
-
#
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
@@ -34,6 +33,5 @@ describe RegressionCheck do
|
|
34
33
|
end
|
35
34
|
|
36
35
|
context '.regression' do
|
37
|
-
#
|
38
36
|
end
|
39
37
|
end
|
data/spec/puppet-check_spec.rb
CHANGED
@@ -41,7 +41,7 @@ describe PuppetCheck do
|
|
41
41
|
let(:repeats) { PuppetCheck.parse_paths(['hieradata', 'hieradata', 'lib', 'hieradata/good.json', 'manifests/good.pp', 'manifests/good.pp']) }
|
42
42
|
|
43
43
|
it 'raises an error if no files were found' do
|
44
|
-
expect { no_files }.to raise_error(RuntimeError, 'puppet-check: no files found in supplied paths foo, bar, baz.')
|
44
|
+
expect { no_files }.to raise_error(RuntimeError, 'puppet-check: no files found in supplied paths \'foo, bar, baz\'.')
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'correctly parses one file and returns it' do
|
@@ -50,7 +50,7 @@ describe PuppetCheck do
|
|
50
50
|
|
51
51
|
it 'correctly parses one directory and returns all of its files' do
|
52
52
|
dir.each { |file| expect(File.file?(file)).to be true }
|
53
|
-
expect(dir.length).to eql(
|
53
|
+
expect(dir.length).to eql(37)
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'correctly parses multiple directories and returns all of their files' do
|
data/spec/system/system_spec.rb
CHANGED
@@ -18,8 +18,8 @@ describe PuppetCheck do
|
|
18
18
|
expect { cli }.not_to raise_exception
|
19
19
|
|
20
20
|
expect(PuppetCheck.settings[:error_files].length).to eql(9)
|
21
|
-
expect(PuppetCheck.settings[:warning_files].length).to eql(
|
22
|
-
expect(PuppetCheck.settings[:clean_files].length).to eql(
|
21
|
+
expect(PuppetCheck.settings[:warning_files].length).to eql(10)
|
22
|
+
expect(PuppetCheck.settings[:clean_files].length).to eql(12)
|
23
23
|
expect(PuppetCheck.settings[:ignored_files].length).to eql(6)
|
24
24
|
|
25
25
|
expect(cli).to eql(2)
|
@@ -49,8 +49,8 @@ describe PuppetCheck do
|
|
49
49
|
expect { tasks }.not_to raise_exception
|
50
50
|
|
51
51
|
expect(PuppetCheck.settings[:error_files].length).to eql(9)
|
52
|
-
expect(PuppetCheck.settings[:warning_files].length).to eql(
|
53
|
-
expect(PuppetCheck.settings[:clean_files].length).to eql(
|
52
|
+
expect(PuppetCheck.settings[:warning_files].length).to eql(10)
|
53
|
+
expect(PuppetCheck.settings[:clean_files].length).to eql(12)
|
54
54
|
expect(PuppetCheck.settings[:ignored_files].length).to eql(6)
|
55
55
|
end
|
56
56
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Schuchard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '3.7'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '7'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '3.7'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '7'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: puppet-lint
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -48,16 +48,22 @@ dependencies:
|
|
48
48
|
name: reek
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
|
-
- - "
|
51
|
+
- - ">"
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '4.0'
|
54
|
+
- - "<"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '6'
|
54
57
|
type: :runtime
|
55
58
|
prerelease: false
|
56
59
|
version_requirements: !ruby/object:Gem::Requirement
|
57
60
|
requirements:
|
58
|
-
- - "
|
61
|
+
- - ">"
|
59
62
|
- !ruby/object:Gem::Version
|
60
63
|
version: '4.0'
|
64
|
+
- - "<"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '6'
|
61
67
|
- !ruby/object:Gem::Dependency
|
62
68
|
name: rubocop
|
63
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,6 +193,8 @@ files:
|
|
187
193
|
- spec/fixtures/metadata_syntax/metadata.json
|
188
194
|
- spec/fixtures/spec/facter/facter_spec.rb
|
189
195
|
- spec/fixtures/spec/fixtures/do_not_parse_me
|
196
|
+
- spec/fixtures/task_metadata/task_bad.json
|
197
|
+
- spec/fixtures/task_metadata/task_good.json
|
190
198
|
- spec/fixtures/templates/good.epp
|
191
199
|
- spec/fixtures/templates/good.erb
|
192
200
|
- spec/fixtures/templates/no_method_error.erb
|
@@ -265,6 +273,8 @@ test_files:
|
|
265
273
|
- spec/fixtures/metadata_syntax/metadata.json
|
266
274
|
- spec/fixtures/spec/facter/facter_spec.rb
|
267
275
|
- spec/fixtures/spec/fixtures/do_not_parse_me
|
276
|
+
- spec/fixtures/task_metadata/task_bad.json
|
277
|
+
- spec/fixtures/task_metadata/task_good.json
|
268
278
|
- spec/fixtures/templates/good.epp
|
269
279
|
- spec/fixtures/templates/good.erb
|
270
280
|
- spec/fixtures/templates/no_method_error.erb
|