puppet-lint 2.0.2 → 2.1.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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +56 -0
  5. data/Gemfile +15 -4
  6. data/README.md +60 -5
  7. data/Rakefile +13 -0
  8. data/lib/puppet-lint.rb +21 -4
  9. data/lib/puppet-lint/configuration.rb +1 -0
  10. data/lib/puppet-lint/data.rb +12 -4
  11. data/lib/puppet-lint/lexer.rb +32 -7
  12. data/lib/puppet-lint/optparser.rb +4 -3
  13. data/lib/puppet-lint/plugins/check_classes.rb +73 -0
  14. data/lib/puppet-lint/plugins/check_comments.rb +4 -0
  15. data/lib/puppet-lint/plugins/check_conditionals.rb +4 -0
  16. data/lib/puppet-lint/plugins/check_documentation.rb +2 -0
  17. data/lib/puppet-lint/plugins/check_nodes.rb +2 -0
  18. data/lib/puppet-lint/plugins/check_resources.rb +80 -3
  19. data/lib/puppet-lint/plugins/check_strings.rb +13 -1
  20. data/lib/puppet-lint/plugins/check_variables.rb +6 -0
  21. data/lib/puppet-lint/plugins/check_whitespace.rb +12 -0
  22. data/lib/puppet-lint/version.rb +1 -1
  23. data/puppet-lint.gemspec +0 -2
  24. data/spec/fixtures/test/manifests/ignore_reason.pp +4 -1
  25. data/spec/fixtures/test/manifests/mismatched_control_comment.pp +1 -0
  26. data/spec/puppet-lint/bin_spec.rb +25 -12
  27. data/spec/puppet-lint/configuration_spec.rb +1 -0
  28. data/spec/puppet-lint/lexer_spec.rb +56 -2
  29. data/spec/puppet-lint/plugins/check_classes/code_on_top_scope_spec.rb +43 -0
  30. data/spec/puppet-lint/plugins/check_classes/name_contains_uppercase_spec.rb +66 -0
  31. data/spec/puppet-lint/plugins/check_classes/parameter_order_spec.rb +49 -0
  32. data/spec/puppet-lint/plugins/check_resources/ensure_first_param_spec.rb +140 -51
  33. data/spec/puppet-lint/plugins/check_strings/single_quote_string_with_variables_spec.rb +24 -0
  34. data/spec/puppet-lint/plugins/check_strings/variables_not_enclosed_spec.rb +17 -0
  35. data/spec/puppet-lint/plugins/check_variables/variable_contains_dash_spec.rb +8 -0
  36. data/spec/spec_helper.rb +5 -0
  37. metadata +9 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6c8e66a832c7a2cb2f29ed9bcba97b1f7807de3
4
- data.tar.gz: 480e6c20a669db2668c3366f97c6b1133acf8217
3
+ metadata.gz: afe0f69ff9db46b574f04cdb2344e600ae0b1e10
4
+ data.tar.gz: 8c8344befd98f41083fc3e0408e5ae4ba1017245
5
5
  SHA512:
6
- metadata.gz: ba2e39b0d3cea77c78d46fd33dd7d4bacb17cfcc9780e941bd9f623b981acbcc228e751ee660a8875769e1120696955c232687083054d8cb7bc61438c2901d59
7
- data.tar.gz: 5b50d449286742482856f009ee9022c3296a7dd317cb1a2403c7631c9a4c9d084212ebb58442e3d4e92d431f9101205711a59f9624c2dd94daf854885386380f
6
+ metadata.gz: 41c27ca6ec8948d1c2e654c830cad26806243643f4e0e8c29f2aad9ba7f215a2be1196fb7bed16bec0b541955e9235a43f7ccdfddf519a81505779ef806bc3e1
7
+ data.tar.gz: 398daafadce6e29e4d97d116166658a76ad9d6fcd3fa2cbac12f7b4a204524eb1333d8b45bb96188129a0828ef8f6bb334cee77eddd9c103f2bc8198776e04b2
data/.gitignore CHANGED
@@ -7,4 +7,5 @@ vendor/
7
7
  coverage/
8
8
  *.swp
9
9
  /_site/
