puppet-lint-class_parameter-check 0.0.2 → 0.1.0

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: 94a346b76ae507c5db92f75a789160e4667e8ad1
4
- data.tar.gz: f2ba54e52a3884ca98087c347e52c7da5b7a4e26
3
+ metadata.gz: 6c5361e935c4344c4564501bec96dcadf862bc2e
4
+ data.tar.gz: 204b0beec1bee3ce66024ebe875c5dd667bf2d49
5
5
  SHA512:
6
- metadata.gz: d3a5e3e6635291883e3b58faf49a40ae4520532b0a0e5bb52b24bb9204a105cfb75f3282ca6e347f30e0ce631af9113bfa70a866e0af169cfed740ff94bfd19a
7
- data.tar.gz: 2f5e8dd8de2d17b2b7dd9dbfe5f6ab9fe90082292aca1cca83833a86146bd91a1875a549f9ce6646e249db3301a0bbbe3772ddfdad9c63b1ef55a3bb3bac7292
6
+ metadata.gz: 4cbced68e79a4d40abd5c346f94026cccae7587a422313e1cb53496502d3eba3626b21a57e3dd81c1cf4886353ee39171a4f0d992173f326e1bd3b958726ca22
7
+ data.tar.gz: e5f3c4cfeac458dd3a10003ff6656c6abd2564952af1d3c8a30b8255a32ae09738540f264541dd80ea6ba535a13f54f4652f314c48dd0ec36395cddd71e8ebeb
data/README.md CHANGED
@@ -10,4 +10,4 @@ To use this plugin, add the following like to the Gemfile in your Puppet code ba
10
10
  gem 'puppet-lint-class_parameter-check'
