puppet-lint-class_alignment-check 0.2.2 → 0.2.5

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
  SHA256:
3
- metadata.gz: 353b9e1ee8377e4b5c9c123cb085c1938d8bc0aaac7e1530d1d4196335536bb9
4
- data.tar.gz: fe8828f2dbf5c3564d9ac0f85c19600fb50f7ed4c97c4758c8464ca16e579524
3
+ metadata.gz: a097f4f616f220ca1061819f771b0e9553f89d91f2de912b271026d6a1be2640
4
+ data.tar.gz: 0db8265872341ec18239a51144d2ec7fd288f71488f1b5bf2174726c17bf279d
5
5
  SHA512:
6
- metadata.gz: ee8c5781dd514939d0ee515e392fa7e697332b556cf4898ec99fe6eb71b5347c85a8f1de3b270688d821ebbf9ffe621a65da8c14958a89d19b5a828c4a0dc7b0
7
- data.tar.gz: a27fcde6ff8fc088fa94bdacb8ac0e40c5b322039f31d7e797e50548c3714679793f3bd6d01df398973277f5a95373b59e0973fa3170d4716a0a08fff7af389d
6
+ metadata.gz: a5d927d414770af9512912b5ee24eeedfafbfb1987984f0ad5806e6950c1f9efc56ed542114bb1933eb9920f4fbc9367ef9f9233c2ec6c20ed170857e204010b
7
+ data.tar.gz: 2dfa0a335795a1d5b21a35b9e68a01fcc19a2ef77efaa50a91c2460e12a7cae7e3fde92d772aa4fbc7f285bafbf5ceb98b62a7c146eb6cd140d9a748cdc02b97
@@ -0,0 +1,195 @@
1
+ # Parameters to classes or defined types must be uniformly indented in two
2
+ # spaces from the title. The equals sign should be aligned.
3
+ #
4
+ # https://puppet.com/docs/puppet/7/style_guide.html#style_guide_classes-param-indentation-alignment
5
+
6
+ def a_param?(token)
7
+ if token&.prev_code_token&.type == :EQUALS
8
+ false
9
+ elsif token&.prev_code_token&.type == :FARROW
10
+ false
11
+ elsif token&.type == :VARIABLE && !%i[DQPRE DQMID].include?(token.prev_code_token.type)
12
+ true
13
+ end
14
+ end
15
+
16
+ def first_on_the_line?(token, type)
17
+ origin = token
18
+ while token&.prev_token
19
+ token = token.prev_token
20
+
21
+ break if token.type == :NEWLINE
22
+ end
23
+
24
+ while token&.next_token
25
+ token = token.next_token
26
+
27
+ break if token.type == type
28
+ end
29
+
30
+ origin == token
31
+ end
32
+
33
+ def the_one?(token, character)
34
+ case character
35
+ when '='
36
+ true if token.type == :EQUALS && first_on_the_line?(token, :EQUALS)
37
+ when '$'
38
+ true if a_param?(token) && first_on_the_line?(token, :VARIABLE)
39
+ end
40
+ end
41
+
42
+ def get_the_first_param(token)
43
+ while token&.prev_code_token
44
+ token = token.prev_code_token
45
+ break if token.type == :CLASS
46
+ end
47
+
48
+ while token&.next_code_token
49
+ token = token.next_code_token
50
+ return token if token.type == :VARIABLE
51
+ end
52
+ end
53
+
54
+ def get_prev_code_token(token, character)
55
+ case character
56
+ when '='
57
+ token.prev_code_token
58
+ when '$'
59
+ if token.prev_code_token
60
+ if %i[CLASSREF RBRACK].include?(token.prev_code_token.type)
61
+ token.prev_code_token
62
+ elsif token.prev_code_token.type == :LPAREN
63
+ token
64
+ elsif token.prev_code_token.type == :COMMA
65
+ get_the_first_param(token)
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ # This function is copied & modified from puppet-lint arrow_alignment check
72
+ # https://github.com/puppetlabs/puppet-lint/blob/020143b705b023946739eb44e7c7d99fcd087527/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb#L8
73
+ def check_for(character)
74
+ # I intentionally didn't rename `arrow` to another name, to keep the code as
75
+ # similar as the original one, to easier to update in the future.
76
+ (class_indexes + defined_type_indexes).each do |res_idx|
77
+ arrow_column = [0]
78
+ level_idx = 0
79
+ level_tokens = []
80
+ param_column = [nil]
81
+ resource_tokens = res_idx[:param_tokens]
82
+ next if resource_tokens.nil?
83
+
84
+ resource_tokens.reject! do |token|
85
+ COMMENT_TYPES.include?(token.type)
86
+ end
87
+
88
+ # If this is a single line resource, skip it
89
+ first_arrow = resource_tokens.index { |r| the_one?(r, character) }
90
+ last_arrow = resource_tokens.rindex { |r| the_one?(r, character) }
91
+ next if first_arrow.nil?
92
+ next if last_arrow.nil?
93
+ next if resource_tokens[first_arrow].line == resource_tokens[last_arrow].line
94
+
95
+ resource_tokens.each do |token|
96
+ if the_one?(token, character)
97
+ param_token = get_prev_code_token(token, character)
98
+ param_token = token if param_token.nil?
99
+
100
+ param_length = param_token.to_manifest.length
101
+
102
+ param_column[level_idx] = param_token.column if param_column[level_idx].nil?
103
+
104
+ if (level_tokens[level_idx] ||= []).any? { |t| t.line == token.line }
105
+ this_arrow_column = param_column[level_idx] + param_length + 1
106
+ elsif character == '$' && param_token.type == :VARIABLE
107
+ this_arrow_column = param_token.column
108
+ else
109
+ this_arrow_column = param_token.column + param_token.to_manifest.length
110
+ this_arrow_column += 1 if param_token.type != :INDENT
111
+ end
112
+
113
+ arrow_column[level_idx] = this_arrow_column if arrow_column[level_idx] < this_arrow_column
114
+
115
+ (level_tokens[level_idx] ||= []) << token
116
+ elsif token == resource_tokens[0]
117
+ level_idx += 1
118
+ arrow_column << 0
119
+ level_tokens[level_idx] ||= []
120
+ param_column << nil
121
+ elsif token == resource_tokens[-1]
122
+ if (level_tokens[level_idx] ||= []).map(&:line).uniq.length > 1
123
+ level_tokens[level_idx].each do |arrow_tok|
124
+ next if arrow_tok.column == arrow_column[level_idx] || level_tokens[level_idx].size == 1
125
+
126
+ arrows_on_line = level_tokens[level_idx].select { |t| t.line == arrow_tok.line }
127
+ notify(
128
+ :warning,
129
+ message: "indentation of #{character} is not properly aligned (expected in column #{arrow_column[level_idx]}, but found it in column #{arrow_tok.column})",
130
+ line: arrow_tok.line,
131
+ column: arrow_tok.column,
132
+ token: arrow_tok,
133
+ arrow_column: arrow_column[level_idx],
134
+ newline: arrows_on_line.index(arrow_tok) != 0,
135
+ newline_indent: param_column[level_idx] - 1
136
+ )
137
+ end
138
+ end
139
+ arrow_column[level_idx] = 0
140
+ level_tokens[level_idx].clear
141
+ param_column[level_idx] = nil
142
+ level_idx -= 1
143
+ end
144
+ end
145
+ end
146
+ end
147
+
148
+ # This function is copied & modified from puppet-lint arrow_alignment fix
149
+ # https://github.com/puppetlabs/puppet-lint/blob/020143b705b023946739eb44e7c7d99fcd087527/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb#L94
150
+ def fix_for(problem)
151
+ raise PuppetLint::NoFix if problem[:newline]
152
+
153
+ new_ws_len = if problem[:token].prev_token.type == :WHITESPACE
154
+ problem[:token].prev_token.to_manifest.length
155
+ else
156
+ 0
157
+ end
158
+ new_ws_len += (problem[:arrow_column] - problem[:token].column)
159
+
160
+ if new_ws_len.negative?
161
+ raise PuppetLint::NoFix if problem[:token].prev_token.type != :INDENT
162
+
163
+ new_ws = problem[:token].prev_token.to_manifest[0...new_ws_len]
164
+ problem[:token].prev_token.value = new_ws
165
+ else
166
+ new_ws = ' ' * new_ws_len
167
+
168
+ if problem[:token].prev_token.type == :WHITESPACE
169
+ problem[:token].prev_token.value = new_ws
170
+ else
171
+ index = tokens.index(problem[:token].prev_token)
172
+ tokens.insert(index + 1, PuppetLint::Lexer::Token.new(:WHITESPACE, new_ws, 0, 0))
173
+ end
174
+ end
175
+ end
176
+
177
+ PuppetLint.new_check(:class_params_alignment) do
178
+ def check
179
+ check_for('$')
180
+ end
181
+
182
+ def fix(problem)
183
+ fix_for(problem)
184
+ end
185
+ end
186
+
187
+ PuppetLint.new_check(:class_equals_alignment) do
188
+ def check
189
+ check_for('=')
190
+ end
191
+
192
+ def fix(problem)
193
+ fix_for(problem)
194
+ end
195
+ end
@@ -241,13 +241,12 @@ describe 'class_equals_alignment' do
241
241
  END
