rubocop-rubomatic-rails 1.0.0.pre.rc.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 81d4d4ca3524d84f641ed222926213621eb8156278b11774d452bae4a0e0ce00
4
+ data.tar.gz: d262405ee2f10aa76415f8b0e389b92f567654b179259712a10233c43b3df98d
5
+ SHA512:
6
+ metadata.gz: bd49d1eac544dafff939d3fbe2e7fba64d04c7669feb79cb449578c904a73136a73703a44d0b34ee553ba73a4019da807bf32c2b7d32f4258b3170e907733b82
7
+ data.tar.gz: a4d7ce4985153279b5543a97cf675005b745ccf3e3c170172a1c0640604d3dcea97792dfbea89706663c0205399f5c4d9d8a570f80d66888e591cf2c3d8778f6
data/CHANGELOG.adoc ADDED
@@ -0,0 +1,9 @@
1
+ == 1.0.0
2
+
3
+ * Initial renaming migration
4
+ ** Replaced rubomatic-rails
5
+
6
+ === Dependencies
7
+
8
+ * `rubocop-rubomatic@1.0.0`
9
+ * `rubocop-rails@2.18.0`
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2023 Brands Insurance Agency, Inc.
2
+
3
+ Copyright for portions of project Rubocop are held by Bozhidar Batsov and other contributors, as part of project Rubocop.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.adoc ADDED
@@ -0,0 +1,86 @@
1
+ = Rubomatic
2
+
3
+ Gem for shared rails rubocop config and custom rails cops for BrandsInsurance
4
+
5
+ Put your Ruby code in the file ``lib/rubocop/rubomatic-rails``.
6
+ To experiment with that code, run
7
+ ``bin/console`` for an interactive prompt.
8
+
9
+ == Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ [source,ruby]
14
+ ----
15
+ gem 'rubocop-rubomatic-rails', require: false
16
+ ----
17
+
18
+ And then execute:
19
+
20
+ $ bundle install
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install rubocop-rubomatic-rails
25
+
26
+ == Usage
27
+
28
+ Add the following to your ``.rubocop.yml`` config file
29
+
30
+ [source,yaml]
31
+ ----
32
+ inherit_gem:
33
+ rubocop-rubomatic-rails: config/rubocop.yml
34
+ ----
35
+
36
+ If you need to override a setting:
37
+
38
+ [source,yaml]
39
+ ----
40
+ # Add to Naming/VariableNumber.AllowedIdentifiers
41
+ inherit_gem:
42
+ rubocop-rubomatic-rails: config/rubocop.yml
43
+
44
+ Naming/VariableNumber:
45
+ inherit_mode:
46
+ merge:
47
+ - AllowedIdentifiers
48
+ AllowedIdentifiers:
49
+ - street_2
50
+ ----
51
+
52
+ [source,yaml]
53
+ ----
54
+ # Completely override Naming/VariableNumber.AllowedIdentifiers
55
+ inherit_gem:
56
+ rubocop-rubomatic-rails: config/rubocop.yml
57
+
58
+ Naming/VariableNumber:
59
+ inherit_mode:
60
+ override:
61
+ - AllowedIdentifiers
62
+ AllowedIdentifiers:
63
+ - street_2
64
+ ----
65
+
66
+ == Custom Cops
67
+
68
+ Add ``RubomaticRails/*`` cops to your ``.rubocop.yml`` config file
69
+
70
+ [source,yaml]
71
+ ----
72
+ RubomaticRails/Style/DisallowedMethods:
73
+ Enabled: true
74
+ ----
75
+
76
+ == Departments
77
+
78
+ None yet
79
+
80
+ == Contributing
81
+
82
+ See xref:./CONTRIBUTING.adoc[CONTRIBUTING] for how to add your own rule
83
+
84
+ == Changelog
85
+
86
+ See xref:./CHANGELOG.adoc[CHANGELOG] see see changes
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RubomaticRails
6
+ class Generator
7
+ class CopReadmeInjector < DeptReadmeInjector
8
+ TEMPLATE =
9
+ '* xref:./%{cop_folder}/README.adoc[``%{department}/%{cop}``]'
10
+
11
+ # :nodoc:
12
+ def initialize(badge:, **kwargs)
13
+ super(badge: badge, **kwargs)
14
+
15
+ @cop = badge.cop_name
16
+ end
17
+
18
+ private
19
+
20
+ # @return [String]
21
+ attr_reader :cop
22
+
23
+ # @see super
24
+ def new_readme_entry
25
+ format(TEMPLATE, {
26
+ department_folder: snake_case(department),
27
+ cop_folder: snake_case(cop),
28
+ department: department,
29
+ cop: cop
30
+ })
31
+ end
32
+
33
+ # @see super
34
+ def line_is_good?(line)
35
+ return true if super
36
+
37
+ matches = line.match(target_regex)
38
+ return false if matches.nil?
39
+
40
+ department == matches[:department] && cop < matches[:cop]
41
+ end
42
+
43
+ # @see super
44
+ def target_regex
45
+ %r{\* xref:\./docs/cops/[a-z_]+/[a-z_]+/README\.adoc\[``(?<department>[a-zA-Z_]+)/(?<cop>[a-zA-Z_]+)``\]}
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RubomaticRails
6
+ class Generator
7
+ class DeptReadmeInjector
8
+ TEMPLATE = '* xref:./docs/cops/%{department_folder}/README.adoc[``%{department}``]'
9
+
10
+ # :nodoc:
11
+ def initialize(readme_file_path:, badge:, department:)
12
+ @readme_file_path = readme_file_path
13
+ @badge = badge
14
+ @department = department
15
+ @output = output
16
+ end
17
+
18
+ # Performs the actual string injection into the file
19
+ # modified version of `inject` from RuboCop::Cop::Generator::ConfigurationInjector
20
+ # Named `inject_string` becuase rubocop thought when called it was `Array#inject`
21
+ #
22
+ # @return [void]
23
+ #
24
+ def inject_string
25
+ target_line = find_target_line
26
+
27
+ if target_line
28
+ readme_entries.insert(target_line, "#{new_readme_entry}\n")
29
+ else
30
+ readme_entries.push(new_readme_entry)
31
+ end
32
+
33
+ File.write(readme_file_path, readme_entries.join(''))
34
+
35
+ yield if block_given?
36
+ end
37
+
38
+ private
39
+
40
+ # @return [String]
41
+ attr_reader :readme_file_path
42
+ # @return [RuboCop::Cop::Badge]
43
+ attr_reader :badge
44
+ # @return [String]
45
+ attr_reader :department
46
+ # @return [*] Default $stdout
47
+ attr_reader :output
48
+
49
+ # Lines in <department>/README.adoc
50
+ #
51
+ # @return [Array<String>]
52
+ #
53
+ def readme_entries
54
+ @readme_entries ||= File.readlines(readme_file_path)
55
+ end
56
+
57
+ # Modified version from Rubocop::Cop::Generator::ConfigurationInjector
58
+ #
59
+ # @return [String]
60
+ #
61
+ def new_readme_entry
62
+ format(TEMPLATE, {
63
+ department_folder: snake_case(department),
64
+ department: department
65
+ })
66
+ end
67
+
68
+ # Modified version from Rubocop::Cop::Generator::ConfigurationInjector
69
+ #
70
+ # @return [Integer, Nil]
71
+ #
72
+ def find_target_line
73
+ readme_entries.find.with_index do |line, index|
74
+ return index if line_is_good?(line)
75
+ end
76
+
77
+ return nil
78
+ end
79
+
80
+ # Determines if the given line is the same type we're trying to add and if it's alphabetically before
81
+ #
82
+ # @return [Boolean]
83
+ #
84
+ def line_is_good?(line)
85
+ matches = line.match(target_regex)
86
+ return false if matches.nil?
87
+
88
+ department < line.match(target_regex)[:department]
89
+ end
90
+
91
+ # Regex to look for in the readme
92
+ #
93
+ # @return [Regexp]
94
+ #
95
+ def target_regex
96
+ %r{\* xref:\./docs/cops/[a-z_]+/README\.adoc\[``(?<department>[a-zA-Z_]+)``\]}
97
+ end
98
+
99
+ # Copied from Rubocop::Cop::Generator
100
+ #
101
+ # @return [String]
102
+ #
103
+ def snake_case(camel_case_string)
104
+ camel_case_string
105
+ .gsub('RSpec', 'Rspec')
106
+ .gsub(%r{([^A-Z/])([A-Z]+)}, '\1_\2')
107
+ .gsub(%r{([A-Z])([A-Z][^A-Z\d/]+)}, '\1_\2')
108
+ .downcase
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,283 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './generator/dept_readme_injector'
4
+
5
+ require_relative './generator/cop_readme_injector'
6
+
7
+ module RuboCop
8
+ module Cop
9
+ module RubomaticRails
10
+ class Generator
11
+ COP_DOC = <<~RUBY
12
+ # TODO: Write cop description and example of bad / good code. For every
13
+ # `SupportedStyle` and unique configuration, there needs to be examples.
14
+ # Examples must have valid Ruby syntax. Do not use upticks.
15
+ #
16
+ # @safety
17
+ # Delete this section if the cop is not unsafe (`Safe: false` or
18
+ # `SafeAutoCorrect: false`), or use it to explain how the cop is
19
+ # unsafe.
20
+ #
21
+ # @example EnforcedStyle: bar (default)
22
+ # # Description of the `bar` style.
23
+ #
24
+ # # bad
25
+ # bad_bar_method
26
+ #
27
+ # # bad
28
+ # bad_bar_method(args)
29
+ #
30
+ # # good
31
+ # good_bar_method
32
+ #
33
+ # # good
34
+ # good_bar_method(args)
35
+ #
36
+ # @example EnforcedStyle: foo
37
+ # # Description of the `foo` style.
38
+ #
39
+ # # bad
40
+ # bad_foo_method
41
+ #
42
+ # # bad
43
+ # bad_foo_method(args)
44
+ #
45
+ # # good
46
+ # good_foo_method
47
+ #
48
+ # # good
49
+ # good_foo_method(args)
50
+ #
51
+ RUBY
52
+ SOURCE_TEMPLATE = <<~RUBY
53
+ # frozen_string_literal: true
54
+
55
+ module RuboCop
56
+ module Cop
57
+ module %{department}
58
+ class %{cop_name} < Base
59
+ # TODO: Implement the cop in here.
60
+ #
61
+ # In many cases, you can use a node matcher for matching node pattern.
62
+ # See https://github.com/rubocop/rubocop-ast/blob/master/lib/rubocop/ast/node_pattern.rb
63
+ #
64
+ # For example
65
+ MSG = 'Use `#good_method` instead of `#bad_method`.'
66
+
67
+ # TODO: Don't call `on_send` unless the method name is in this list
68
+ # If you don't need `on_send` in the cop you created, remove it.
69
+ RESTRICT_ON_SEND = %%i[bad_method].freeze
70
+
71
+ # @!method bad_method?(node)
72
+ def_node_matcher :bad_method?, <<~PATTERN
73
+ (send nil? :bad_method ...)
74
+ PATTERN
75
+
76
+ def on_send(node)
77
+ return unless bad_method?(node)
78
+
79
+ add_offense(node)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ RUBY
86
+ README_ADDED_MESSAGE = '[modify] A link for the %{dept_vs_cop} has been added into %{readme_file_path}.'
87
+
88
+ DEPT_README_TEMPLATE = <<~ADOC
89
+ = %{department}
90
+
91
+ Describe the department here
92
+
93
+ == Cops
94
+
95
+ ADOC
96
+ COP_README_TEMPLATE = <<~ADOC
97
+ = ``%{department}/%{cop_name}``
98
+
99
+ == Description
100
+
101
+ Add a description here
102
+
103
+ == Examples
104
+
105
+ [source,ruby]
106
+ ----
107
+ # Bad
108
+ # Add a bad example here
109
+
110
+ # Good
111
+ # Add a good example here
112
+ ----
113
+
114
+ == Configurable Attributes
115
+
116
+ |===
117
+ |Name |Default value |Configurable values
118
+
119
+ |Max
120
+ |120
121
+ |Integer
122
+
123
+ |===
124
+
125
+ == References
126
+
127
+ https://github.com/BrandsInsurance/expert-chainsaw/issues
128
+ ADOC
129
+
130
+ # :nodoc:
131
+ def initialize(name, output: $stdout)
132
+ name = ['RubomaticRails', name].join('/') unless name.start_with?('RubomaticRails/')
133
+
134
+ unless name.count('/') == 2
135
+ raise(
136
+ [
137
+ 'You must provide a single department under RubomaticRails i.e. RubomaticRails/Department/CopName',
138
+ 'or Department/CopName'
139
+ ].join(' ')
140
+ )
141
+ end
142
+
143
+ @base_gen = RuboCop::Cop::Generator.new(name, output: output)
144
+ end
145
+
146
+ # Calls methods in the base class
147
+ #
148
+ # @return [*]
149
+ #
150
+ def method_missing(...)
151
+ @base_gen.__send__(...)
152
+ end
153
+
154
+ # `self` responds to `method_name` if `@base_gen` does
155
+ #
156
+ def respond_to_missing?(method_name, include_private = false)
157
+ @base_gen.respond_to?(method_name, include_private)
158
+ end
159
+
160
+ # Creates the department readme if it doesn't exist
161
+ # Modified version of `wirte_source` from RuboCop::Cop::Generator
162
+ #
163
+ # @return [void]
164
+ #
165
+ def write_dept_readme
166
+ return if File.exist?(dept_docs_path)
167
+
168
+ write_unless_file_exists(dept_docs_path, generated_dept_docs)
169
+ end
170
+
171
+ # Creates the cop readme if it doesn't exist
172
+ # Modified version of `wirte_source` from RuboCop::Cop::Generator
173
+ #
174
+ # @return [void]
175
+ #
176
+ def write_cop_readme
177
+ write_unless_file_exists(docs_path, generated_cop_docs)
178
+ end
179
+
180
+ # Injects the, possibly new, department readme link into the base readme
181
+ # Modified version of `inject_config` from RuboCop::Cop::Generator
182
+ #
183
+ # @return [void]
184
+ #
185
+ def inject_dept_readme(readme_file_path: 'README.adoc')
186
+ # Add this dept to base readme if not already there
187
+ injector = DeptReadmeInjector.new(
188
+ readme_file_path: readme_file_path,
189
+ badge: badge,
190
+ department: department
191
+ )
192
+
193
+ injector.inject_string do
194
+ output.puts(format(README_ADDED_MESSAGE, readme_file_path: readme_file_path, dept_vs_cop: 'department'))
195
+ end
196
+ end
197
+
198
+ # Injects the new cop readme link into the department readme
199
+ # Modified version of `inject_config` from RuboCop::Cop::Generator
200
+ #
201
+ # @return [void]
202
+ #
203
+ def inject_cop_readme(readme_file_path: dept_docs_path)
204
+ # Add this cop to the dept readme
205
+ injector = CopReadmeInjector.new(
206
+ readme_file_path: readme_file_path,
207
+ badge: badge,
208
+ department: department
209
+ )
210
+
211
+ injector.inject_string do
212
+ output.puts(format(README_ADDED_MESSAGE, readme_file_path: readme_file_path, dept_vs_cop: 'cop'))
213
+ end
214
+ end
215
+
216
+ private
217
+
218
+ # The rubocop department without the RubomaticRails prefix
219
+ #
220
+ # @return [String]
221
+ #
222
+ def department
223
+ badge.department_name.gsub('RubomaticRails/', '')
224
+ end
225
+
226
+ # Modified version of `generated_source` from Rubocop::Cop::Generator
227
+ #
228
+ # @return [String]
229
+ #
230
+ def generated_dept_docs
231
+ generate_readme(DEPT_README_TEMPLATE)
232
+ end
233
+
234
+ # Modified version of `generated_source` from Rubocop::Cop::Generator
235
+ #
236
+ # @return [String]
237
+ #
238
+ def generated_cop_docs
239
+ generate_readme(COP_README_TEMPLATE)
240
+ end
241
+
242
+ # Modified version from Rubocop::Cop::Generator
243
+ #
244
+ # @return [String]
245
+ #
246
+ def generate_readme(template)
247
+ format(template, {
248
+ department: department,
249
+ cop_name: badge.cop_name,
250
+ cop_folder: snake_case(badge.cop_name.to_s)
251
+ })
252
+ end
253
+
254
+ # Path to <department>/README.adoc
255
+ #
256
+ # @return [String]
257
+ #
258
+ def dept_docs_path
259
+ File.join(
260
+ 'docs',
261
+ 'cops',
262
+ snake_case(department),
263
+ 'README.adoc'
264
+ )
265
+ end
266
+
267
+ # Path to <department>/<cop>/README.adoc
268
+ #
269
+ # @return [String]
270
+ #
271
+ def docs_path
272
+ File.join(
273
+ 'docs',
274
+ 'cops',
275
+ snake_case(department),
276
+ snake_case(badge.cop_name.to_s),
277
+ 'README.adoc'
278
+ )
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end
@@ -0,0 +1 @@
1
+ # frozen_string_literal: true
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module RubomaticRails
5
+ module Inject
6
+ # This was a generated method from https://github.com/rubocop/rubocop-extension-generator
7
+ #
8
+ def self.defaults!
9
+ path = CONFIG_DEFAULT.to_s
10
+ hash = ConfigLoader.__send__(:load_yaml_configuration, path)
11
+ config = Config.new(hash, path).tap(&:make_excludes_absolute)
12
+
13
+ puts("configuration from #{path}") if ConfigLoader.debug?
14
+
15
+ config = ConfigLoader.merge_with_default(config, path)
16
+
17
+ ConfigLoader.instance_variable_set(:@default_configuration, config)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module RubomaticRails
5
+ VERSION = '1.0.0-rc.1'
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'rubomatic-rails/version'
4
+ require 'yaml'
5
+
6
+ module RuboCop
7
+ module RubomaticRails
8
+ class Error < StandardError
9
+ end
10
+
11
+ PROJECT_ROOT = Pathname.new(__dir__).parent.parent.expand_path.freeze
12
+ CONFIG_DEFAULT = PROJECT_ROOT.join('config', 'default.yml').freeze
13
+ CONFIG = ::YAML.safe_load(CONFIG_DEFAULT.read).freeze
14
+
15
+ private_constant(:CONFIG_DEFAULT, :PROJECT_ROOT)
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubocop'
4
+
5
+ require_relative 'rubocop/cop/rubomatic-rails/generator'
6
+ require_relative 'rubocop/rubomatic-rails'
7
+ require_relative 'rubocop/rubomatic-rails/inject'
8
+ require_relative 'rubocop/rubomatic-rails/version'
9
+
10
+ RuboCop::RubomaticRails::Inject.defaults!
11
+
12
+ require_relative 'rubocop/cop/rubomatic_rails_cops'
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubocop-rubomatic-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre.rc.1
5
+ platform: ruby
6
+ authors:
7
+ - Brands Insurance
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-05-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rubocop-rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.18.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.18.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubomatic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.3.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.3.0
41
+ description:
42
+ email:
43
+ - documents@brandsinsurance.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - CHANGELOG.adoc
49
+ - LICENSE
50
+ - README.adoc
51
+ - lib/rubocop-rubomatic-rails.rb
52
+ - lib/rubocop/cop/rubomatic-rails/generator.rb
53
+ - lib/rubocop/cop/rubomatic-rails/generator/cop_readme_injector.rb
54
+ - lib/rubocop/cop/rubomatic-rails/generator/dept_readme_injector.rb
55
+ - lib/rubocop/cop/rubomatic_rails_cops.rb
56
+ - lib/rubocop/rubomatic-rails.rb
57
+ - lib/rubocop/rubomatic-rails/inject.rb
58
+ - lib/rubocop/rubomatic-rails/version.rb
59
+ homepage: https://github.com/BrandsInsurance/rubomatic-rails/
60
+ licenses:
61
+ - MIT
62
+ metadata:
63
+ rubygems_mfa_required: 'true'
64
+ homepage_uri: https://github.com/BrandsInsurance/rubomatic-rails/
65
+ source_code_uri: https://github.com/BrandsInsurance/rubomatic-rails
66
+ changelog_uri: https://github.com/BrandsInsurance/rubomatic-rails/blob/main/CHANGELOG.adoc
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.1
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">"
79
+ - !ruby/object:Gem::Version
80
+ version: 1.3.1
81
+ requirements: []
82
+ rubygems_version: 3.2.15
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: Shared rails rubocop config for BrandsInsurance
86
+ test_files: []