puppet-lint 0.3.1 → 0.3.2

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.
data/lib/puppet-lint.rb CHANGED
@@ -39,7 +39,7 @@ rescue
39
39
  if a.empty?
40
40
  string
41
41
  else
42
- Percent.bind(string).call(*a, &b)
42
+ Percent.bind(string).call(a, &b)
43
43
  end
44
44
 
45
45
  end
@@ -67,10 +67,14 @@ class PuppetLint::Bin
67
67
  end
68
68
 
69
69
  opts.load('/etc/puppet-lint.rc')
70
- opts.load(File.expand_path('~/.puppet-lint.rc'))
71
- if opts.load(File.expand_path('~/.puppet-lintrc'))
72
- $stderr.puts 'Depreciated: Found ~/.puppet-lintrc instead of ~/.puppet-lint.rc'
70
+
71
+ if ENV['HOME']
72
+ opts.load(File.expand_path('~/.puppet-lint.rc'))
73
+ if opts.load(File.expand_path('~/.puppet-lintrc'))
74
+ $stderr.puts 'Depreciated: Found ~/.puppet-lintrc instead of ~/.puppet-lint.rc'
75
+ end
73
76
  end
77
+
74
78
  opts.load('.puppet-lint.rc')
75
79
  if opts.load('.puppet-lintrc')
76
80
  $stderr.puts 'Depreciated: Read .puppet-lintrc instead of .puppet-lint.rc'
@@ -4,7 +4,20 @@ require 'puppet-lint/lexer/token'
4
4
  require 'set'
5
5
 
6
6
  class PuppetLint
7
- class LexerError < RuntimeError; end
7
+ class LexerError < StandardError
8
+ attr_reader :line_no, :column
9
+ def initialize(code, offset)
10
+ chunk = code[0..offset]
11
+ @line_no = chunk.count("\n") + 1
12
+ if @line_no == 1
13
+ @column = chunk.length
14
+ else
15
+ @column = chunk.length - chunk.rindex("\n") - 1
16
+ end
17
+ @column = 1 if @column == 0
18
+ end
19
+ end
20
+
8
21
  class Lexer
