puppet-check 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5eed739fa10d5c5223812d0e88edf139d4c5e0e7
4
- data.tar.gz: b6cc39fa5d43da1a090ca7be86315876285d94b7
3
+ metadata.gz: 0c73e077873c45fd337c09547f436ad7c0176f1f
4
+ data.tar.gz: a40a24c8f2e710c7d0e57bff54738003ae9ad7de
5
5
  SHA512:
6
- metadata.gz: c259d0803a2fae163241ef523e6c326b402be1d7363929adf857db87b2fc82b1f9af5dbe673a4eaf6ce0fee6ec4b3464f0931f5e000e97e3fa3e15fef913f926
7
- data.tar.gz: 3159e4d695987cd9f4ccde352bb69a965fedc3204fdf7fbced757b93f9c777f49ef9408fc8189d71aebd78bbf7f9490c6a0382b43aec1b9a36c80186f1dae7ed
6
+ metadata.gz: bbf1b361bd6e6ae303e3e242aea111774beb1234b4a9affa45fbaa178af7b3c0ccb4315babab6d937b24a95b025bc339a469aeeefe232b954bd1aaf4d633b535
7
+ data.tar.gz: 2c537882049dadf1924de9021f0957932f7142a307f1f343598924474d4d11bae034bde0b2e1e1ce5e2fb01ed65a45d1b6025bf8861affaba8462955b1530838
data/CHANGELOG.md CHANGED
@@ -1,12 +1,17 @@
1
1
  ### 1.4.0 (Roadmap)
2
2
  - optional dep octocatalog-diff interface (minor)
3
- - minimum Puppet version increased from 3.4 to 3.7 (minor)
4
3
  - rakefile interface with puppet-lint, rubocop, reek (minor)
5
4
  - rspec puppet stubbing (minor)
6
5
  - acceptance testing with vagrant/docker+serverspec (minor)
7
6
  - improved json and yaml output formats support (file arrays become file hashes and output results further handles formatting) (minor; this would be a big refactoring effort)
8
7
  - split syntax and style checks to separate methods for style (patch)
9
- - add additional hiera checks (patch)
8
+
9
+ ### 1.3.2 (Roadmap)
10
+ - For the Puppet Forge method of downloading external module dependencies as spec fixtures, the module is now updated if it is already present. Previously, a fresh forced install was always attempted.
11
+ - A good `spec_helper` for RSpec Puppet is now generated if one is missing. This is instead of the buggy one that `rspec-puppet-init` generates.
12
+ - Fix blocking of hieradata checks on `hiera.yaml`.
13
+ - A check was added for '---' appearing more than once in YAML hieradata as Hiera attempts to parse these additional lines as data.
14
+ - Additional `metadata.json` warnings for `version_requirement` nested key.
10
15
 
11
16
  ### 1.3.1
12
17
  - For the git and mercurial methods of downloading external module dependencies as spec fixtures, the module is now updated if it is already present and previously retrieved with git or mercurial respectively. Previously, a fresh clone was always attempted.
