cookstyle 5.0.4 → 5.1.19
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.
- checksums.yaml +4 -4
- data/Gemfile +9 -0
- data/bin/cookstyle +7 -0
- data/config/cookstyle.yml +195 -7
- data/config/upstream.yml +1 -1
- data/lib/cookstyle.rb +1 -0
- data/lib/cookstyle/version.rb +1 -1
- data/lib/rubocop/chef/cookbook_only.rb +4 -3
- data/lib/rubocop/cop/chef/correctness/insecure_cookbook_url.rb +60 -0
- data/lib/rubocop/cop/chef/correctness/name_property_and_required.rb +94 -0
- data/lib/rubocop/cop/chef/correctness/node_normal.rb +53 -0
- data/lib/rubocop/cop/chef/correctness/node_normal_unless.rb +53 -0
- data/lib/rubocop/cop/chef/correctness/property_with_default_and_required.rb +67 -0
- data/lib/rubocop/cop/chef/correctness/property_with_name_attribute.rb +59 -0
- data/lib/rubocop/cop/chef/{service_resource.rb → correctness/service_resource.rb} +1 -1
- data/lib/rubocop/cop/chef/{tmp_path.rb → correctness/tmp_path.rb} +1 -1
- data/lib/rubocop/cop/chef/deprecation/attribute_metadata.rb +49 -0
- data/lib/rubocop/cop/chef/deprecation/conflicts_metadata.rb +44 -0
- data/lib/rubocop/cop/chef/deprecation/depends_compat_resource.rb +48 -0
- data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +42 -0
- data/lib/rubocop/cop/chef/deprecation/depends_poise.rb +42 -0
- data/lib/rubocop/cop/chef/deprecation/easy_install.rb +39 -0
- data/lib/rubocop/cop/chef/deprecation/epic_fail.rb +50 -0
- data/lib/rubocop/cop/chef/deprecation/erl_call.rb +39 -0
- data/lib/rubocop/cop/chef/{node_set.rb → deprecation/node_set.rb} +2 -2
- data/lib/rubocop/cop/chef/deprecation/node_set_unless.rb +53 -0
- data/lib/rubocop/cop/chef/deprecation/provides_metadata.rb +44 -0
- data/lib/rubocop/cop/chef/deprecation/replaces_metadata.rb +44 -0
- data/lib/rubocop/cop/chef/deprecation/suggests_metadata.rb +44 -0
- data/lib/rubocop/cop/chef/effortless/data_bags.rb +36 -0
- data/lib/rubocop/cop/chef/effortless/search_used.rb +36 -0
- data/lib/rubocop/cop/chef/modernize/berksfile_source.rb +59 -0
- data/lib/rubocop/cop/chef/modernize/build_essential.rb +52 -0
- data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +54 -0
- data/lib/rubocop/cop/chef/modernize/why_run_supported_true.rb +46 -0
- data/lib/rubocop/cop/chef/{attribute_keys.rb → style/attribute_keys.rb} +2 -2
- data/lib/rubocop/cop/chef/style/comment_sentence_spacing.rb +42 -0
- data/lib/rubocop/cop/chef/{comments_copyright_format.rb → style/comments_copyright_format.rb} +5 -2
- data/lib/rubocop/cop/chef/{comments_format.rb → style/comments_format.rb} +4 -2
- data/lib/rubocop/cop/chef/{file_mode.rb → style/file_mode.rb} +1 -3
- metadata +34 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bebad52b67940ef2ea18a69715758710d78e83d08e6fd3629647c44df467d79
|
4
|
+
data.tar.gz: 48af992c7bf5f18d5b3a948912ff57386439bbc57029ec3a6b962d5192b168f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31950bedb48fc769d8359183b7a7f8a95bb109cd446ed55748bcb90c97688735b4dc063d12660a3573e8a299eb145ca3f912100a2f0086038eaedf714194dce5
|
7
|
+
data.tar.gz: 721544b1d118f01f29be8d025e927df03fd588e5379f58e7c4748cbc4b3325c225b90a32d44f15c914794bb2faf0fd93c8c214c721d3341e02689fa92b1a3187
|
data/Gemfile
CHANGED
@@ -15,6 +15,15 @@ group :docs do
|
|
15
15
|
gem 'yard'
|
16
16
|
end
|
17
17
|
|
18
|
+
group :development do
|
19
|
+
gem 'adamantium'
|
20
|
+
gem 'anima'
|
21
|
+
gem 'concord'
|
22
|
+
gem 'rake'
|
23
|
+
gem 'rspec', '>= 3.4'
|
24
|
+
gem 'simplecov'
|
25
|
+
end
|
26
|
+
|
18
27
|
instance_eval(ENV['GEMFILE_MOD']) if ENV['GEMFILE_MOD']
|
19
28
|
|
20
29
|
# If you want to load debugging tools into the bundle exec sandbox,
|
data/bin/cookstyle
CHANGED
@@ -5,6 +5,13 @@ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), %w(.. lib))
|
|
5
5
|
|
6
6
|
require 'cookstyle'
|
7
7
|
|
8
|
+
# force the fail level to :convention so that we can set all our new rules to
|
9
|
+
# the lowest level of :refactor without failing everyone's CI jobs
|
10
|
+
unless ARGV.include?('--fail-level')
|
11
|
+
ARGV << '--fail-level'
|
12
|
+
ARGV << 'C'
|
13
|
+
end
|
14
|
+
|
8
15
|
if ARGV.size == 1 && %w(-v --version).include?(ARGV.first)
|
9
16
|
puts "Cookstyle #{Cookstyle::VERSION}"
|
10
17
|
print ' * RuboCop '
|
data/config/cookstyle.yml
CHANGED
@@ -25,37 +25,225 @@ AllCops:
|
|
25
25
|
Patterns:
|
26
26
|
- resources/.*\.rb
|
27
27
|
|
28
|
+
###############################
|
29
|
+
# Making cookbooks look better
|
30
|
+
###############################
|
31
|
+
|
28
32
|
Chef/AttributeKeys:
|
29
33
|
Description: Check which style of keys are used to access node attributes.
|
30
34
|
Enabled: true
|
31
35
|
EnforcedStyle: strings
|
36
|
+
VersionAdded: '5.0.0'
|
32
37
|
SupportedStyles:
|
33
38
|
- strings
|
34
39
|
- symbols
|
35
40
|
|
41
|
+
Chef/CopyrightCommentFormat:
|
42
|
+
Description: Properly format copyright dates in comment blocks and ensure dates are up to date
|
43
|
+
Enabled: false
|
44
|
+
VersionAdded: '5.0.0'
|
45
|
+
|
46
|
+
Chef/CommentSentenceSpacing:
|
47
|
+
Description: Use a single space after sentences in comments
|
48
|
+
Enabled: false
|
49
|
+
VersionAdded: '5.1.0'
|
50
|
+
|
51
|
+
Chef/CommentFormat:
|
52
|
+
Description: Use Chef's unique format for comment headers
|
53
|
+
Enabled: true
|
54
|
+
VersionAdded: '5.0.0'
|
55
|
+
|
56
|
+
###############################
|
57
|
+
# Avoiding potential problems
|
58
|
+
###############################
|
59
|
+
|
36
60
|
Chef/FileMode:
|
37
61
|
Description: Use strings to represent file modes in Chef resources
|
38
62
|
Enabled: true
|
63
|
+
VersionAdded: '5.0.0'
|
39
64
|
|
40
65
|
Chef/ServiceResource:
|
41
66
|
Description: Use a service resource to start and stop services instead of execute resources
|
42
67
|
Enabled: true
|
68
|
+
VersionAdded: '5.0.0'
|
43
69
|
|
44
|
-
Chef/
|
45
|
-
Description:
|
46
|
-
Enabled:
|
70
|
+
Chef/NodeNormal:
|
71
|
+
Description: Do not use the node.normal method
|
72
|
+
Enabled: true
|
73
|
+
VersionAdded: '5.1.0'
|
47
74
|
|
48
|
-
Chef/
|
49
|
-
Description:
|
75
|
+
Chef/NodeNormalUnless:
|
76
|
+
Description: Do not use the node.normal_unless method
|
50
77
|
Enabled: true
|
78
|
+
VersionAdded: '5.1.0'
|
79
|
+
|
80
|
+
Chef/TmpPath:
|
81
|
+
Description: Use file_cache_path rather than hard-coding tmp paths
|
82
|
+
Enabled: true
|
83
|
+
VersionAdded: '5.0.0'
|
84
|
+
|
85
|
+
Chef/InsecureCookbookURL:
|
86
|
+
Description: Insecure http Github or Gitlab URLs for metadata source_url/issues_url fields
|
87
|
+
Enabled: true
|
88
|
+
VersionAdded: '5.1.0'
|
89
|
+
Include:
|
90
|
+
- '**/metadata.rb'
|
91
|
+
|
92
|
+
Chef/NamePropertyIsRequired:
|
93
|
+
Description: Resource properties marked as name properties should not also be required properties
|
94
|
+
Enabled: true
|
95
|
+
VersionAdded: '5.1.0'
|
96
|
+
|
97
|
+
###############################
|
98
|
+
# Resolving Deprecations
|
99
|
+
###############################
|
51
100
|
|
52
101
|
Chef/NodeSet:
|
53
102
|
Description: Do not use the deprecated node.set method
|
54
103
|
Enabled: true
|
104
|
+
VersionAdded: '5.0.0'
|
55
105
|
|
56
|
-
Chef/
|
57
|
-
Description:
|
106
|
+
Chef/NodeSetUnless:
|
107
|
+
Description: Do not use the deprecated node.set_unless method
|
108
|
+
Enabled: true
|
109
|
+
VersionAdded: '5.1.0'
|
110
|
+
|
111
|
+
Chef/EpicFail:
|
112
|
+
Description: Use ignore_failure method instead of the deprecated epic_fail method
|
113
|
+
Enabled: true
|
114
|
+
VersionAdded: '5.1.0'
|
115
|
+
|
116
|
+
Chef/CookbookDependsOnPoise:
|
117
|
+
Description: Cookbooks should not depend on the deprecated Poise framework
|
118
|
+
Enabled: true
|
119
|
+
VersionAdded: '5.1.0'
|
120
|
+
Include:
|
121
|
+
- '**/metadata.rb'
|
122
|
+
|
123
|
+
Chef/ConflictsMetadata:
|
124
|
+
Description: Don't use the deprecated 'conflicts' metadata value
|
58
125
|
Enabled: true
|
126
|
+
VersionAdded: '5.1.0'
|
127
|
+
Include:
|
128
|
+
- '**/metadata.rb'
|
129
|
+
|
130
|
+
Chef/SuggestsMetadata:
|
131
|
+
Description: Don't use the deprecated 'suggests' metadata value
|
132
|
+
Enabled: true
|
133
|
+
VersionAdded: '5.1.0'
|
134
|
+
Include:
|
135
|
+
- '**/metadata.rb'
|
136
|
+
|
137
|
+
Chef/ProvidesMetadata:
|
138
|
+
Description: Don't use the deprecated 'provides' metadata value
|
139
|
+
Enabled: true
|
140
|
+
VersionAdded: '5.1.0'
|
141
|
+
Include:
|
142
|
+
- '**/metadata.rb'
|
143
|
+
|
144
|
+
Chef/ReplacesMetadata:
|
145
|
+
Description: Don't use the deprecated 'replaces' metadata value
|
146
|
+
Enabled: true
|
147
|
+
VersionAdded: '5.1.0'
|
148
|
+
Include:
|
149
|
+
- '**/metadata.rb'
|
150
|
+
|
151
|
+
Chef/AttributeMetadata:
|
152
|
+
Description: Don't use the deprecated 'attribute' metadata value
|
153
|
+
Enabled: true
|
154
|
+
VersionAdded: '5.1.0'
|
155
|
+
Include:
|
156
|
+
- '**/metadata.rb'
|
157
|
+
|
158
|
+
Chef/CookbookDependsOnCompatResource:
|
159
|
+
Description: Don't depend on the deprecated compat_resource cookbook made obsolete by Chef 12.19+
|
160
|
+
Enabled: true
|
161
|
+
VersionAdded: '5.1.0'
|
162
|
+
Include:
|
163
|
+
- '**/metadata.rb'
|
164
|
+
|
165
|
+
Chef/CookbookDependsOnPartialSearch:
|
166
|
+
Description: Don't depend on the deprecated partial_search cookbook made obsolete by Chef 13+
|
167
|
+
Enabled: true
|
168
|
+
VersionAdded: '5.1.0'
|
169
|
+
Include:
|
170
|
+
- '**/metadata.rb'
|
171
|
+
|
172
|
+
Chef/EasyInstallResource:
|
173
|
+
Description: Don't use the deprecated easy_install resource resource removed in Chef 13
|
174
|
+
Enabled: true
|
175
|
+
VersionAdded: '5.1.0'
|
176
|
+
|
177
|
+
Chef/ErlCallResource:
|
178
|
+
Description: Don't use the deprecated erl_call resource removed in Chef 13
|
179
|
+
Enabled: true
|
180
|
+
VersionAdded: '5.1.0'
|
181
|
+
|
182
|
+
###############################
|
183
|
+
# Cleaning up Legacy Code
|
184
|
+
###############################
|
185
|
+
|
186
|
+
Chef/LegacyBerksfileSource:
|
187
|
+
Description: Do not use legacy Berksfile community sources. Use Chef Supermarket instead.
|
188
|
+
Enabled: true
|
189
|
+
VersionAdded: '5.1.0'
|
190
|
+
Include:
|
191
|
+
- '**/Berksfile'
|
192
|
+
|
193
|
+
Chef/WhyRunSupportedTrue:
|
194
|
+
Description: why_run_supported? no longer needs to be set to true as it is the default in Chef 13+
|
195
|
+
Enabled: true
|
196
|
+
VersionAdded: '5.1.0'
|
197
|
+
Include:
|
198
|
+
- '**/resources/.*\.rb'
|
199
|
+
- '**/providers/.*\.rb'
|
200
|
+
- '**/libraries/.*\.rb'
|
201
|
+
|
202
|
+
PropertyWithNameAttribute:
|
203
|
+
Description: Resource property sets name_attribute not name_property
|
204
|
+
Enabled: true
|
205
|
+
VersionAdded: '5.1.0'
|
206
|
+
Include:
|
207
|
+
- '**/resources/.*\.rb'
|
208
|
+
- '**/libraries/.*\.rb'
|
209
|
+
|
210
|
+
PropertyWithRequiredAndDefault:
|
211
|
+
Description: Resource property should not be both required and have a default value
|
212
|
+
Enabled: true
|
213
|
+
VersionAdded: '5.1.0'
|
214
|
+
Include:
|
215
|
+
- '**/resources/.*\.rb'
|
216
|
+
- '**/libraries/.*\.rb'
|
217
|
+
|
218
|
+
Chef/UnnecessaryDependsChef14:
|
219
|
+
Description: Don't depend on cookbooks made obsolete by Chef 14
|
220
|
+
Enabled: true
|
221
|
+
VersionAdded: '5.1.0'
|
222
|
+
Include:
|
223
|
+
- '**/metadata.rb'
|
224
|
+
|
225
|
+
###############################
|
226
|
+
# Utilize new built-in resources
|
227
|
+
###############################
|
228
|
+
|
229
|
+
Chef/UseBuildEssentialResource:
|
230
|
+
Description: Use the build_essential resource instead of the legacy build-essential recipe
|
231
|
+
Enabled: false
|
232
|
+
VersionAdded: '5.1.0'
|
233
|
+
|
234
|
+
###############################
|
235
|
+
# Migrating to new patterns
|
236
|
+
###############################
|
237
|
+
|
238
|
+
Chef/CookbookUsesSearch:
|
239
|
+
Description: Cookbook uses search, which cannot be used in the Effortless Infra pattern
|
240
|
+
Enabled: false
|
241
|
+
VersionAdded: '5.1.0'
|
242
|
+
|
243
|
+
Chef/CookbookUsesDatabags:
|
244
|
+
Description: Cookbook uses data bags, which cannot be used in the Effortless Infra pattern
|
245
|
+
Enabled: false
|
246
|
+
VersionAdded: '5.1.0'
|
59
247
|
|
60
248
|
#### The base rubocop 0.37 enabled.yml file we started with ####
|
61
249
|
|
data/config/upstream.yml
CHANGED
@@ -2344,7 +2344,7 @@ Style/ClassAndModuleChildren:
|
|
2344
2344
|
StyleGuide: '#namespace-definition'
|
2345
2345
|
# Moving from compact to nested children requires knowledge of whether the
|
2346
2346
|
# outer parent is a module or a class. Moving from nested to compact requires
|
2347
|
-
# verification that the outer parent is defined elsewhere.
|
2347
|
+
# verification that the outer parent is defined elsewhere. RuboCop does not
|
2348
2348
|
# have the knowledge to perform either operation safely and thus requires
|
2349
2349
|
# manual oversight.
|
2350
2350
|
SafeAutoCorrect: false
|
data/lib/cookstyle.rb
CHANGED
data/lib/cookstyle/version.rb
CHANGED
@@ -4,15 +4,15 @@ module RuboCop
|
|
4
4
|
module Chef
|
5
5
|
# Mixin for cops that skips non-cookbook files
|
6
6
|
#
|
7
|
-
# The criteria for whether
|
8
|
-
# is configured via `AllCops/
|
7
|
+
# The criteria for whether cookstyle analyzes a certain ruby file
|
8
|
+
# is configured via `AllCops/Chef`. For example, if you want to
|
9
9
|
# customize your project to scan all files within a `test/` directory
|
10
10
|
# then you could add this to your configuration:
|
11
11
|
#
|
12
12
|
# @example configuring analyzed paths
|
13
13
|
#
|
14
14
|
# AllCops:
|
15
|
-
#
|
15
|
+
# Chef:
|
16
16
|
# Patterns:
|
17
17
|
# - '_spec.rb$'
|
18
18
|
# - '(?:^|/)spec/'
|
@@ -31,6 +31,7 @@ module RuboCop
|
|
31
31
|
patterns = []
|
32
32
|
COOKBOOK_SEGMENTS.each do |segment|
|
33
33
|
next unless self.class.cookbook_only_segments[segment.to_sym]
|
34
|
+
|
34
35
|
cookbook_pattern_config(segment).each do |pattern|
|
35
36
|
patterns << Regexp.new(pattern)
|
36
37
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
# Use secure Github and Gitlab URLs for source_url and issues_url
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
#
|
24
|
+
# # bad
|
25
|
+
# source_url 'http://github.com/something/something'
|
26
|
+
# source_url 'http://www.github.com/something/something'
|
27
|
+
# source_url 'http://www.gitlab.com/something/something'
|
28
|
+
# source_url 'http://gitlab.com/something/something'
|
29
|
+
#
|
30
|
+
# # good
|
31
|
+
# source_url 'http://github.com/something/something'
|
32
|
+
# source_url 'http://gitlab.com/something/something'
|
33
|
+
#
|
34
|
+
class InsecureCookbookURL < Cop
|
35
|
+
MSG = 'Insecure http Github or Gitlab URLs for metadata source_url/issues_url fields'.freeze
|
36
|
+
|
37
|
+
def_node_matcher :insecure_cb_url?, <<-PATTERN
|
38
|
+
(send nil? {:source_url :issues_url} (str #insecure_url?))
|
39
|
+
PATTERN
|
40
|
+
|
41
|
+
def insecure_url?(url)
|
42
|
+
# https://rubular.com/r/dS6L6bQZvwWxWq
|
43
|
+
url.match?(%r{http://(www.)*git(hub|lab)})
|
44
|
+
end
|
45
|
+
|
46
|
+
def on_send(node)
|
47
|
+
insecure_cb_url?(node) do
|
48
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def autocorrect(node)
|
53
|
+
lambda do |corrector|
|
54
|
+
corrector.replace(node.loc.expression, node.source.gsub(%r{http://(www.)*}, 'https://'))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
# When using properties in a custom resource you shouldn't set a property to
|
21
|
+
# be both required and a name_property. Name properties are a way to optionally
|
22
|
+
# override the name given to the resource block in cookbook code. In your resource
|
23
|
+
# code you use the name_property and if the user doesn't pass in anything to that
|
24
|
+
# property its value will be populated with resource block's name. This
|
25
|
+
# allows users to provide more friendly resource names for logging that give
|
26
|
+
# additional context on the change being made.
|
27
|
+
#
|
28
|
+
# How about a nice example! Here we have a resource called ntp_config that has a
|
29
|
+
# name_property of config_file. All throughout the code of this resource we'd
|
30
|
+
# use new_resource.config_file when referencing the path to the config.
|
31
|
+
#
|
32
|
+
# We can use a friendly name for the block and specific a value to config_file
|
33
|
+
# ntp_config 'Configure the main config file' do
|
34
|
+
# config_file '/etc/ntp/ntp.conf'
|
35
|
+
# action :create
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# We can also just set the config path as the resource block and Chef will
|
39
|
+
# make sure to pass this in as new_resource.config_file as well.
|
40
|
+
# ntp_config '/etc/ntp/ntp.conf' do
|
41
|
+
# action :create
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# The core tenant of the name property feature is that these properties are optional
|
45
|
+
# and making them required effectively turns off the functionality provided by name
|
46
|
+
# properties. If the goal is to always require the user to pass the config_file property
|
47
|
+
# then it should just be made a required property and not a name_property.
|
48
|
+
#
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
#
|
52
|
+
#
|
53
|
+
# # bad
|
54
|
+
# property :config_file, String, required: true, name_property: true
|
55
|
+
#
|
56
|
+
#
|
57
|
+
# # good
|
58
|
+
# property :config_file, String, required: true
|
59
|
+
class NamePropertyIsRequired < Cop
|
60
|
+
MSG = 'Resource properties marked as name properties should not also be required properties'.freeze
|
61
|
+
|
62
|
+
def on_send(node)
|
63
|
+
if required_property?(node) && property_is_name_property?(node)
|
64
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def property_is_name_property?(node)
|
71
|
+
if node.method_name == :property
|
72
|
+
node.arguments.each do |arg|
|
73
|
+
if arg.type == :hash
|
74
|
+
return true if arg.source.match?(/name_property:\s*true/)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
false # no required: true found
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def required_property?(node)
|
82
|
+
if node.method_name == :property
|
83
|
+
node.arguments.each do |arg|
|
84
|
+
if arg.type == :hash
|
85
|
+
return true if arg.source.match?(/required:\s*true/)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
false # no default: found
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|