11
11
  ```
12
12
  ## Usage
13
- This plugin provides a new check to `puppet-lint`.
13
+ This plugin provides a new check to `puppet-lint`. It supports the `--fix` option.
@@ -0,0 +1,43 @@
1
+ class ClassParameter
2
+ attr_reader :tokens
3
+
4
+ def initialize
5
+ @tokens = []
6
+ end
7
+
8
+ def is_optional?
9
+ tokens.any? { |token| token.type == :EQUALS }
10
+ end
11
+
12
+ def is_required?
13
+ !is_optional?
14
+ end
15
+
16
+ def name
17
+ tokens.select do |token|
18
+ token.type == :VARIABLE
19
+ end.first.value
20
+ end
21
+
22
+ def add(token)
23
+ tokens << token
24
+ end
25
+
26
+ def line
27
+ tokens.first.line
28
+ end
29
+
30
+ def column
31
+ tokens.first.column
32
+ end
33
+
34
+ def <=>(other)
35
+ if (self.is_optional? && other.is_optional?) || (self.is_required? && other.is_required?)
36
+ return self.name <=> other.name
37
+ elsif self.is_optional? && other.is_required?
38
+ return 1
39
+ else
40
+ return -1
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,72 @@
1
+ require_relative 'class_parameter'
2
+
3
+ class ClassParameterList
4
+ attr_reader :errors, :start_index, :end_index
5
+
6
+ def initialize(tokens, start_index, end_index)
7
+ @tokens, @start_index, @end_index = tokens, start_index, end_index
8
+ @errors = []
9
+ end
10
+
11
+ def sort
12
+ parameters.sort
13
+ end
14
+
15
+ def optional_parameters
16
+ parameters.select(&:is_optional?)
17
+ end
18
+
19
+ def required_parameters
20
+ parameters.select(&:is_required?)
21
+ end
22
+
23
+ def validate
24
+ optional_parameter_found = false
25
+
26
+ parameters.each do |parameter|
27
+ if parameter.is_required? && optional_parameter_found
28
+ errors << {
29
+ :message => "Required parameter #{parameter.name} should be specified before optional parameters",
30
+ :line => parameter.line,
31
+ :column => parameter.column
32
+ }
33
+ elsif parameter.is_optional?
34
+ optional_parameter_found = true
35
+ end
36
+ end
37
+
38
+ validate_alphabetical_order(required_parameters)
39
+ validate_alphabetical_order(optional_parameters)
40
+
41
+ errors.empty?
42
+ end
43
+
44
+
45
+ private
46
+ def parameters
47
+ parameter = ClassParameter.new
48
+
49
+ @tokens.inject([]) do |memo, token|
50
+ if (token.type == :COMMA || token == @tokens.last) && parameter.tokens.any?
51
+ # always add a comma and a newline token at the end of each parameter
52
+ parameter.add(PuppetLint::Lexer::Token.new(:COMMA, ",", 0,0))
53
+ parameter.add(PuppetLint::Lexer::Token.new(:NEWLINE, "\n", 0,0))
54
+ memo << parameter
55
+ parameter = ClassParameter.new
56
+ elsif token.type != :NEWLINE
57
+ parameter.add(token)
58
+ end
59
+ memo
60
+ end
61
+ end
62
+
63
+ def validate_alphabetical_order(params)
64
+ if params != params.sort
65
+ errors << {
66
+ :message => "Parameter list not in alphabetical order",
67
+ :line => params.first.line,
68
+ :column => params.first.column
69
+ }
70
+ end
71
+ end
72
+ end
@@ -1,41 +1,43 @@
1
+ require_relative '../../model/class_parameter_list'
2
+
1
3
  PuppetLint.new_check(:class_parameter) do
2
4
  def check
3
- class_indexes.each do |class_index|
4
- next if class_index[:param_tokens].nil?
5
-
6
- params = []
7
- optional_params = []
5
+ class_parameter_lists.each do |class_parameter_list|
6
+ unless class_parameter_list.validate
7
+ class_parameter_list.errors.each { |error| notify :error, error }
8
+ end
9
+ end
10
+ end
8
11
 
9
- class_index[:param_tokens].each do |param_token|
10
- next unless param_token.type == :VARIABLE && param_token.prev_code_token.type != :EQUALS
12
+ def fix(problem)
13
+ resorted_tokens = []
14
+ token_index = 0
11
15
 
12
- if param_token.next_code_token.nil? || param_token.next_code_token.type != :EQUALS
13
- notify :error, {
14
- :message => "Required parameter #{param_token.value} should be specified before optional parameters",
15
- :line => param_token.line,
16
- :column => param_token.column
17
- } if optional_params.any?
16
+ class_parameter_lists.each do |class_parameter_list|
17
+ resorted_tokens += tokens[token_index..class_parameter_list.start_index]
18
18
 
19
- params.push(param_token)
20
- elsif param_token.next_code_token && param_token.next_code_token.type == :EQUALS
21
- optional_params.push(param_token)
22
- end
19
+ class_parameter_list.sort.each do |parameter|
20
+ resorted_tokens += parameter.tokens
23
21
  end
24
22
 
25
- check_alphabetical_order(params)
26
- check_alphabetical_order(optional_params)
23
+ token_index = class_parameter_list.end_index
27
24
  end
25
+
26
+ resorted_tokens += tokens[token_index..-1]
27
+ tokens.replace(resorted_tokens)
28
28
  end
29
29
 
30
- def check_alphabetical_order(params)
31
- parameter_names = params.map(&:value)
30
+ private
31
+ def class_parameter_lists
32
+ lists = []
32
33
 
33
- if parameter_names != parameter_names.sort
34
- notify :error, {
35
- :message => "Parameter list not in alphabetical order",
36
- :line => params.first.line,
37
- :column => params.first.column
38
- }
34
+ class_indexes.each do |class_index|
35
+ param_tokens = class_index[:param_tokens]
36
+ next if param_tokens.nil?
37
+
38
+ lists << ClassParameterList.new(param_tokens, tokens.index(param_tokens.first), tokens.index(param_tokens.last))
39
39
  end
40
+
41
+ lists
40
42
  end
41
43
  end
@@ -134,4 +134,89 @@ describe 'class_parameter' do
134
134
  end
135
135
  end
136
136
  end
137
+
138
+ context 'with fix enabled' do
139
+ before do
140
+ PuppetLint.configuration.fix = true
141
+ end
142
+
143
+ after do
144
+ PuppetLint.configuration.fix = false
145
+ end
146
+
147
+ context 'class with no parameters' do
148
+ let(:code) { "class puppet_module() { }" }
149
+
150
+ it 'does not change the code' do
151
+ expect(manifest).to eq(code)
152
+ end
153
+ end
154
+
155
+ context 'class sorted alphabetically' do
156
+ let(:code) { <<-EOF
157
+ class puppet_module(
158
+ String $alphabetical,
159
+ String $non_alphabetical,
160
+ ) { }
161
+ EOF
162
+ }
163
+ it 'does not change the code' do
164
+ expect(manifest).to eq(code)
165
+ end
166
+ end
167
+
168
+ context 'multiple classes not sorted alphabetically' do
169
+ let(:code) { <<-EOF
170
+ class puppet_module(
171
+ String $non_alphabetical,
172
+ String $alphabetical
173
+ ) { }
174
+
175
+ class puppet_module2(
176
+ String $non_alphabetical,
177
+ String $alphabetical
178
+ ) { }
179
+ EOF
180
+ }
181
+
182
+ it 'fixes the problem' do
183
+ expect(manifest).to eq(<<-EOF
184
+ class puppet_module(
185
+ String $alphabetical,
186
+ String $non_alphabetical,
187
+ ) { }
188
+
189
+ class puppet_module2(
190
+ String $alphabetical,
191
+ String $non_alphabetical,
192
+ ) { }
193
+ EOF
194
+ )
195
+ end
196
+ end
197
+
198
+ context 'not sorted in groups and not alphabetically' do
199
+ let(:code) { <<-EOF
200
+ class puppet_module(
201
+ String $non_alphabetical,
202
+ String $non_alphabetical_optional = $puppet_module::params::non_alphabetical_optional,
203
+ String $alphabetical,
204
+ String $alphabetical_optional = "default"
205
+ ) inherits puppet_module::params { }
206
+ EOF
207
+ }
208
+
209
+ it 'fixes the problem' do
210
+ expect(manifest).to eq(<<-EOF
211
+ class puppet_module(
212
+ String $alphabetical,
213
+ String $non_alphabetical,
214
+ String $alphabetical_optional = "default",
215
+ String $non_alphabetical_optional = $puppet_module::params::non_alphabetical_optional,
216
+ ) inherits puppet_module::params { }
217
+ EOF
218
+ )
219
+ end
220
+ end
221
+ end
137
222
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet-lint-class_parameter-check
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roelof Reitsma
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-28 00:00:00.000000000 Z
11
+ date: 2016-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: puppet-lint
@@ -91,6 +91,8 @@ extra_rdoc_files: []
91
91
  files:
92
92
  - README.md
93
93
  - LICENSE
94
+ - lib/model/class_parameter.rb
95
+ - lib/model/class_parameter_list.rb
94
96
  - lib/puppet-lint/plugins/check_class_parameter.rb
95
97
  - spec/puppet-lint/plugins/check_class_parameter_spec.rb
96
98
  - spec/spec_helper.rb