9
22
  KEYWORDS = {
10
23
  'class' => true,
@@ -126,12 +139,12 @@ class PuppetLint
126
139
  i += var_name.size + 1
127
140
 
128
141
  elsif chunk.match(/\A'(.*?)'/m)
129
- str_content = StringScanner.new(code[i+1..-1]).scan_until(/(\A|\\\\|[^\\])'/m)
142
+ str_content = StringScanner.new(code[i+1..-1]).scan_until(/(\A|[^\\])(\\\\)*'/m)
130
143
  tokens << new_token(:SSTRING, str_content[0..-2], :chunk => code[0..i])
131
144
  i += str_content.size + 1
132
145
 
133
146
  elsif chunk.match(/\A"/)
134
- str_contents = StringScanner.new(code[i+1..-1]).scan_until(/(\A|\\\\|[^\\])"/m)
147
+ str_contents = StringScanner.new(code[i+1..-1]).scan_until(/(\A|[^\\])(\\\\)*"/m)
135
148
  _ = code[0..i].split("\n")
136
149
  interpolate_string(str_contents, _.count, _.last.length)
137
150
  i += str_contents.size + 1
@@ -159,7 +172,7 @@ class PuppetLint
159
172
  i += mlcomment_size
160
173
 
161
174
  elsif chunk.match(/\A\/.*?\//) && possible_regex?
162
- str_content = StringScanner.new(code[i+1..-1]).scan_until(/(\A|\\\\|[^\\])\//m)
175
+ str_content = StringScanner.new(code[i+1..-1]).scan_until(/(\A|[^\\])(\\\\)*\//m)
163
176
  tokens << new_token(:REGEX, str_content[0..-2], :chunk => code[0..i])
164
177
  i += str_content.size + 1
165
178
 
@@ -181,7 +194,7 @@ class PuppetLint
181
194
  i += 1
182
195
 
183
196
  else
184
- raise PuppetLint::LexerError, chunk
197
+ raise PuppetLint::LexerError.new(code, i)
185
198
  end
186
199
  end
187
200
  end
@@ -4,7 +4,7 @@ class PuppetLint::Checks
4
4
 
5
5
  def initialize
6
6
  @problems = []
7
- @default_info = {:check => 'unknown', :linenumber => 0}
7
+ @default_info = {:check => 'unknown', :linenumber => 0, :column => 0}
8
8
 
9
9
  PuppetLint.configuration.checks.each do |check|
10
10
  method = PuppetLint.configuration.check_method[check]
@@ -36,7 +36,16 @@ class PuppetLint::Checks
36
36
 
37
37
  def load_data(fileinfo, data)
38
38
  lexer = PuppetLint::Lexer.new
39
- @tokens = lexer.tokenise(data)
39
+ begin
40
+ @tokens = lexer.tokenise(data)
41
+ rescue PuppetLint::LexerError => e
42
+ notify :error, {
43
+ :message => 'Syntax error (try running `puppet parser validate <file>`)',
44
+ :linenumber => e.line_no,
45
+ :column => e.column,
46
+ }
47
+ @tokens = []
48
+ end
40
49
  @fileinfo = fileinfo
41
50
  @data = data
42
51
  end
@@ -116,8 +116,8 @@ class PuppetLint::Plugins::CheckClasses < PuppetLint::CheckPlugin
116
116
  paren_stack = []
117
117
  param_tokens.each_index do |param_tokens_idx|
118
118
  this_token = param_tokens[param_tokens_idx]
119
- next_token = param_tokens[param_tokens_idx+1]
120
- prev_token = param_tokens[param_tokens_idx-1]
119
+ next_token = this_token.next_code_token
120
+ prev_token = this_token.prev_code_token
121
121
 
122
122
  if this_token.type == :LPAREN
123
123
  paren_stack.push(true)
@@ -1,3 +1,3 @@
1
1
  class PuppetLint
2
- VERSION = '0.3.1'
2
+ VERSION = '0.3.2'
3
3
  end
@@ -0,0 +1 @@
1
+ class { 'apacheds': master => true' }
@@ -67,6 +67,13 @@ describe PuppetLint::Bin do
67
67
  ].join("\n") }
68
68
  end
69
69
 
70
+ context 'when passed a malformed file' do
71
+ let(:args) { 'spec/fixtures/test/manifests/malformed.pp' }
72
+
73
+ its(:exitstatus) { should == 1 }
74
+ its(:stdout) { should == 'ERROR: Syntax error (try running `puppet parser validate <file>`) on line 1' }
75
+ end
76
+
70
77
  context 'when limited to errors only' do
71
78
  let(:args) { [
72
79
  '--error-level', 'error',
@@ -741,4 +741,12 @@ describe PuppetLint::Lexer do
741
741
  tokens.select { |r| r.type == :REGEX }.should == []
742
742
  end
743
743
  end
744
+
745
+ context ':STRING' do
746
+ it 'should parse strings with \\\\\\' do
747
+ expect {
748
+ @lexer.tokenise("exec { \"/bin/echo \\\\\\\"${environment}\\\\\\\"\": }")
749
+ }.to_not raise_error(PuppetLint::LexerError)
750
+ end
751
+ end
744
752
  end
@@ -6,14 +6,39 @@ describe 'class_parameter_defaults' do
6
6
 
7
7
  its(:problems) {
8
8
  should only_have_problem({
9
- :kind => :warning,
10
- :message => 'parameterised class parameter without a default value',
9
+ :kind => :warning,
10
+ :message => 'parameterised class parameter without a default value',
11
11
  :linenumber => 1,
12
12
  :column => 11,
13
13
  })
14
14
  }
15
15
  end
16
16
 
17
+ describe 'parameterised class with multiple params with a default value' do
18
+ let(:code) { "class foo($bar, $baz, $gronk) { }" }
19
+
20
+ its(:problems) do
21
+ should have_problem({
22
+ :kind => :warning,
23
+ :message => 'parameterised class parameter without a default value',
24
+ :linenumber => 1,
25
+ :column => 11,
26
+ })
27
+ should have_problem({
28
+ :kind => :warning,
29
+ :message => 'parameterised class parameter without a default value',
30
+ :linenumber => 1,
31
+ :column => 17,
32
+ })
33
+ should have_problem({
34
+ :kind => :warning,
35
+ :message => 'parameterised class parameter without a default value',
36
+ :linenumber => 1,
37
+ :column => 23,
38
+ })
39
+ end
40
+ end
41
+
17
42
  describe 'class without parameters' do
18
43
  let(:code) {"
19
44
  class myclass {
@@ -7,4 +7,14 @@ describe PuppetLint do
7
7
  subject.code = "class foo { }"
8
8
  subject.data.should_not be_nil
9
9
  end
10
+
11
+ it 'should have support for % with a hash' do
12
+ string = 'replace %{hash}' % {:hash => 'replaced'}
13
+ string.should match 'replace replaced'
14
+ end
15
+
16
+ it 'should not break regular % support' do
17
+ string = 'replace %s %s' % ['get','replaced']
18
+ string.should match 'replace get replaced'
19
+ end
10
20
  end
metadata CHANGED
@@ -1,76 +1,72 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: puppet-lint
3
- version: !ruby/object:Gem::Version
4
- hash: 17
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.2
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 1
10
- version: 0.3.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Tim Sharpe
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-09-26 00:00:00 -07:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2012-10-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: rspec
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rdoc
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
39
25
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
47
38
  type: :development
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: rcov
51
39
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
53
41
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rcov
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
61
54
  type: :development
62
- version_requirements: *id003
63
- description: |-
64
- Checks your Puppet manifests against the Puppetlabs
65
- style guide and alerts you to any discrepancies.
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: ! "Checks your Puppet manifests against the Puppetlabs\n style guide
63
+ and alerts you to any discrepancies."
66
64
  email: tim@sharpe.id.au
67
- executables:
65
+ executables:
68
66
  - puppet-lint
69
67
  extensions: []
70
-
71
68
  extra_rdoc_files: []
72
-
73
- files:
69
+ files:
74
70
  - .gitignore
75
71
  - .travis.yml
76
72
  - Gemfile
@@ -98,6 +94,7 @@ files:
98
94
  - puppet-lint.gemspec
99
95
  - spec/fixtures/test/manifests/fail.pp
100
96
  - spec/fixtures/test/manifests/init.pp
97
+ - spec/fixtures/test/manifests/malformed.pp
101
98
  - spec/fixtures/test/manifests/warning.pp
102
99
  - spec/puppet-lint/bin_spec.rb
103
100
  - spec/puppet-lint/configuration_spec.rb
@@ -136,43 +133,34 @@ files:
136
133
  - spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb
137
134
  - spec/puppet-lint_spec.rb
138
135
  - spec/spec_helper.rb
139
- has_rdoc: true
140
136
  homepage: https://github.com/rodjek/puppet-lint/
141
137
  licenses: []
142
-
143
138
  post_install_message:
144
139
  rdoc_options: []
145
-
146
- require_paths:
140
+ require_paths:
147
141
  - lib
148
- required_ruby_version: !ruby/object:Gem::Requirement
142
+ required_ruby_version: !ruby/object:Gem::Requirement
149
143
  none: false
150
- requirements:
151
- - - ">="
152
- - !ruby/object:Gem::Version
153
- hash: 3
154
- segments:
155
- - 0
156
- version: "0"
157
- required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ! '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
149
  none: false
159
- requirements:
160
- - - ">="
161
- - !ruby/object:Gem::Version
162
- hash: 3
163
- segments:
164
- - 0
165
- version: "0"
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
166
154
  requirements: []
167
-
168
155
  rubyforge_project:
169
- rubygems_version: 1.6.2
156
+ rubygems_version: 1.8.23
170
157
  signing_key:
171
158
  specification_version: 3
172
159
  summary: Ensure your Puppet manifests conform with the Puppetlabs style guide
173
- test_files:
160
+ test_files:
174
161
  - spec/fixtures/test/manifests/fail.pp
175
162
  - spec/fixtures/test/manifests/init.pp
163
+ - spec/fixtures/test/manifests/malformed.pp
176
164
  - spec/fixtures/test/manifests/warning.pp
177
165
  - spec/puppet-lint/bin_spec.rb
178
166
  - spec/puppet-lint/configuration_spec.rb