242
242
  end
243
243
 
244
- it 'should detect 2 problems' do
245
- expect(problems).to have(2).problems
244
+ it 'should detect 1 problem' do
245
+ expect(problems).to have(1).problems
246
246
  end
247
247
 
248
- it 'should create 2 warnings' do
248
+ it 'should create 1 warning' do
249
249
  expect(problems).to contain_warning(format(msg, 18, 16)).on_line(2).in_column(16)
250
- expect(problems).to contain_warning(format(msg, 18, 29)).on_line(2).in_column(29)
251
250
  end
252
251
  end
253
252
  end
@@ -424,23 +423,21 @@ describe 'class_equals_alignment' do
424
423
  let(:fixed) do
425
424
  <<-END
426
425
  class test (
427
- $a = 'foo',
428
- $bb = 'bar',
426
+ $a = 'foo', $bb = 'bar',
429
427
  $ccc = 'baz',
430
428
  ) {}
431
429
  END
432
430
  end
433
431
 
434
- it 'should detect 2 problems' do
435
- expect(problems).to have(2).problems
432
+ it 'should detect 1 problem' do
433
+ expect(problems).to have(1).problems
436
434
  end
437
435
 
438
- it 'should fix 2 problems' do
436
+ it 'should fix 1 problem' do
439
437
  expect(problems).to contain_fixed(format(msg, 18, 16)).on_line(2).in_column(16)