10
- .idea
10
+ .idea
11
+ /*.pp
data/.rspec CHANGED
@@ -1 +1,2 @@
1
+ --format documentation
1
2
  --color
@@ -1,5 +1,59 @@
1
1
  # Change Log
2
2
 
3
+ ## [2.1.0](https://github.com/rodjek/puppet-lint/tree/2.1.0) (2016-12-30)
4
+ [Full Changelog](https://github.com/rodjek/puppet-lint/compare/2.0.2...2.1.0)
5
+
6
+ **Closed issues:**
7
+
8
+ - No documentation on how to use plugins [\#602](https://github.com/rodjek/puppet-lint/issues/602)
9
+ - Excessive number of warnings from code\_on\_top\_scope [\#579](https://github.com/rodjek/puppet-lint/issues/579)
10
+ - Syntax error for references starting with Regexp [\#566](https://github.com/rodjek/puppet-lint/issues/566)
11
+ - --fix flag discoverability is low [\#556](https://github.com/rodjek/puppet-lint/issues/556)
12
+ - Module names must only contain lowercase letters [\#554](https://github.com/rodjek/puppet-lint/issues/554)
13
+ - incorrect error on inline template [\#545](https://github.com/rodjek/puppet-lint/issues/545)
14
+ - parameter\_order check does not work default hash is added in parameter [\#544](https://github.com/rodjek/puppet-lint/issues/544)
15
+ - Remove formatting with `linenumber` [\#539](https://github.com/rodjek/puppet-lint/issues/539)
16
+ - Incorrect warning of required parameter when using array that includes variable. [\#537](https://github.com/rodjek/puppet-lint/issues/537)
17
+ - names\_containing\_dash is broken and unignorable [\#534](https://github.com/rodjek/puppet-lint/issues/534)
18
+ - Puppet-lint 2.0 fails on unquoted string starting with underscore. [\#531](https://github.com/rodjek/puppet-lint/issues/531)
19
+ - syntax error on valid file when: if /regex/ in array [\#517](https://github.com/rodjek/puppet-lint/issues/517)
20
+ - crashes if there is a \# line:endignore with no begining. [\#509](https://github.com/rodjek/puppet-lint/issues/509)
21
+ - Wrong behaviour of variable\_contains\_dash [\#504](https://github.com/rodjek/puppet-lint/issues/504)
22
+ - puppet-lint reports incorrect line numbers [\#403](https://github.com/rodjek/puppet-lint/issues/403)
23
+ - lint ignore comments feature not documented [\#369](https://github.com/rodjek/puppet-lint/issues/369)
24
+
25
+ **Merged pull requests:**
26
+
27
+ - Documentation on plugin usage. [\#611](https://github.com/rodjek/puppet-lint/pull/611) ([rnelson0](https://github.com/rnelson0))
28
+ - Puppet-lint version bump to 2.1.0.pre [\#608](https://github.com/rodjek/puppet-lint/pull/608) ([rnelson0](https://github.com/rnelson0))
29
+ - \(\#369\) Document existence of control comments [\#600](https://github.com/rodjek/puppet-lint/pull/600) ([rnelson0](https://github.com/rnelson0))
30
+ - Ignore \*.pp files at the top level [\#597](https://github.com/rodjek/puppet-lint/pull/597) ([rnelson0](https://github.com/rnelson0))
31
+ - Show logs in rspec tests [\#596](https://github.com/rodjek/puppet-lint/pull/596) ([ghoneycutt](https://github.com/ghoneycutt))
32
+ - \(\#517\) Update the allowed tokens prior to a regex [\#594](https://github.com/rodjek/puppet-lint/pull/594) ([rnelson0](https://github.com/rnelson0))
33
+ - \(\#531\) Treat barewords beginning with an underscore as :NAME tokens [\#593](https://github.com/rodjek/puppet-lint/pull/593) ([rnelson0](https://github.com/rnelson0))
34
+ - \(\#544, \#537\) Skip hash contents when checking optional parameters [\#592](https://github.com/rodjek/puppet-lint/pull/592) ([rnelson0](https://github.com/rnelson0))
35
+ - \(\#545\) Exempt inline\_epp and inline\_template from single quoted strin… [\#591](https://github.com/rodjek/puppet-lint/pull/591) ([rnelson0](https://github.com/rnelson0))
36
+ - Disable code\_on\_top\_scope by default until the noise can be reduced \(… [\#590](https://github.com/rodjek/puppet-lint/pull/590) ([rnelson0](https://github.com/rnelson0))
37
+ - Changelog generator task [\#589](https://github.com/rodjek/puppet-lint/pull/589) ([rnelson0](https://github.com/rnelson0))
38
+ - Count lines in comments and double quoted strings [\#577](https://github.com/rodjek/puppet-lint/pull/577) ([paran1](https://github.com/paran1))
39
+ - Handle mismatched control comments gracefully [\#573](https://github.com/rodjek/puppet-lint/pull/573) ([rodjek](https://github.com/rodjek))
40
+ - Reimplementation of --fix support for unenclosed variables delimited by dashes [\#572](https://github.com/rodjek/puppet-lint/pull/572) ([rodjek](https://github.com/rodjek))
41
+ - Anchor the end of the :TYPE token regexp [\#571](https://github.com/rodjek/puppet-lint/pull/571) ([rodjek](https://github.com/rodjek))
42
+ - Multi line strings [\#570](https://github.com/rodjek/puppet-lint/pull/570) ([jiuka](https://github.com/jiuka))
43
+ - @node\_indexes should be reset too. [\#569](https://github.com/rodjek/puppet-lint/pull/569) ([jiuka](https://github.com/jiuka))
44
+ - True up reserved keywords [\#564](https://github.com/rodjek/puppet-lint/pull/564) ([rnelson0](https://github.com/rnelson0))
45
+ - \[561\] Provide style guide references for each check [\#562](https://github.com/rodjek/puppet-lint/pull/562) ([rnelson0](https://github.com/rnelson0))
46
+ - Add names\_containing\_uppercase docs [\#559](https://github.com/rodjek/puppet-lint/pull/559) ([arrdem](https://github.com/arrdem))
47
+ - Implement a linter for uppercase class names [\#558](https://github.com/rodjek/puppet-lint/pull/558) ([arrdem](https://github.com/arrdem))
48
+ - Include --fix usage instructions [\#557](https://github.com/rodjek/puppet-lint/pull/557) ([QuinnyPig](https://github.com/QuinnyPig))
49
+ - Add puppet-lint plugins from deanwilson to plugins page [\#553](https://github.com/rodjek/puppet-lint/pull/553) ([deanwilson](https://github.com/deanwilson))
50
+ - Updates PR for \#223 [\#552](https://github.com/rodjek/puppet-lint/pull/552) ([binford2k](https://github.com/binford2k))
51
+ - add legacy\_facts [\#543](https://github.com/rodjek/puppet-lint/pull/543) ([mmckinst](https://github.com/mmckinst))
52
+ - Remove formatting with `linenumber` [\#540](https://github.com/rodjek/puppet-lint/pull/540) ([rski](https://github.com/rski))
53
+ - Adding support for logging to STDOUT as JSON [\#487](https://github.com/rodjek/puppet-lint/pull/487) ([binford2k](https://github.com/binford2k))
54
+ - Potential README changes [\#420](https://github.com/rodjek/puppet-lint/pull/420) ([rothsa](https://github.com/rothsa))
55
+ - Add fix to "ensure found on line but it's not the first attribute" [\#375](https://github.com/rodjek/puppet-lint/pull/375) ([sathieu](https://github.com/sathieu))
56
+
3
57
  ## [2.0.2](https://github.com/rodjek/puppet-lint/tree/2.0.2) (2016-08-19)
4
58
  [Full Changelog](https://github.com/rodjek/puppet-lint/compare/2.0.1...2.0.2)
5
59
 
@@ -12,6 +66,7 @@
12
66
 
13
67
  **Merged pull requests:**
14
68
 
69
+ - Release 2.0.2 [\#536](https://github.com/rodjek/puppet-lint/pull/536) ([rnelson0](https://github.com/rnelson0))
15
70
  - Revert "Bugfix: properly handling $gronk-$grouik with --fix \(fix \#442\)" [\#535](https://github.com/rodjek/puppet-lint/pull/535) ([rnelson0](https://github.com/rnelson0))
16
71
 
17
72
  ## [2.0.1](https://github.com/rodjek/puppet-lint/tree/2.0.1) (2016-08-18)
@@ -311,6 +366,7 @@ If the additional gems you use for checks are pinned to 1.x, you should pin pupp
311
366
 
312
367
  **Merged pull requests:**
313
368
 
369
+ - Checks for code outside class/define block [\#223](https://github.com/rodjek/puppet-lint/pull/223) ([dLobatog](https://github.com/dLobatog))
314
370
  - explains in README that puppet-lint is not for checking syntax [\#186](https://github.com/rodjek/puppet-lint/pull/186) ([ghoneycutt](https://github.com/ghoneycutt))
315
371
  - Use the current workdir as reference to calculate the expanded\_path of a filename [\#175](https://github.com/rodjek/puppet-lint/pull/175) ([vStone](https://github.com/vStone))
316
372
  - Update code documentation [\#298](https://github.com/rodjek/puppet-lint/pull/298) ([rodjek](https://github.com/rodjek))
data/Gemfile CHANGED
@@ -7,16 +7,27 @@ group :test do
7
7
  gem 'rspec', '~> 3.0'
8
8
  gem 'rspec-its', '~> 1.0'
9
9
  gem 'rspec-collection_matchers', '~> 1.0'
10
- gem 'rack', '~> 1.0'
11
10
 
12
11
  if RUBY_VERSION < '2.0'
13
12
  # json 2.x requires ruby 2.0. Lock to 1.8
14
- gem 'json', '~> 1.8'
15
- # json_pure 2.0.2 requires ruby 2.0. Lock to 2.0.1
16
- gem 'json_pure', '= 2.0.1'
13
+ gem 'json', '= 1.8'
14
+ # json_pure 2.0.2 requires ruby 2.0, and 2.0.1 requires ruby 1.9. Lock to 1.8.3.
15
+ gem 'json_pure', '= 1.8.3'
17
16
  # addressable 2.4.0 requires ruby 1.9.0. Lock to 2.3.8.
18
17
  gem 'addressable', '= 2.3.8'
19
18
  else
20
19
  gem 'json'
21
20
  end
21
+
22
+ if RUBY_VERSION > '1.8'
23
+ # requires ruby 1.9+, on 1.8 we'll fall back to the old regex parsing
24
+ gem 'rspec-json_expectations', '~> 1.4'
25
+ end
26
+ end
27
+
28
+ group :development do
29
+ # For Changelog generation
30
+ gem 'github_changelog_generator', :require => false if RUBY_VERSION >= '2.2.2'
31
+ gem 'github_changelog_generator', '~> 1.13.0', :require => false if RUBY_VERSION < '2.2.2'
32
+ gem 'rack', '~> 1.0', :require => false if RUBY_VERSION < '2.2.2'
22
33
  end
data/README.md CHANGED
@@ -4,15 +4,15 @@
4
4
  Status](https://secure.travis-ci.org/rodjek/puppet-lint.png)](http://travis-ci.org/rodjek/puppet-lint)
5
5
  [![Inline docs](http://inch-ci.org/github/rodjek/puppet-lint.png?branch=master)](http://inch-ci.org/github/rodjek/puppet-lint)
6
6
 
7
- The goal of this project is to implement as many of the recommended Puppet
7
+ Puppet Lint will test modules and manifests against the recommended Puppet
8
8
  style guidelines from the [Puppet Labs style
9
- guide](http://docs.puppetlabs.com/guides/style_guide.html) as practical. It is not meant to validate syntax. Please use `puppet parser validate` for that.
9
+ guide](http://docs.puppetlabs.com/guides/style_guide.html) as closely as practical. It is not meant to validate syntax. Please use `puppet parser validate` for that.
10
10
 
11
11
  ## Installation
12
12
 
13
13
  gem install puppet-lint
14
14
 
15
- ## Testing your manifests
15
+ ## Usage
16
16
 
17
17
  ### By hand
18
18
 
@@ -20,7 +20,44 @@ You can test a single manifest file by running
20
20
 
21
21
  puppet-lint <path to file>
22
22
 
23
- ### Rake task
23
+ Puppet Lint has a large number of options to modify which checks should be run.
24
+
25
+ You can disable any of the checks when running the `puppet-lint` command by
26
+ adding a `--no-<check name>-check` flag to the command. For example, if you
27
+ wanted to skip the 140 character check, you would run
28
+ ```
29
+ puppet-lint --no-140chars-check <path to file>
30
+ ```
31
+
32
+ You can also instruct puppet-lint to automatically fix issues it detects with the `--fix` flag.
33
+ ```
34
+ puppet-lint --fix /modules
35
+ ```
36
+
37
+ Note that this can be combined with the `--only-checks` option to help avoid enormous patch sets.
38
+ ```
39
+ puppet-lint --only-checks trailing_whitespace --fix modules/
40
+ ```
41
+
42
+ You can also use [control comments](http://puppet-lint.com/controlcomments/) to disable checks
43
+ within puppet code on a per line or per block basis using `#lint:ignore:<check_name>`:
44
+ ```
45
+ class foo {
46
+ $bar = 'bar'
47
+ # This ignores the double_quoted_strings check over multiple lines
48
+ # lint:ignore:double_quoted_strings
49
+ $baz = "baz"
50
+ $gronk = "gronk"
51
+ # lint:endignore
52
+
53
+ # This ignores the 140chars check on a single line
54
+ $this_line_has_a_really_long_name_and_value_that_is_much_longer_than_the_style_guide_recommends = "I mean, a really, really long line like you can't believe" # lint:ignore:140chars
55
+ }
56
+ ```
57
+
58
+ See puppet-lint --help for a full list of options.
59
+
60
+ ### Rake
24
61
 
25
62
  If you want to test your entire Puppet manifest directory, you can add
26
63
  `require 'puppet-lint/tasks/puppet-lint'` to your Rakefile and then run
@@ -64,7 +101,22 @@ the PuppetLint configuration by defining the task yourself.
64
101
  config.relative = true
65
102
  end
66
103
 
67
- ## Implemented tests
104
+ ### Settings
105
+
106
+ puppet-lint will also check for a `.puppet-lint.rc` file in the current
107
+ directory and your home directory and read in flags from there, so if you
108
+ wanted to always skip the hard tab character check, you could create
109
+ `~/.puppet-lint.rc` containing
110
+
111
+ ```
112
+ --no-hard_tabs-check
113
+ ```
114
+
115
+ ## Compatibility Warning
116
+
117
+ Release 2.1.0 of puppet-lint is the last planned version with support for Puppet 3 and Ruby 1.8.7. Future versions will drop support for these versions.
118
+
119
+ ## Implemented Tests
68
120
 
69
121
  At the moment, the following tests have been implemented:
70
122
 
@@ -88,6 +140,9 @@ At the moment, the following tests have been implemented:
88
140
  * All variables should be enclosed in braces when interpolated in a string.
89
141
  * Variables standing by themselves should not be quoted.
90
142
 
143
+ ### Capitalization
144
+ * All variables should be in lowercase
145
+
91
146
  ### Resources
92
147
 
93
148
  * All resource titles should be quoted.
data/Rakefile CHANGED
@@ -1,6 +1,19 @@
1
1
  require 'rake'
2
2
  require 'rspec/core/rake_task'
3
+ require 'puppet-lint'
3
4
 
4
5
  task :default => :test
5
6
 
6
7
  RSpec::Core::RakeTask.new(:test)
8
+
9
+ begin
10
+ require 'github_changelog_generator/task'
11
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
12
+ version = PuppetLint::VERSION
13
+ config.future_release = "#{version}"
14
+ config.exclude_labels = %w{duplicate question invalid wontfix}
15
+ end
16
+ rescue LoadError
17
+ end
18
+
19
+ # vim: syntax=ruby
@@ -1,4 +1,5 @@
1
1
  require 'set'
2
+ require 'json'
2
3
  require 'puppet-lint/version'
3
4
  require 'puppet-lint/lexer'
4
5
  require 'puppet-lint/configuration'
@@ -105,6 +106,16 @@ class PuppetLint
105
106
  end
106
107
  end
107
108
 
109
+ # Internal: Get the line of the manifest on which the problem was found
110
+ #
111
+ # message - A Hash containing all the information about a problem.
112
+ #
113
+ # Returns the problematic line as a string.
114
+ def get_context(message)
115
+ line = PuppetLint::Data.manifest_lines[message[:line] - 1]
116
+ return line.strip
117
+ end
118
+
108
119
  # Internal: Print out the line of the manifest on which the problem was found
109
120
  # as well as a marker pointing to the location on the line.
110
121
  #
@@ -114,7 +125,7 @@ class PuppetLint
114
125
  def print_context(message)
115
126
  return if message[:check] == 'documentation'
116
127
  return if message[:kind] == :fixed
117
- line = PuppetLint::Data.manifest_lines[message[:line] - 1]
128
+ line = get_context(message)
118
129
  offset = line.index(/\S/) || 1
119
130
  puts "\n #{line.strip}"
120
131
  printf "%#{message[:column] + 2 - offset}s\n\n", '^'
@@ -127,17 +138,23 @@ class PuppetLint
127
138
  #
128
139
  # Returns nothing.
129
140
  def report(problems)
141
+ json = []
130
142
  problems.each do |message|
131
143
  next if message[:kind] == :ignored && !PuppetLint.configuration.show_ignored
132
144
 
133
145
  message[:KIND] = message[:kind].to_s.upcase
134
- message[:linenumber] = message[:line]
135
146
 
136
147
  if message[:kind] == :fixed || [message[:kind], :all].include?(configuration.error_level)
137
- format_message message
138
- print_context(message) if configuration.with_context
148
+ if configuration.json
149
+ message['context'] = get_context(message) if configuration.with_context
150
+ json << message
151
+ else
152
+ format_message message
153
+ print_context(message) if configuration.with_context
154
+ end
139
155
  end
140
156
  end
157
+ puts JSON.pretty_generate(json) if configuration.json
141
158
  end
142
159
 
143
160
  # Public: Determine if PuppetLint found any errors in the manifest.
@@ -147,6 +147,7 @@ class PuppetLint
147
147
  self.log_format = ''
148
148
  self.with_context = false
149
149
  self.fix = false
150
+ self.json = false
150
151
  self.show_ignored = false
151
152
  end
152
153
  end
@@ -25,6 +25,7 @@ class PuppetLint::Data
25
25
  @resource_indexes = nil
26
26
  @class_indexes = nil
27
27
  @defined_type_indexes = nil
28
+ @node_indexes = nil
28
29
  @function_indexes = nil
29
30
  @array_indexes = nil
30
31
  @hash_indexes = nil
@@ -505,10 +506,17 @@ class PuppetLint::Data
505
506
  stack_add << [token.line, reason, check]
506
507
  end
507
508
  else
508
- stack.pop.each do |start|
509
- unless start.nil?
510
- (start[0]..token.line).each do |i|
511
- (ignore_overrides[start[2]] ||= {})[i] = start[1]
509
+ top_override = stack.pop
510
+ if top_override.nil?
511
+ # TODO: refactor to provide a way to expose problems from
512
+ # PuppetLint::Data via the normal problem reporting mechanism.
513
+ puts "WARNING: lint:endignore comment with no opening lint:ignore:<check> comment found on line #{token.line}"
514
+ else
515
+ top_override.each do |start|
516
+ unless start.nil?
517
+ (start[0]..token.line).each do |i|
518
+ (ignore_overrides[start[2]] ||= {})[i] = start[1]
519
+ end
512
520
  end
513
521
  end
514
522
  end
@@ -33,24 +33,42 @@ class PuppetLint
33
33
 
34
34
  # Internal: A Hash whose keys are Strings representing reserved keywords in
35
35
  # the Puppet DSL.
36
+ # From https://github.com/puppetlabs/puppet/blob/master/lib/puppet/pops/parser/lexer2.rb#L116-L137
37
+ # or thereabouts
36
38
  KEYWORDS = {
37
- 'class' => true,
38
39
  'case' => true,
40
+ 'class' => true,
39
41
  'default' => true,
40
42
  'define' => true,
41
43
  'import' => true,
42
44
  'if' => true,
43
- 'else' => true,
44
45
  'elsif' => true,
46
+ 'else' => true,
45
47
  'inherits' => true,
46
48
  'node' => true,
47
49
  'and' => true,
48
50
  'or' => true,
49
51
  'undef' => true,
50
- 'true' => true,
51
52
  'false' => true,
53
+ 'true' => true,
52
54
  'in' => true,
53
55
  'unless' => true,
56
+ 'function' => true,
57
+ 'type' => true,
58
+ 'attr' => true,
59
+ 'private' => true,
60
+ }
61
+
62
+ # Internal: A Hash whose keys are Strings representing reserved keywords in
63
+ # the Puppet DSL when Application Management is enabled
64
+ # From https://github.com/puppetlabs/puppet/blob/master/lib/puppet/pops/parser/lexer2.rb#L142-L159
65
+ # or therabouts
66
+ # Currently unused
67
+ APP_MANAGEMENT_TOKENS = {
68
+ 'application' => true,
69
+ 'consumes' => true,
70
+ 'produces' => true,
71
+ 'site' => true,
54
72
  }
55
73
 
56
74
  # Internal: A Hash whose keys are Symbols representing token types which
@@ -63,6 +81,8 @@ class PuppetLint
63
81
  :NOMATCH => true,
64
82
  :COMMA => true,
65
83
  :LBRACK => true,
84
+ :IF => true,
85
+ :ELSIF => true,
66
86
  }
67
87
 
68
88
  # Internal: An Array of Arrays containing tokens that can be described by
@@ -70,10 +90,10 @@ class PuppetLint
70
90
  # name of the token as a Symbol and a regular expression describing the
71
91
  # value of the token.
72
92
  KNOWN_TOKENS = [
73
- [:TYPE, /\A(Integer|Float|Boolean|Regexp|String|Array|Hash|Resource|Class|Collection|Scalar|Numeric|CatalogEntry|Data|Tuple|Struct|Optional|NotUndef|Variant|Enum|Pattern|Any|Callable|Type|Runtime|Undef|Default)/],
93
+ [:TYPE, /\A(Integer|Float|Boolean|Regexp|String|Array|Hash|Resource|Class|Collection|Scalar|Numeric|CatalogEntry|Data|Tuple|Struct|Optional|NotUndef|Variant|Enum|Pattern|Any|Callable|Type|Runtime|Undef|Default)\b/],
74
94
  [:CLASSREF, /\A(((::){0,1}[A-Z][-\w]*)+)/],
75
95
  [:NUMBER, /\A\b((?:0[xX][0-9A-Fa-f]+|0?\d+(?:\.\d+)?(?:[eE]-?\d+)?))\b/],
76
- [:NAME, /\A(((::)?[a-z0-9][-\w]*)(::[a-z0-9][-\w]*)*)/],
96
+ [:NAME, /\A(((::)?[_a-z0-9][-\w]*)(::[a-z0-9][-\w]*)*)/],
77
97
  [:LBRACK, /\A(\[)/],
78
98
  [:RBRACK, /\A(\])/],
79
99
  [:LBRACE, /\A(\{)/],
@@ -170,7 +190,7 @@ class PuppetLint
170
190
  end
171
191
 
172
192
  unless found
173
- if var_name = chunk[/\A\$((::)?([\w-]+::)*[\w-]+(\[.+?\])*)/, 1]
193
+ if var_name = chunk[/\A\$((::)?(\w+(-\w+)*::)*\w+(-\w+)*(\[.+?\])*)/, 1]
174
194
  length = var_name.size + 1
175
195
  tokens << new_token(:VARIABLE, var_name, length)
176
196
 
@@ -293,6 +313,11 @@ class PuppetLint
293
313
  @line_no += 1
294
314
  @column = 1
295
315
  end
316
+ if [:MLCOMMENT, :SSTRING, :STRING].include? type and /(?:\r\n|\r|\n)/.match(value)
317
+ lines = value.split(/(?:\r\n|\r|\n)/, -1)
318
+ @line_no += lines.length-1
319
+ @column = lines.last.length
320
+ end
296
321
 
297
322
  token
298
323
  end
@@ -346,7 +371,7 @@ class PuppetLint
346
371
  tokens << new_token(:DQMID, value, value.size, :line => line, :column => token_column)
347
372
  end
348
373
  if ss.scan(/\{/).nil?
349
- var_name = ss.scan(/(::)?([\w-]+::)*[\w-]+/)
374
+ var_name = ss.scan(/(::)?(\w+(-\w+)*::)*\w+(-\w+)*/)
350
375
  if var_name.nil?
351
376
  token_column = column + ss.pos - 1
352
377
  tokens << new_token(:DQMID, "$", 1, :line => line, :column => token_column)
@@ -83,12 +83,13 @@ class PuppetLint::OptParser
83
83
  '%{check} - The name of the check.',
84
84
  '%{message} - The message.'
85
85
  ) do |format|
86
- if format.include?('%{linenumber}')
87
- $stderr.puts "DEPRECATION: Please use %{line} instead of %{linenumber}"
88
- end
89
86
  PuppetLint.configuration.log_format = format
90
87
  end
91
88
 
89
+ opts.on('--json', 'Log output as JSON') do
90
+ PuppetLint.configuration.json = true
91
+ end
92
+
92
93
  opts.separator ''
93
94
  opts.separator ' Checks:'
94
95