data/README.md CHANGED
@@ -5,6 +5,7 @@
5
5
  - [Usage](#usage)
6
6
  - [CLI](#cli)
7
7
  - [Rake](#rake)
8
+ - [API](#api)
8
9
  - [Docker](#docker)
9
10
  - [Vagrant](#vagrant)
10
11
  - [Exit Codes](#exit-codes)
@@ -45,10 +46,11 @@ BEGIN {throw :good}; i => am : a '' ruby.file { with } &bad syntax
45
46
  block sequence entries are not allowed in this context at line 2 column 4
46
47
 
47
48
  -- hieradata/syntax.json:
48
- 757: unexpected token at '{
49
+ 743: unexpected token at '{
49
50
 
50
51
  -- metadata_syntax/metadata.json:
51
- Required field 'version' not found in metadata.json.
52
+ Required field 'version' not found.
53
+ Field 'requirements' is not an array of hashes.
52
54
  Duplicate dependencies on puppetlabs/nothing.
53
55
  Deprecated field 'checksum' found.
54
56
  Summary exceeds 144 characters.
@@ -60,13 +62,13 @@ Summary exceeds 144 characters.
60
62
 
61
63
  The following files have warnings:
62
64
  -- manifests/style_lint.pp:
63
- double quoted string containing no variables at line 2, column 8
64
- indentation of => is not properly aligned at line 2, column 5
65
+ 2:8: double quoted string containing no variables
66
+ 2:5: indentation of => is not properly aligned (expected in column 8, but found it in column 5)
65
67
 
66
68
  -- manifests/style_parser.pp:
67
69
  Unrecognized escape sequence '\[' at 2:77
68
70
  Unrecognized escape sequence '\]' at 2:77
69
- double quoted string containing no variables at line 2, column 45
71
+ 2:45: double quoted string containing no variables
70
72
 
71
73
  -- lib/style.rb:
72
74
  1:1: W: Useless assignment to variable - `hash`.
@@ -83,10 +85,19 @@ double quoted string containing no variables at line 2, column 45
83
85
  -- hieradata/style.yaml:
84
86
  Value(s) missing in key 'value'.
85
87
  Value(s) missing in key 'and'.
88
+ The string --- appears more than once in this data and Hiera will fail to parse it correctly.
86
89
 
87
90
  -- metadata_style/metadata.json:
91
+ Recommended field 'operatingsystem_support' not found.
92
+ 'pe' is missing an upper bound.
88
93
  License identifier 'Imaginary' is not in the SPDX list: http://spdx.org/licenses/
89
94
 
95
+ -- metadata_style_two/metadata.json:
96
+ Recommended field 'operatingsystem' not found.
97
+ Recommended field 'operatingsystemrelease' not found.
98
+ 'puppetlabs/one' has non-semantic versioning in its 'version_requirement' key.
99
+ 'puppetlabs/two' is missing an upper bound.
100
+
90
101
  -- librarian_style/Puppetfile:
91
102
  2:3: C: Align the parameters of a method call if they span more than one line.
92
103
  5:13: C: Use the new Ruby 1.9 hash syntax.
@@ -94,9 +105,12 @@ License identifier 'Imaginary' is not in the SPDX list: http://spdx.org/licenses
94
105
  The following files have no errors or warnings:
95
106
  -- manifests/good.pp
96
107
  -- templates/good.epp
108
+ -- spec/facter/facter_spec.rb
97
109
  -- lib/good.rb
110
+ -- templates/no_method_error.erb
98
111
  -- templates/good.erb
99
112
  -- hieradata/good.yaml
113
+ -- metadata.json
100
114
  -- hieradata/good.json
101
115
  -- metadata_good/metadata.json
102
116
  -- librarian_good/Puppetfile
@@ -116,10 +130,10 @@ The following files have unrecognized formats and therefore were not processed:
116
130
  - Puppetlabs Spec Helper does not update external module dependencies in a stateful/persistent workspace and fails gracefully instead.
117
131
  - Puppetlabs Spec Helper requires extra configuration items to setup self-module RSpec testing.
118
132
 
119
- 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 lightweight 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.
133
+ 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.
120
134
 
121
135
  ## Usage
122
- Puppet Check requires `ruby >= 2.0.0`, `puppet >= 3.4`, and `puppet-lint >= 2.0.0`. All other dependencies should be fine with various versions. Puppet Check can be used either with a CLI or Rake tasks. Please note both interfaces will ignore any directories named `fixtures` or specified paths with that directory during file checks and spec tests.
136
+ Puppet Check requires `ruby >= 2.0.0`, `puppet >= 3.4`, and `puppet-lint >= 2.0.0`. 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.
123
137
 
124
138
  #### Reek
125
139
  Reek dropped support for Ruby 2.0 when it went to 4.0. Since dependencies by Ruby version are allowed in Gemfiles but not gemspecs, this means that PuppetCheck installed with `bundler` will automatically pick up the correct version of Reek for your Ruby version and install it. If you are installing PuppetCheck via `gem`, then you can install reek normally with `gem` with Ruby >= 2.1, but you will need to specify `gem install reek -v 3.11` if you are using Ruby 2.0.
@@ -174,7 +188,7 @@ The spec tests will be executed against everything that matches the pattern `**/
174
188
 
175
189
  Please note it is perfectly acceptable to only execute standard RSpec tests in your modules and not use the extended RSpec Puppet matchers. If no Puppet module directories are identified during directory parsing, then no RSpec Puppet related actions (including those described below) will be performed.
176
190
 
177
- Prior to executing the spec tests, Puppet Check will parse everything in the current path and identify all `spec` directories not within `fixtures` directories. It will then execute RSpec Puppet setup actions inside all directories one level above that contain a `manifests` directory. This is assumed to be a Puppet module directory. These setup actions include creating all of the necessary directories inside of `spec/fixtures`, creating a blank `site.pp` if it is missing, symlinking everything from the module that is needed into fixtures (automatically replaces functionality of self module symlink in `.fixtures.yaml` from Puppetlabs Spec Helper), and creates the `spec_helper.rb` if it is missing. Note these setup actions can replace `rspec-puppet-init` from RSpec Puppet and currently are both faster and more accurate.
191
+ Prior to executing the spec tests, Puppet Check will parse everything in the current path and identify all `spec` directories not within `fixtures` directories. It will then execute RSpec Puppet setup actions inside all directories one level above that contain a `manifests` directory. This is assumed to be a Puppet module directory. These setup actions include creating all of the necessary directories inside of `spec/fixtures`, creating a blank `site.pp` if it is missing, symlinking everything from the module that is needed into fixtures (automatically replaces functionality of self module symlink in `.fixtures.yaml` from Puppetlabs Spec Helper), and creates the `spec_helper.rb` if it is missing. Note these setup actions can replace `rspec-puppet-init` from RSpec Puppet and currently are both faster and more accurate.
178
192
 
179
193
  Puppet Check will also automatically download specified external module dependencies for and during RSpec Puppet testing. Currently `git`, `puppet forge`, and `hg` commands are supported. They can be implemented in the following way in your modules' `metadata.json`:
180
194
 
@@ -221,6 +235,29 @@ The spec tests will be executed against everything that matches the pattern `**/
221
235
 
222
236
  Please note this is merely a frontend to Beaker and that Beaker itself has a self-contained scope compared to all the other tools Puppet Check interfaces with and utilizes. This means if you want to add Beaker-RSpec, Serverspec, etc., or perform advanced configurations, those would be all be performed within Beaker itself. This task merely provides an interface to integrate Beaker in with your other testing infrastructure.
223
237
 
238
+ ### API
239
+
240
+ If you are performing your Puppet testing from within a Ruby script or your own custom Rakefile tasks, and want to execute Puppet Check intrinsically from the Ruby script or Rakefile, then you can call its API in the following simple way:
241
+
242
+ ```ruby
243
+ # file checks
244
+ require 'puppet-check'
245
+
246
+ PuppetCheck.future_parser = true # default false
247
+ PuppetCheck.style_check = true # default false
248
+ PuppetCheck.output_format = 'yaml' # also 'json'; default 'text'
249
+ PuppetCheck.puppetlint_args = ['--puppetlint-arg-one', '--puppetlint-arg-two'] # default []
250
+ PuppetCheck.rubocop_args = ['--except', 'rubocop-arg-one,rubocop-arg-two'] # default []
251
+
252
+ PuppetCheck.new.run([dirs, files])
253
+
254
+ # rspec checks (as part of a RSpec::Core::RakeTask.new block with |task|)
255
+ require 'puppet-check/rspec_puppet_support'
256
+
257
+ RSpecPuppetSupport.run
258
+ task.pattern = Dir.glob('**/{classes,defines,facter,functions,hosts,puppet,unit,types}/**/*_spec.rb').reject { |dir| dir =~ /fixtures/ }
259
+ ```
260
+
224
261
  ### Docker
225
262
 
226
263
  You can also use Puppet Check inside of Docker for quick, portable, and disposable testing. Below is an example Dockerfile for this purpose:
@@ -231,7 +268,7 @@ FROM ubuntu:16.04
231
268
  # 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
232
269
  RUN apt-get update && apt-get install ruby git -y
233
270
  # 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
234
- RUN gem install --no-rdoc --no-ri puppet-check reek rspec-puppet rake
271
+ RUN gem install --no-document puppet-check reek rspec-puppet rake
235
272
  # this is needed for the ruby json parser to not flip out on fresh os installs for some reason (change encoding value as necessary)
236
273
  ENV LANG en_US.UTF-8
237
274
  # create the directory for your module, directory environment, etc. and change directory into it
@@ -251,15 +288,15 @@ As an alternative to Docker, you can also use Vagrant for quick and disposable t
251
288
  ```ruby
252
289
  Vagrant.configure(2) do |config|
253
290
  # a reliable and small box at the moment
254
- config.vm.box = 'fedora/23'
291
+ config.vm.box = 'fedora/24-cloud-base'
255
292
 
256
293
  config.vm.provision 'shell', inline: <<-SHELL
257
- # cd to 'sync' if this is recent Vagrant; cd to '/vagrant' if this is older Vagrant
258
- cd sync || cd /vagrant
294
+ # cd to '/vagrant'
295
+ cd /vagrant
259
296
  # 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
260
297
  sudo dnf install ruby rubygems git -y
261
298
  # 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.2 and then rspec-puppet and rake for extra testing
262
- sudo gem install --no-rdoc --no-ri puppet-check reek rspec-puppet rake
299
+ sudo gem install --no-document puppet-check reek rspec-puppet rake
263
300
  # this is needed for the ruby json parser to not flip out on fresh os installs for some reason (change encoding value as necessary)
264
301
  export LANG='en_US.UTF-8'
265
302
  # execute your tests; in this example we are executing the full suite of tests
@@ -21,7 +21,7 @@ class PuppetCheck::CLI
21
21
 
22
22
  # base options
23
23
  opts.on('--version', 'Display the current version.') do
24
- puts 'puppet-check 1.3.1'
24
+ puts 'puppet-check 1.3.2'
25
25
  exit 0
26
26
  end
27
27
 
@@ -16,7 +16,10 @@ class DataParser
16
16
  warnings = []
17
17
 
18
18
  # perform some rudimentary hiera checks if data exists and is hieradata
19
- warnings = hiera(parsed) unless (parsed.class.to_s == 'NilClass') || (file == 'hiera.yaml')
19
+ warnings = hiera(parsed) unless (parsed.class.to_s == 'NilClass') || (File.basename(file) == 'hiera.yaml')
20
+
21
+ # check that '---' does not show up more than once in the hieradata
22
+ warnings.push('The string --- appears more than once in this data and Hiera will fail to parse it correctly.') if File.read(file).scan(/---/).count >= 2
20
23
 
21
24
  next PuppetCheck.warning_files.push("#{file}:\n#{warnings.join("\n")}") unless warnings.empty?
22
25
  PuppetCheck.clean_files.push(file.to_s)
@@ -100,9 +103,19 @@ class DataParser
100
103
 
101
104
  # check for requirement and dependency upper bounds
102
105
  %w(requirements dependencies).each do |key|
106
+ # skip if key is missing or not an array
103
107
  next if parsed[key].empty?
108
+ next warnings.push("#{key}'s value is not an array.") unless parsed[key].is_a? Array
104
109
  parsed[key].each do |req_dep|
105
- warnings.push("'#{req_dep['name']}' is missing an upper bound.") unless req_dep['version_requirement'].include?('<')
110
+ # warn and skip if key is missing
111
+ next warnings.push("'#{req_dep['name']}' is missing a 'version_requirement' key.") if req_dep['version_requirement'].class.to_s == 'NilClass'
112
+ # warn and skip if no upper bound
113
+ next warnings.push("'#{req_dep['name']}' is missing an upper bound.") unless req_dep['version_requirement'].include?('<')
114
+
115
+ # check for semantic versioning
116
+ if key == 'dependencies'
117
+ warnings.push("'#{req_dep['name']}' has non-semantic versioning in its 'version_requirement' key.") unless req_dep['version_requirement'] =~ /\d\.\d\.\d.*\d\.\d\.\d/
118
+ end
106
119
  end
107
120
  end
108
121
 
@@ -124,12 +137,14 @@ class DataParser
124
137
  # checks hieradata
125
138
  def self.hiera(data)
126
139
  warnings = []
140
+
127
141
  data.each do |key, value|
128
142
  # check for nil values in the data (nil keys are fine)
129
143
  if (value.is_a?(Hash) && value.values.any?(&:nil?)) || (value.class.to_s == 'NilClass')
130
144
  warnings.push("Value(s) missing in key '#{key}'.")
131
145
  end
132
146
  end
147
+
133
148
  warnings
134
149
  end
135
150
  end
@@ -45,7 +45,7 @@ class RSpecPuppetSupport
45
45
 
46
46
  # create spec_helper if missing
47
47
  return if File.file?('spec/spec_helper.rb')
48
- File.open('spec/spec_helper.rb', 'w') { |file| file.puts "require 'rspec-puppet/spec_helper'\n" }
48
+ File.open('spec/spec_helper.rb', 'w') { |file| file.puts "require 'rspec-puppet'\n\nfixture_path = File.expand_path(File.join(__FILE__, '..', 'fixtures'))\n\nRSpec.configure do |c|\n c.module_path = File.join(fixture_path, 'modules')\n c.manifest_dir = File.join(fixture_path, 'manifests')\n c.manifest = File.join(File.dirname(File.expand_path(__FILE__)), 'fixtures', 'manifests', 'site.pp')\n c.environmentpath = File.join(Dir.pwd, 'spec')\nend" }
49
49
  end
50
50
 
51
51
  # setup the module dependencies for rspec-puppet testing
@@ -81,7 +81,11 @@ class RSpecPuppetSupport
81
81
 
82
82
  # download external module dependency with forge
83
83
  def self.forge(forge_name, args = '')
84
- system("puppet module install --modulepath spec/fixtures/modules/ --force #{args} #{forge_name}")
84
+ if File.directory?("spec/fixtures/modules/#{forge_name}")
85
+ system("puppet module upgrade --modulepath spec/fixtures/modules/ #{args} #{forge_name}")
86
+ else
87
+ system("puppet module install --modulepath spec/fixtures/modules/ #{args} #{forge_name}")
88
+ end
85
89
  end
86
90
 
87
91
  # download external module dependency with hg
@@ -43,9 +43,8 @@ class RubyParser
43
43
  # check ruby template syntax
44
44
  begin
45
45
  # need to eventually have this associated with a different binding during each iteration
46
- # warnings = Util.capture_stderr { ERB.new(File.read(file), nil, '-').result(RubyParser.new.binding) }
47
46
  warnings = Utils.capture_stderr { ERB.new(File.read(file), nil, '-').result }
48
- # credits to gds-operations/puppet-syntax for errors to ignore
47
+ # ERB.new(File.read(file), nil, '-').result(RubyParser.new.bind)
49
48
  rescue NameError, TypeError
50
49
  # empty out warnings since it would contain an error if this pass triggers
51
50
  warnings = ''
@@ -86,7 +85,7 @@ class RubyParser
86
85
  end
87
86
 
88
87
  # potentially for unique erb bindings
89
- def binding
88
+ def bind
90
89
  binding
91
90
  end
92
91
  end
@@ -13,3 +13,4 @@ value:
13
13
  and:
14
14
  also: 'a'
15
15
  subvalue:
16
+ ---
@@ -42,7 +42,7 @@
42
42
  },
43
43
  {
44
44
  "name": "puppetlabs/gruntmaster",
45
- "version_requirement": ">= 6000 < 9000",
45
+ "version_requirement": ">= 6000.0.0 < 9000.0.0",
46
46
  "software": "upgradeable"
47
47
  }
48
48
  ]
@@ -20,7 +20,7 @@
20
20
  ],
21
21
  "description": "Standard Library for Puppet Modules",
22
22
  "dependencies": [
23
- { "name": "puppetlabs/one", "version_requirement": ">= 3.2.0 < 5.0.0" },
23
+ { "name": "puppetlabs/one", "version_requirement": ">= 3.2.0 <= 5.0" },
24
24
  { "name": "puppetlabs/two", "version_requirement": ">= 0.0.4" }
25
25
  ]
26
26
  }
@@ -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.error_files).to eql([])
21
- expect(PuppetCheck.warning_files[0]).to match(%r{^#{fixtures_dir}hieradata/style.yaml:\nValue\(s\) missing in key.*\nValue\(s\) missing in key})
21
+ expect(PuppetCheck.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 will fail to parse it correctly})
22
22
  expect(PuppetCheck.clean_files).to eql([])
23
23
  end
24
24
  it 'puts a good yaml file in the clean files array' do
@@ -51,7 +51,7 @@ describe DataParser do
51
51
  it 'puts another bad style metadata json file in the warning files array' do
52
52
  DataParser.json([fixtures_dir + 'metadata_style_two/metadata.json'])
53
53
  expect(PuppetCheck.error_files).to eql([])
54
- expect(PuppetCheck.warning_files[0]).to match(%r{^#{fixtures_dir}metadata_style_two/metadata.json:\n.*operatingsystem.*\n.*operatingsystemrelease.*\n'puppetlabs/two' is missing an upper bound})
54
+ expect(PuppetCheck.warning_files[0]).to match(%r{^#{fixtures_dir}metadata_style_two/metadata.json:\n.*operatingsystem.*\n.*operatingsystemrelease.*\n'puppetlabs/one' has non-semantic versioning.*\n'puppetlabs/two' is missing an upper bound})
55
55
  expect(PuppetCheck.clean_files).to eql([])
56
56
  end
57
57
  it 'puts a good json file in the clean files array' do
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.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Schuchard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-11 00:00:00.000000000 Z
11
+ date: 2017-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: puppet
@@ -95,7 +95,7 @@ dependencies:
95
95
  version: '9'
96
96
  - - "<"
97
97
  - !ruby/object:Gem::Version
98
- version: '12'
98
+ version: '13'
99
99
  type: :development
100
100
  prerelease: false
101
101
  version_requirements: !ruby/object:Gem::Requirement
@@ -105,7 +105,7 @@ dependencies:
105
105
  version: '9'
106
106
  - - "<"
107
107
  - !ruby/object:Gem::Version
108
- version: '12'
108
+ version: '13'
109
109
  description: Puppet Check is a gem that provides a comprehensive, streamlined, and
110
110
  efficient analysis of the syntax, style, and validity of your entire Puppet code
111
111
  and data.