440
- expect(problems).to contain_fixed(format(msg, 18, 29)).on_line(2).in_column(29)
441
438
  end
442
439
 
443
- it 'should move the extra param onto its own line and realign' do
440
+ it 'should not move the extra param onto its own line and realign' do
444
441
  expect(manifest).to eq(fixed)
445
442
  end
446
443
  end
@@ -458,24 +455,21 @@ describe 'class_equals_alignment' do
458
455
  let(:fixed) do
459
456
  <<-END
460
457
  class test (
461
- $a = 'foo',
462
- $bbccc = 'bar',
463
- $ccc = 'baz',
458
+ $a = 'foo', $bbccc = 'bar',
459
+ $ccc = 'baz',
464
460
  ) {}
465
461
  END
466
462
  end
467
463
 
468
- it 'should detect 2 problems' do
469
- expect(problems).to have(3).problems
464
+ it 'should detect 1 problem' do
465
+ expect(problems).to have(1).problems
470
466
  end
471
467
 
472
- it 'should fix 2 problems' do
473
- expect(problems).to contain_fixed(format(msg, 20, 16)).on_line(2).in_column(16)
474
- expect(problems).to contain_fixed(format(msg, 20, 32)).on_line(2).in_column(32)
475
- expect(problems).to contain_fixed(format(msg, 20, 18)).on_line(3).in_column(18)
468
+ it 'should fix 1 problem' do
469
+ expect(problems).to contain_fixed(format(msg, 18, 16)).on_line(2).in_column(16)
476
470
  end
477
471
 
478
- it 'should move the extra param onto its own line and realign' do
472
+ it 'should not move the extra param onto its own line and realign' do
479
473
  expect(manifest).to eq(fixed)
480
474
  end
481
475
  end
@@ -280,7 +280,7 @@ describe 'class_params_alignment' do
280
280
  <<-END
281
281
  class name (
282
282
  $aaa = function('foo', 'bar'),
283
- $bbb = function('foo', 'bar'),
283
+ $bbb = function('foo', 'bar'),
284
284
  Boolean $key1 = false,
285
285
  Enum['never', 'allow', 'try', 'demand'] $key2,
286
286
  $materializer_version = $foo ? {
@@ -308,7 +308,7 @@ describe 'class_params_alignment' do
308
308
 
309
309
  it 'should fix 4 problems' do
310
310
  expect(problems).to contain_fixed(format(msg, 53, 13)).on_line(2).in_column(13)
311
- expect(problems).to contain_fixed(format(msg, 53, 13)).on_line(3).in_column(13)
311
+ expect(problems).to contain_fixed(format(msg, 53, 15)).on_line(3).in_column(15)
312
312
  expect(problems).to contain_fixed(format(msg, 53, 21)).on_line(4).in_column(21)
313
313
  expect(problems).to contain_fixed(format(msg, 53, 11)).on_line(6).in_column(11)
314
314
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet-lint-class_alignment-check
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anh Pham
@@ -122,6 +122,7 @@ extra_rdoc_files: []
122
122
  files:
123
123
  - LICENSE
124
124
  - README.md
125
+ - lib/puppet-lint/plugins/check_class_alignment.rb
125
126
  - spec/puppet-lint/plugins/check_class_equals_alignment_spec.rb
126
127
  - spec/puppet-lint/plugins/check_class_params_alignment_spec.rb
127
128
  - spec/spec_helper.rb