puppet-lint-wmf_styleguide-check 1.0.7 → 1.1.1
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 899c8c3526bd03b42700fe80c845fc590fc60876ef10410e1216fcab6e4ac7e5
|
4
|
+
data.tar.gz: 4ed16c3cff59cfa2c72b6dca1af26210daca111ff92e984c999087acd5c44b62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b550d1bf27ecffec3b069cf131367232a0b65dc8da3c6296054aa6d1c634b655bd291cece4bf6c71fbb4a2e41939f6455c86a8a594e36d1fe486178f24eec3b8
|
7
|
+
data.tar.gz: d0641b8fd0fe54e5430a1fab4f5e0b40d24d97243ceed0d8195d9faeaa2c57700b91597af050c962b959aed2c0fba6edb4600badc66286d91440df31a57e9110
|
@@ -102,9 +102,14 @@ class PuppetResource
|
|
102
102
|
class? && (module_name == role_module)
|
103
103
|
end
|
104
104
|
|
105
|
-
def
|
105
|
+
def lookup_calls
|
106
|
+
# Returns an array of all the tokens referencing calls to lookup
|
107
|
+
@resource[:tokens].select(&:lookup?)
|
108
|
+
end
|
109
|
+
|
110
|
+
def legacy_hiera_calls
|
106
111
|
# Returns an array of all the tokens referencing calls to hiera
|
107
|
-
@resource[:tokens].select(&:
|
112
|
+
@resource[:tokens].select(&:legacy_hiera?)
|
108
113
|
end
|
109
114
|
|
110
115
|
def legacy_validate_calls
|
@@ -145,9 +150,9 @@ class PuppetLint
|
|
145
150
|
[:NAME, :FUNCTION_NAME].include?(@type) && @next_code_token.type == :LPAREN
|
146
151
|
end
|
147
152
|
|
148
|
-
def
|
149
|
-
#
|
150
|
-
function? && ['hiera', 'hiera_array', 'hiera_hash'
|
153
|
+
def legacy_hiera?
|
154
|
+
# Using old hiera call
|
155
|
+
function? && ['hiera', 'hiera_array', 'hiera_hash'].include?(@value)
|
151
156
|
end
|
152
157
|
|
153
158
|
def lookup?
|
@@ -198,10 +203,10 @@ end
|
|
198
203
|
|
199
204
|
# Checks and functions
|
200
205
|
def check_profile(klass)
|
201
|
-
# All parameters of profiles should have a default value that is a
|
206
|
+
# All parameters of profiles should have a default value that is a lookup
|
202
207
|
params_without_lookup_defaults klass
|
203
|
-
# All
|
204
|
-
|
208
|
+
# All lookup lookups should be in parameters
|
209
|
+
lookup_not_in_params klass
|
205
210
|
# Only a few selected classes should be included in a profile
|
206
211
|
profile_illegal_include klass
|
207
212
|
# System::role only goes in roles
|
@@ -210,7 +215,7 @@ end
|
|
210
215
|
|
211
216
|
def check_role(klass)
|
212
217
|
# Hiera lookups within a role are forbidden
|
213
|
-
|
218
|
+
lookup klass
|
214
219
|
# A role should only include profiles
|
215
220
|
include_not_profile klass
|
216
221
|
# A call, and only one, to system::role will be done
|
@@ -220,8 +225,8 @@ def check_role(klass)
|
|
220
225
|
end
|
221
226
|
|
222
227
|
def check_class(klass)
|
223
|
-
# No
|
224
|
-
|
228
|
+
# No lookup lookups allowed in a class.
|
229
|
+
lookup klass
|
225
230
|
# Cannot include or declare classes from other modules
|
226
231
|
class_illegal_include klass
|
227
232
|
illegal_class_declaration klass
|
@@ -230,28 +235,42 @@ def check_class(klass)
|
|
230
235
|
end
|
231
236
|
|
232
237
|
def check_define(define)
|
233
|
-
# No
|
234
|
-
|
238
|
+
# No lookup calls are admitted in defines. ever.
|
239
|
+
lookup define
|
235
240
|
# No class can be included in defines, like in classes
|
236
241
|
class_illegal_include define
|
237
242
|
# Non-profile defines should respect the rules for classes
|
238
243
|
illegal_class_declaration define unless define.module_name == 'profile'
|
239
244
|
end
|
240
245
|
|
241
|
-
def
|
242
|
-
# Searches for
|
243
|
-
|
246
|
+
def lookup(klass)
|
247
|
+
# Searches for lookup calls inside classes and defines.
|
248
|
+
lookup_errors(klass.lookup_calls, klass)
|
249
|
+
end
|
250
|
+
|
251
|
+
def legacy_hiera(klass)
|
252
|
+
# No calls to legacy hiera
|
253
|
+
tokens = klass.legacy_hiera_calls
|
254
|
+
tokens.each do |token|
|
255
|
+
msg = {
|
256
|
+
message: "wmf-style: Found deprecated function (#{token.value}) " \
|
257
|
+
"in #{klass.type} '#{klass.name}', use lookup instead",
|
258
|
+
line: token.line,
|
259
|
+
column: token.column
|
260
|
+
}
|
261
|
+
notify :error, msg
|
262
|
+
end
|
244
263
|
end
|
245
264
|
|
246
265
|
def params_without_lookup_defaults(klass)
|
247
|
-
# Finds parameters that have no
|
266
|
+
# Finds parameters that have no lookup-defined default value.
|
248
267
|
klass.params.each do |name, data|
|
249
268
|
next unless data[:value].select(&:lookup?).empty?
|
250
269
|
common = "wmf-style: Parameter '#{name}' of class '#{klass.name}'"
|
251
|
-
message = if data[:value].select(&:
|
270
|
+
message = if data[:value].select(&:legacy_hiera?).empty?
|
252
271
|
"#{common} has no call to lookup"
|
253
272
|
else
|
254
|
-
"#{common}
|
273
|
+
"#{common} hiera is deprecated use lookup"
|
255
274
|
end
|
256
275
|
token = data[:param]
|
257
276
|
msg = { message: message, line: token.line, column: token.column }
|
@@ -259,24 +278,24 @@ def params_without_lookup_defaults(klass)
|
|
259
278
|
end
|
260
279
|
end
|
261
280
|
|
262
|
-
def
|
263
|
-
# Checks if a
|
281
|
+
def lookup_not_in_params(klass)
|
282
|
+
# Checks if a lookup call is not in a parameter declaration. Used to check profiles
|
264
283
|
|
265
|
-
# Any
|
266
|
-
tokens = klass.
|
284
|
+
# Any lookup call that is not inside a parameter declaration is a violation
|
285
|
+
tokens = klass.lookup_calls.reject do |token|
|
267
286
|
maybe_param = token.prev_code_token.prev_code_token
|
268
287
|
klass.params.keys.include?(maybe_param.value)
|
269
288
|
end
|
270
|
-
|
289
|
+
lookup_errors(tokens, klass)
|
271
290
|
end
|
272
291
|
|
273
|
-
def
|
274
|
-
# Helper for printing
|
292
|
+
def lookup_errors(tokens, klass)
|
293
|
+
# Helper for printing lookup errors nicely
|
275
294
|
tokens.each do |token|
|
276
|
-
#
|
295
|
+
# lookup ( 'some::label' )
|
277
296
|
value = token.next_code_token.next_code_token.value
|
278
297
|
msg = {
|
279
|
-
message: "wmf-style: Found
|
298
|
+
message: "wmf-style: Found lookup call in #{klass.type} '#{klass.name}' for '#{value}'",
|
280
299
|
line: token.line,
|
281
300
|
column: token.column
|
282
301
|
}
|
@@ -402,6 +421,7 @@ end
|
|
402
421
|
def check_deprecations(resource)
|
403
422
|
# Check the resource for declarations of deprecated defines
|
404
423
|
legacy_validate_errors resource
|
424
|
+
legacy_hiera resource
|
405
425
|
deprecated_defines = ['base::service_unit']
|
406
426
|
deprecated_defines.each do |deprecated|
|
407
427
|
resource.resource?(deprecated).each do |token|
|
@@ -420,13 +440,18 @@ def check_node(node)
|
|
420
440
|
title = node[:title_tokens].map(&:value).join(', ')
|
421
441
|
node[:tokens].each do |token|
|
422
442
|
msg = nil
|
423
|
-
if token.
|
443
|
+
if token.lookup?
|
424
444
|
msg = {
|
425
|
-
message: "wmf-style:
|
445
|
+
message: "wmf-style: node '#{title}' calls lookup function",
|
446
|
+
line: token.line,
|
447
|
+
column: token.column
|
448
|
+
}
|
449
|
+
elsif token.legacy_hiera?
|
450
|
+
msg = {
|
451
|
+
message: "wmf-style: node '#{title}' calls legacy #{token.value} function",
|
426
452
|
line: token.line,
|
427
453
|
column: token.column
|
428
454
|
}
|
429
|
-
|
430
455
|
elsif token.class_include?
|
431
456
|
msg = {
|
432
457
|
message: "wmf-style: node '#{title}' includes class #{token.included_class.value}",
|
@@ -445,12 +470,6 @@ def check_node(node)
|
|
445
470
|
line: token.line,
|
446
471
|
column: token.column
|
447
472
|
}
|
448
|
-
elsif token.role_keyword? && token.next_code_token.next_code_token.next_code_token.type != :RPAREN
|
449
|
-
msg = {
|
450
|
-
message: "wmf-style: node '#{title}' includes multiple roles",
|
451
|
-
line: token.line,
|
452
|
-
column: token.column
|
453
|
-
}
|
454
473
|
end
|
455
474
|
notify :error, msg if msg
|
456
475
|
end
|
@@ -474,6 +493,15 @@ PuppetLint.new_check(:wmf_styleguide) do
|
|
474
493
|
# If we're not within a node definition, skip this token
|
475
494
|
next unless in_node_def
|
476
495
|
case token.type
|
496
|
+
when :REGEX
|
497
|
+
if !token.value.start_with?('^') || !token.value.end_with?('$')
|
498
|
+
msg = {
|
499
|
+
message: "wmf-style: regex node matching must match the whole string (^...$), got: #{token.value}",
|
500
|
+
line: token.line,
|
501
|
+
column: token.column
|
502
|
+
}
|
503
|
+
notify :error, msg
|
504
|
+
end
|
477
505
|
when :LBRACE
|
478
506
|
title_tokens = tokens[start + 1..(i - 1)].select(&:node_def?) if braces_level.zero?
|
479
507
|
braces_level += 1
|
@@ -14,13 +14,16 @@ EOF
|
|
14
14
|
|
15
15
|
class_ko = <<-EOF
|
16
16
|
class foo($t=hiera('foo::title')) {
|
17
|
-
$msg =
|
17
|
+
$msg = lookup( "foo::bar")
|
18
18
|
notice($msg)
|
19
19
|
notice($t)
|
20
20
|
include ::passwords::redis
|
21
21
|
class { 'bar': }
|
22
22
|
validate_foobar($param)
|
23
23
|
validate_re($param, '^.*$')
|
24
|
+
hiera('foobar')
|
25
|
+
hiera_hash('foobar')
|
26
|
+
hiera_array('foobar')
|
24
27
|
}
|
25
28
|
EOF
|
26
29
|
|
@@ -42,7 +45,7 @@ class profile::fixme (
|
|
42
45
|
$test4=hiera_hash('profile::foobar::foo')
|
43
46
|
) {
|
44
47
|
include ::apache2::common
|
45
|
-
$role =
|
48
|
+
$role = lookup('role')
|
46
49
|
system::role { $role: }
|
47
50
|
}
|
48
51
|
EOF
|
@@ -78,23 +81,46 @@ define foo::fixme ($a=hiera('something')) {
|
|
78
81
|
class { '::bar': }
|
79
82
|
validate_foobar($param)
|
80
83
|
validate_re($param, '^.*$')
|
84
|
+
hiera('foobar')
|
85
|
+
hiera_hash('foobar')
|
86
|
+
hiera_array('foobar')
|
81
87
|
}
|
82
88
|
EOF
|
83
89
|
|
84
90
|
node_ok = <<-EOF
|
85
|
-
node /^test1
|
91
|
+
node /^test1.*\\.example\\.com$/ {
|
86
92
|
role(spare::system)
|
87
93
|
}
|
88
94
|
EOF
|
89
95
|
|
90
96
|
node_ko = <<-EOF
|
91
97
|
node 'fixme' {
|
92
|
-
role(spare::system,
|
93
|
-
mediawiki::appserver)
|
94
98
|
include base::firewall
|
95
99
|
interface::mapped { 'eth0':
|
96
100
|
foo => 'bar'
|
97
101
|
}
|
102
|
+
lookup('foobar')
|
103
|
+
hiera('foobar')
|
104
|
+
hiera_array('foobar')
|
105
|
+
hiera_hash('foobar')
|
106
|
+
}
|
107
|
+
EOF
|
108
|
+
|
109
|
+
node_regex_missing_start = <<-EOF
|
110
|
+
node /test1.*\\.example\\.com$/ {
|
111
|
+
role(spare::system)
|
112
|
+
}
|
113
|
+
EOF
|
114
|
+
|
115
|
+
node_regex_missing_end = <<-EOF
|
116
|
+
node /^test1.*\\.example\\.com/ {
|
117
|
+
role(spare::system)
|
118
|
+
}
|
119
|
+
EOF
|
120
|
+
|
121
|
+
node_regex_missing_both = <<-EOF
|
122
|
+
node /test1.*\\.example\\.com/ {
|
123
|
+
role(spare::system)
|
98
124
|
}
|
99
125
|
EOF
|
100
126
|
|
@@ -128,8 +154,8 @@ describe 'wmf_styleguide' do
|
|
128
154
|
context 'class with errors' do
|
129
155
|
let(:code) { class_ko }
|
130
156
|
it 'should create errors for hiera declarations' do
|
131
|
-
expect(problems).to contain_error("wmf-style: Found hiera
|
132
|
-
expect(problems).to contain_error("wmf-style: Found
|
157
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera) in class 'foo', use lookup instead").on_line(1).in_column(14)
|
158
|
+
expect(problems).to contain_error("wmf-style: Found lookup call in class 'foo' for 'foo::bar'").on_line(2).in_column(15)
|
133
159
|
end
|
134
160
|
it 'should create errors for included classes' do
|
135
161
|
expect(problems).to contain_error("wmf-style: class 'foo' includes passwords::redis from another module").on_line(5).in_column(16)
|
@@ -139,18 +165,27 @@ describe 'wmf_styleguide' do
|
|
139
165
|
expect(problems).to contain_error("wmf-style: Found legacy function (validate_foobar) call in class 'foo'").on_line(7).in_column(8)
|
140
166
|
expect(problems).to contain_error("wmf-style: Found legacy function (validate_re) call in class 'foo'").on_line(8).in_column(8)
|
141
167
|
end
|
168
|
+
it 'should create errors for hiera function' do
|
169
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera) in class 'foo', use lookup instead").on_line(9).in_column(8)
|
170
|
+
end
|
171
|
+
it 'should create errors for hiera_hash function' do
|
172
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera_hash) in class 'foo', use lookup instead").on_line(10).in_column(8)
|
173
|
+
end
|
174
|
+
it 'should create errors for hiera_array function' do
|
175
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera_array) in class 'foo', use lookup instead").on_line(11).in_column(8)
|
176
|
+
end
|
142
177
|
end
|
143
178
|
|
144
179
|
context 'profile with errors' do
|
145
180
|
let(:code) { profile_ko }
|
146
181
|
it 'should create errors for parameters without hiera defaults' do
|
147
182
|
expect(problems).to contain_error("wmf-style: Parameter 'test1' of class 'profile::fixme' has no call to lookup").on_line(2).in_column(7)
|
148
|
-
expect(problems).to contain_error("wmf-style: Parameter 'test2' of class 'profile::fixme'
|
149
|
-
expect(problems).to contain_error("wmf-style: Parameter 'test3' of class 'profile::fixme'
|
150
|
-
expect(problems).to contain_error("wmf-style: Parameter 'test4' of class 'profile::fixme'
|
183
|
+
expect(problems).to contain_error("wmf-style: Parameter 'test2' of class 'profile::fixme' hiera is deprecated use lookup").on_line(3).in_column(7)
|
184
|
+
expect(problems).to contain_error("wmf-style: Parameter 'test3' of class 'profile::fixme' hiera is deprecated use lookup").on_line(4).in_column(7)
|
185
|
+
expect(problems).to contain_error("wmf-style: Parameter 'test4' of class 'profile::fixme' hiera is deprecated use lookup").on_line(5).in_column(7)
|
151
186
|
end
|
152
187
|
it 'should create errors for hiera calls in body' do
|
153
|
-
expect(problems).to contain_error("wmf-style: Found
|
188
|
+
expect(problems).to contain_error("wmf-style: Found lookup call in class 'profile::fixme' for 'role'").on_line(8).in_column(13)
|
154
189
|
end
|
155
190
|
it 'should create errors for use of system::role' do
|
156
191
|
expect(problems).to contain_error("wmf-style: class 'profile::fixme' declares system::role, which should only be used in roles").on_line(9).in_column(5)
|
@@ -175,7 +210,7 @@ describe 'wmf_styleguide' do
|
|
175
210
|
context 'defined type with violations' do
|
176
211
|
let(:code) { define_ko }
|
177
212
|
it 'should not contain hiera calls' do
|
178
|
-
expect(problems).to contain_error("wmf-style: Found hiera
|
213
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera) in defined type 'foo::fixme', use lookup instead").on_line(1)
|
179
214
|
end
|
180
215
|
it 'should not include or define any class' do
|
181
216
|
expect(problems).to contain_error("wmf-style: defined type 'foo::fixme' declares class bar from another module").on_line(3)
|
@@ -184,6 +219,15 @@ describe 'wmf_styleguide' do
|
|
184
219
|
expect(problems).to contain_error("wmf-style: Found legacy function (validate_foobar) call in defined type 'foo::fixme'").on_line(4).in_column(8)
|
185
220
|
expect(problems).to contain_error("wmf-style: Found legacy function (validate_re) call in defined type 'foo::fixme'").on_line(5).in_column(8)
|
186
221
|
end
|
222
|
+
it 'should create errors for hiera function' do
|
223
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera) in defined type 'foo::fixme', use lookup instead").on_line(6).in_column(8)
|
224
|
+
end
|
225
|
+
it 'should create errors for hiera_hash function' do
|
226
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera_hash) in defined type 'foo::fixme', use lookup instead").on_line(7).in_column(8)
|
227
|
+
end
|
228
|
+
it 'should create errors for hiera_array function' do
|
229
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera_array) in defined type 'foo::fixme', use lookup instead").on_line(8).in_column(8)
|
230
|
+
end
|
187
231
|
end
|
188
232
|
|
189
233
|
context 'node with no errors' do
|
@@ -194,15 +238,43 @@ describe 'wmf_styleguide' do
|
|
194
238
|
end
|
195
239
|
context 'node with violations' do
|
196
240
|
let(:code) { node_ko }
|
197
|
-
it 'should not have multiple roles applied' do
|
198
|
-
expect(problems).to contain_error("wmf-style: node 'fixme' includes multiple roles").on_line(2)
|
199
|
-
end
|
200
241
|
it 'should not include classes directly' do
|
201
242
|
expect(problems).to contain_error("wmf-style: node 'fixme' includes class base::firewall")
|
202
243
|
end
|
203
244
|
it 'should not declare any defined type' do
|
204
245
|
expect(problems).to contain_error("wmf-style: node 'fixme' declares interface::mapped")
|
205
246
|
end
|
247
|
+
it 'should not call lookup' do
|
248
|
+
expect(problems).to contain_error("wmf-style: node 'fixme' calls lookup function")
|
249
|
+
end
|
250
|
+
it 'should not call hiera' do
|
251
|
+
expect(problems).to contain_error("wmf-style: node 'fixme' calls legacy hiera function")
|
252
|
+
end
|
253
|
+
it 'should not call hiera_array' do
|
254
|
+
expect(problems).to contain_error("wmf-style: node 'fixme' calls legacy hiera_array function")
|
255
|
+
end
|
256
|
+
it 'should not call hiera_hash' do
|
257
|
+
expect(problems).to contain_error("wmf-style: node 'fixme' calls legacy hiera_hash function")
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
context 'node regex with start violation' do
|
262
|
+
let(:code) { node_regex_missing_start }
|
263
|
+
it 'should start the regex with ^' do
|
264
|
+
expect(problems).to contain_error('wmf-style: regex node matching must match the whole string (^...$), got: test1.*\\.example\\.com$')
|
265
|
+
end
|
266
|
+
end
|
267
|
+
context 'node regex with end violation' do
|
268
|
+
let(:code) { node_regex_missing_end }
|
269
|
+
it 'should end the regex with $' do
|
270
|
+
expect(problems).to contain_error('wmf-style: regex node matching must match the whole string (^...$), got: ^test1.*\\.example\\.com')
|
271
|
+
end
|
272
|
+
end
|
273
|
+
context 'node regex with start and end violations' do
|
274
|
+
let(:code) { node_regex_missing_both }
|
275
|
+
it 'should start the regex with ^ and end it with $' do
|
276
|
+
expect(problems).to contain_error('wmf-style: regex node matching must match the whole string (^...$), got: test1.*\\.example\\.com')
|
277
|
+
end
|
206
278
|
end
|
207
279
|
|
208
280
|
context 'defined type with deprecations' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-lint-wmf_styleguide-check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Giuseppe Lavagetto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet-lint
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.49.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.17.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.17.1
|
111
125
|
description: |2
|
112
126
|
A puppet-lint plugin to check that the code adheres to the WMF coding guidelines:
|
113
127
|
|
@@ -149,10 +163,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
163
|
- !ruby/object:Gem::Version
|
150
164
|
version: '0'
|
151
165
|
requirements: []
|
152
|
-
rubygems_version: 3.
|
166
|
+
rubygems_version: 3.2.5
|
153
167
|
signing_key:
|
154
168
|
specification_version: 4
|
155
169
|
summary: A puppet-lint plugin to check code adheres to the WMF coding guidelines
|
156
170
|
test_files:
|
157
|
-
- spec/spec_helper.rb
|
158
171
|
- spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb
|
172
|
+
- spec/spec_helper.rb
|