rubocop-codeur 0.1.18 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a36a82168daf0237948c930aa9ac3c902bc333ea8b4fa4d4c9e8cc60d04a2a42
4
- data.tar.gz: a568017edc3d11768131c1d9abed878f51a9044a4add67a91e7195c671d3e32b
3
+ metadata.gz: 420f3301ff009bf96c52547e4246fa419d902281f56c7f47700572a144c92f09
4
+ data.tar.gz: 5e9d83bbb45232a8d37ec82e6635a1861a5d6a30c600c65fe12d00f8bdb8ae2b
5
5
  SHA512:
6
- metadata.gz: ca8758c01b89b4357cf9a71cfae668d85327beeddb016c781fe05169727cf336c1d5460d725c2f78c9c620b6c68ea8c6ef3934ffe0ac4ded7b0aa7a27e2dcc30
7
- data.tar.gz: 2128295de2ce97b22d9cb2fabc447ac8f068ec1a717b1a41f58e9df5706589f87e306c3193e059abba38c89f36041f356de5373b0f8cb10e5d29029f64f7900e
6
+ metadata.gz: 207d14d404508d364b8abca572ae641ecf3c223b30cbdc69e9d3a665e9f54d6ee034081ef3d277bf8290026b62e2dbfb5f1619e393a8b6a5a7ae743dc8011c91
7
+ data.tar.gz: 0d71a43971ce29790b74fc25ecd5555c1d263a5edf8cc55a64e03c9be82419616a3e79b5ce4b304779bbe339f910c066db0ebe18d757c3c2bac560632afd9e94
@@ -0,0 +1,34 @@
1
+ name: Quality audit
2
+
3
+ on: [pull_request]
4
+
5
+ jobs:
6
+ rubocop:
7
+ name: rubocop
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - name: Check out code
11
+ uses: actions/checkout@v1
12
+ - uses: ruby/setup-ruby@v1
13
+ with:
14
+ ruby-version: 2.7
15
+ bundler-cache: true
16
+ - name: Run Rubocop
17
+ uses: reviewdog/action-rubocop@v1
18
+ with:
19
+ github_token: ${{ secrets.github_token }}
20
+ rubocop_version: gemfile
21
+ reporter: github-pr-check
22
+
23
+ brakeman:
24
+ name: brakeman
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - name: Check out code
28
+ uses: actions/checkout@v1
29
+ - name: Run Brakeman
30
+ uses: reviewdog/action-brakeman@v1
31
+ with:
32
+ github_token: ${{ secrets.github_token }}
33
+ brakeman_version: 5.0.4
34
+ reporter: github-pr-check
@@ -0,0 +1,41 @@
1
+ name: Test
2
+
3
+ on: [pull_request]
4
+
5
+ env:
6
+ RAILS_ENV: test
7
+
8
+ jobs:
9
+ test:
10
+
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ matrix:
15
+ ruby: ['2.7', '3.0']
16
+
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+
20
+ - name: Set up Ruby ${{ matrix.ruby }}
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby }}
24
+ bundler-cache: true
25
+
26
+ - name: Run tests
27
+ run: bin/rake test
28
+ env:
29
+ COVERAGE: true
30
+
31
+ - name: Simplecov Report
32
+ uses: aki77/simplecov-report-action@v1
33
+ with:
34
+ token: ${{ secrets.GITHUB_TOKEN }}
35
+ failedThreshold: 100
36
+
37
+ - name: Upload coverage
38
+ uses: actions/upload-artifact@v1
39
+ with:
40
+ name: Coverage
41
+ path: coverage
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ .DS_Store
2
+ /spec/
3
+ /.bundle/
4
+ /.yardoc
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
data/.rubocop.yml ADDED
@@ -0,0 +1,9 @@
1
+ AllCops:
2
+ NewCops: enable
3
+
4
+ Naming/FileName:
5
+ Exclude:
6
+ - lib/rubocop-codeur.rb
7
+
8
+ Gemspec/RequireMFA:
9
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
5
+
6
+ # Specify your gem's dependencies in rubocop-codeur.gemspec
7
+ gemspec
8
+
9
+ gem 'minitest', '~> 5.0'
10
+ gem 'rake', '~> 12.0'
11
+ gem 'rubocop-minitest', '~> 0.17'
12
+ gem 'simplecov', require: false
data/Gemfile.lock ADDED
@@ -0,0 +1,74 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rubocop-codeur (0.3.0)
5
+ rubocop (~> 1.25)
6
+ rubocop-minitest (~> 0.10, >= 0.10.2)
7
+ rubocop-performance (~> 1.9, >= 1.9.2)
8
+ rubocop-rails (~> 2.9, >= 2.9.1)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ activesupport (7.0.1)
14
+ concurrent-ruby (~> 1.0, >= 1.0.2)
15
+ i18n (>= 1.6, < 2)
16
+ minitest (>= 5.1)
17
+ tzinfo (~> 2.0)
18
+ ast (2.4.2)
19
+ concurrent-ruby (1.1.9)
20
+ docile (1.4.0)
21
+ i18n (1.9.1)
22
+ concurrent-ruby (~> 1.0)
23
+ minitest (5.15.0)
24
+ parallel (1.21.0)
25
+ parser (3.1.0.0)
26
+ ast (~> 2.4.1)
27
+ rack (2.2.3)
28
+ rainbow (3.1.1)
29
+ rake (12.3.3)
30
+ regexp_parser (2.2.0)
31
+ rexml (3.2.5)
32
+ rubocop (1.25.0)
33
+ parallel (~> 1.10)
34
+ parser (>= 3.1.0.0)
35
+ rainbow (>= 2.2.2, < 4.0)
36
+ regexp_parser (>= 1.8, < 3.0)
37
+ rexml
38
+ rubocop-ast (>= 1.15.1, < 2.0)
39
+ ruby-progressbar (~> 1.7)
40
+ unicode-display_width (>= 1.4.0, < 3.0)
41
+ rubocop-ast (1.15.1)
42
+ parser (>= 3.0.1.1)
43
+ rubocop-minitest (0.17.0)
44
+ rubocop (>= 0.90, < 2.0)
45
+ rubocop-performance (1.13.2)
46
+ rubocop (>= 1.7.0, < 2.0)
47
+ rubocop-ast (>= 0.4.0)
48
+ rubocop-rails (2.13.2)
49
+ activesupport (>= 4.2.0)
50
+ rack (>= 1.1)
51
+ rubocop (>= 1.7.0, < 2.0)
52
+ ruby-progressbar (1.11.0)
53
+ simplecov (0.21.2)
54
+ docile (~> 1.1)
55
+ simplecov-html (~> 0.11)
56
+ simplecov_json_formatter (~> 0.1)
57
+ simplecov-html (0.12.3)
58
+ simplecov_json_formatter (0.1.3)
59
+ tzinfo (2.0.4)
60
+ concurrent-ruby (~> 1.0)
61
+ unicode-display_width (2.1.0)
62
+
63
+ PLATFORMS
64
+ ruby
65
+
66
+ DEPENDENCIES
67
+ minitest (~> 5.0)
68
+ rake (~> 12.0)
69
+ rubocop-codeur!
70
+ rubocop-minitest (~> 0.17)
71
+ simplecov
72
+
73
+ BUNDLED WITH
74
+ 2.1.4
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright 2021 Codeur SARL
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Rubocop Codeur
1
+ # RuboCop Codeur
2
2
  Shared rubocop config gem for every Ruby projects at Codeur SARL
3
3
 
4
4
  ## Installation
@@ -25,9 +25,12 @@ Then run:
25
25
  `bundle exec rubocop`
26
26
 
27
27
  You don't need to include rubocop directly in your application's dependencies.
28
- `rubocop-codeur` will include `rubocop`, `rubocop-minitest`, `rubocop-performance` and `rubocop-rails` dependencies.
28
+ `rubocop-codeur` will include `rubocop`, `rubocop-minitest`, `rubocop-performance`,
29
+ and `rubocop-rails` dependencies.
29
30
 
30
- It might be necessary to override style rules set in this gem for some projects or to add specific ones. Rule inheritance provided by Rubocop works like the following:
31
+ It might be necessary to override style rules set in this gem for some projects
32
+ or to add specific ones. Rule inheritance provided by RuboCop works like the
33
+ following:
31
34
  `inherit_gem → inherit_from → local rules`
32
35
 
33
36
  For example:
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << 'test'
8
+ t.libs << 'lib'
9
+ t.test_files = FileList['test/**/*_test.rb']
10
+ end
11
+
12
+ task default: :test
13
+
14
+ desc 'Generate a new cop with a template'
15
+ task :new_cop, [:cop] do |_task, args|
16
+ require 'rubocop'
17
+
18
+ cop_name = args.fetch(:cop) do
19
+ warn 'usage: bundle exec rake new_cop[Department/Name]'
20
+ exit!
21
+ end
22
+
23
+ generator = RuboCop::Cop::Generator.new(cop_name)
24
+
25
+ generator.write_source
26
+ generator.write_spec
27
+ generator.inject_require(root_file_path: 'lib/rubocop/cop/codeur_cops.rb')
28
+ generator.inject_config(config_file_path: 'config/default.yml')
29
+
30
+ puts generator.todo
31
+ end
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'rubocop/codeur'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/bin/rake ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require 'pathname'
12
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path('bundle', __dir__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require 'rubygems'
27
+ require 'bundler/setup'
28
+
29
+ load Gem.bin_path('rake', 'rake')
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,13 @@
1
+ Codeur/RailsAppPatterns:
2
+ Description: 'Allows or forbids patterns in app directories'
3
+ Enabled: pending
4
+ VersionAdded: '0.2.0'
5
+ AllowedPatterns: []
6
+ ForbiddenPatterns: []
7
+
8
+ Codeur/RailsAvoidInstanceMethodsInHelpers:
9
+ Description: 'Forbids instance methods in Rails helpers'
10
+ Enabled: pending
11
+ VersionAdded: '0.2.0'
12
+ Include:
13
+ - app/helpers/**/*.rb
data/default.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  require:
2
+ - rubocop-codeur
2
3
  - rubocop-minitest
3
4
  - rubocop-performance
4
5
  - rubocop-rails
@@ -20,29 +21,44 @@ AllCops:
20
21
  Rails:
21
22
  Enabled: true
22
23
 
24
+ Codeur/RailsAppPatterns:
25
+ Enabled: true
26
+ ForbiddenPatterns:
27
+ - presenters
28
+ - view_objects
29
+ - modules
30
+
31
+ Codeur/RailsAvoidInstanceMethodsInHelpers:
32
+ Enabled: true
33
+
23
34
  Layout/AccessModifierIndentation:
35
+ Enabled: true
24
36
  EnforcedStyle: outdent
25
37
  IndentationWidth: 2
26
38
 
27
39
  Layout/ArgumentAlignment:
40
+ Enabled: true
28
41
  EnforcedStyle: with_first_argument
29
42
 
30
43
  Layout/ClassStructure:
31
44
  Enabled: true
32
45
  AutoCorrect: false
33
46
  ExpectedOrder:
47
+ - devise
34
48
  - module_inclusion
35
49
  - constants
36
50
  - attributes
51
+ - has_ancestry
52
+ - delegated_type
37
53
  - belongs_to
38
54
  - has_many
39
55
  - has_one
40
- - accepts_nested_attributes_for
41
- - has_attached_file
56
+ - attachments
42
57
  - public_delegate
58
+ - class_macros
43
59
  - callbacks
44
60
  - state_machine
45
- - ransack_alias
61
+ - aasm
46
62
  - scope
47
63
  - default_scope
48
64
  - validations
@@ -59,20 +75,31 @@ Layout/ClassStructure:
59
75
  - include
60
76
  - prepend
61
77
  - extend
78
+ attachments:
79
+ - has_one_attached
80
+ - has_many_attached
81
+ - has_attached_file
62
82
  attributes:
63
- - acts_as_voter
64
83
  - attr_accessor
65
84
  - attr_reader
66
85
  - attr_writer
67
86
  - attr_readonly
68
- - devise
69
87
  - emojify
70
88
  - enum
71
- - has_ancestry
72
89
  - monetize
73
- - pg_search_scope
74
90
  - serialize
75
91
  - has_secure_token
92
+ - alias_attribute
93
+ - slug
94
+ class_macros:
95
+ - acts_as_voter
96
+ - pg_search_scope
97
+ - counter_culture
98
+ - accepts_nested_attributes_for
99
+ - paginates_per
100
+ - ransack_alias
101
+ - ransacker
102
+ - ratyrate_rater
76
103
  callbacks:
77
104
  - before_validation
78
105
  - after_validation
@@ -94,33 +121,43 @@ Layout/ClassStructure:
94
121
  - validates
95
122
  - validate
96
123
 
97
- Lint/DuplicateMethods:
98
- Exclude:
99
- - 'db/migrate/*'
100
-
101
124
  Layout/FirstArrayElementIndentation:
125
+ Enabled: true
102
126
  EnforcedStyle: consistent
103
127
 
104
128
  Layout/FirstHashElementIndentation:
129
+ Enabled: true
105
130
  EnforcedStyle: consistent
106
131
 
107
132
  Layout/HashAlignment:
133
+ Enabled: true
108
134
  EnforcedHashRocketStyle: table
109
135
  EnforcedColonStyle: table
110
136
 
111
137
  Layout/LineLength:
138
+ Enabled: true
112
139
  Max: 200
113
140
  AutoCorrect: false
114
141
  Exclude:
115
142
  - 'db/migrate/*'
116
143
 
117
144
  Layout/MultilineMethodCallIndentation:
145
+ Enabled: true
118
146
  EnforcedStyle: indented
119
147
 
120
148
  Layout/ParameterAlignment:
149
+ Enabled: true
121
150
  EnforcedStyle: with_fixed_indentation
122
151
  IndentationWidth: 2
123
152
 
153
+ Lint/DuplicateMethods:
154
+ Enabled: true
155
+ Exclude:
156
+ - 'db/migrate/*'
157
+
158
+ Lint/MissingSuper:
159
+ Enabled: false
160
+
124
161
  Lint/RaiseException:
125
162
  Enabled: true
126
163
 
@@ -128,11 +165,13 @@ Lint/StructNewOverride:
128
165
  Enabled: true
129
166
 
130
167
  Metrics/AbcSize:
168
+ Enabled: true
131
169
  Max: 65
132
170
  Exclude:
133
171
  - 'db/migrate/*'
134
172
 
135
173
  Metrics/BlockLength:
174
+ Enabled: true
136
175
  Max: 60
137
176
  Exclude:
138
177
  - 'config/routes.rb'
@@ -140,28 +179,34 @@ Metrics/BlockLength:
140
179
  - 'app/states/*'
141
180
 
142
181
  Metrics/ClassLength:
182
+ Enabled: true
143
183
  Max: 300
144
184
  Exclude:
145
185
  - 'app/models/**/*'
146
186
 
147
187
  Metrics/CyclomaticComplexity:
188
+ Enabled: true
148
189
  Max: 10
149
190
 
150
191
  Metrics/MethodLength:
192
+ Enabled: true
151
193
  Max: 60
152
194
  Exclude:
153
195
  - 'db/migrate/*'
154
196
 
155
197
  Metrics/ModuleLength:
198
+ Enabled: true
156
199
  Max: 300
157
200
 
158
201
  Metrics/PerceivedComplexity:
202
+ Enabled: true
159
203
  Max: 10
160
204
 
161
205
  Minitest/TestMethodName:
162
206
  Enabled: false
163
207
 
164
208
  Minitest/MultipleAssertions:
209
+ Enabled: true
165
210
  Max: 30
166
211
 
167
212
  # Disabled because it doesn't with symbols like: record_001
@@ -172,16 +217,20 @@ Rails/BulkChangeTable:
172
217
  Enabled: false
173
218
 
174
219
  Rails/CreateTableWithTimestamps:
220
+ Enabled: true
175
221
  Exclude:
176
222
  - 'db/migrate/{2012,2013,2014,2015,2016,2017,2018}*.rb'
177
223
 
178
224
  Rails/EnvironmentVariableAccess:
225
+ Enabled: true
179
226
  AllowReads: true
180
227
 
181
228
  Rails/FilePath:
229
+ Enabled: true
182
230
  EnforcedStyle: arguments
183
231
 
184
232
  Rails/ReversibleMigration:
233
+ Enabled: true
185
234
  Exclude:
186
235
  - 'db/migrate/{2012,2013,2014,2015,2016,2017,2018}*.rb'
187
236
 
@@ -199,6 +248,7 @@ Rails/TimeZone:
199
248
  AutoCorrect: false
200
249
 
201
250
  Rails/UnknownEnv:
251
+ Enabled: true
202
252
  Environments:
203
253
  - development
204
254
  - test
@@ -209,6 +259,7 @@ Style/AsciiComments:
209
259
  Enabled: false
210
260
 
211
261
  Style/ClassAndModuleChildren:
262
+ Enabled: true
212
263
  AutoCorrect: true
213
264
 
214
265
  Style/ConditionalAssignment:
@@ -218,15 +269,21 @@ Style/Documentation:
218
269
  Enabled: false
219
270
 
220
271
  Style/EmptyMethod:
272
+ Enabled: true
221
273
  EnforcedStyle: expanded
222
274
 
223
275
  Style/GuardClause:
276
+ Enabled: true
224
277
  MinBodyLength: 3
225
278
 
226
279
  Style/HashEachMethods:
227
280
  Enabled: true
228
281
  AutoCorrect: true
229
282
 
283
+ Style/HashSyntax:
284
+ Enabled: true
285
+ EnforcedStyle: ruby19
286
+
230
287
  Style/HashTransformKeys:
231
288
  Enabled: true
232
289
  AutoCorrect: true
@@ -247,7 +304,12 @@ Style/NestedTernaryOperator:
247
304
  Style/NumericPredicate:
248
305
  Enabled: false
249
306
 
307
+ Style/StringLiterals:
308
+ Enabled: true
309
+ EnforcedStyle: single_quotes
310
+
250
311
  Style/SymbolArray:
312
+ Enabled: true
251
313
  MinSize: 7
252
314
 
253
315
  Style/FormatStringToken:
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The original code is from https://github.com/rubocop/rubocop-rspec/blob/master/lib/rubocop/rspec/inject.rb
4
+ # See https://github.com/rubocop/rubocop-rspec/blob/master/MIT-LICENSE.md
5
+ module RuboCop
6
+ module Codeur
7
+ # Because RuboCop doesn't yet support plugins, we have to monkey patch in a
8
+ # bit of our configuration.
9
+ module Inject
10
+ def self.defaults!
11
+ path = CONFIG_DEFAULT.to_s
12
+ hash = ConfigLoader.send(:load_yaml_configuration, path)
13
+ config = Config.new(hash, path).tap(&:make_excludes_absolute)
14
+ puts "configuration from #{path}" if ConfigLoader.debug?
15
+ config = ConfigLoader.merge_with_default(config, path)
16
+ ConfigLoader.instance_variable_set(:@default_configuration, config)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Codeur
5
+ VERSION = '0.3.0'
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubocop/codeur/version'
4
+ require 'yaml'
5
+
6
+ module RuboCop
7
+ # RuboCop Codeur project namespace
8
+ module Codeur
9
+ class Error < StandardError; end
10
+ # Your code goes here...
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,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Codeur
6
+ # This cop makes sure that Rails app only uses patterns (app subdirectories)
7
+ # defined in Cop config.
8
+ #
9
+ # @example ForbiddenPatterns: [presenters, view_objects, uploaders, modules]
10
+ # # bad
11
+ # app/presenters/order_presenter.rb
12
+ #
13
+ # # bad
14
+ # app/modules/stuffy.rb
15
+ #
16
+ # # good
17
+ # app/view_components/order_component.rb
18
+ #
19
+ # # good
20
+ # app/models/concerns/stuffy.rb
21
+ #
22
+ # @example AllowedPatterns: [assets, controllers, javascript, jobs, mailers, models, views]
23
+ # # bad
24
+ # app/controller/some_controller.rb
25
+ #
26
+ # # good
27
+ # app/controllers/some_controller.rb
28
+ #
29
+ class RailsAppPatterns < Base
30
+ MSG_FORBIDDEN = '`%<pattern>s` are forbidden.'
31
+ MSG_NOT_ALLOWED = '`%<pattern>s` are not allowed. Allowed patterns are: %<allowed_patterns>s.'
32
+
33
+ def on_new_investigation
34
+ file_path = processed_source.file_path
35
+ return if config.file_to_exclude?(file_path)
36
+
37
+ for_bad_patterns(file_path) { |msg| add_global_offense(msg, severity: :warning) }
38
+ end
39
+
40
+ private
41
+
42
+ def for_bad_patterns(file_path)
43
+ pattern = pattern_from_path(file_path)
44
+ return if pattern.nil?
45
+
46
+ if pattern_forbidden?(pattern)
47
+ msg = format(MSG_FORBIDDEN, pattern: pattern)
48
+ elsif pattern_not_allowed?(pattern)
49
+ msg = format(MSG_NOT_ALLOWED,
50
+ pattern: pattern,
51
+ allowed_patterns: allowed_patterns.map { |p| "`#{p}`" }.join(', '))
52
+ end
53
+
54
+ yield msg if msg
55
+ end
56
+
57
+ def pattern_from_path(path)
58
+ return nil unless path.match(%r{/app/(?<pattern>.+)/.+})
59
+
60
+ Regexp.last_match(:pattern)
61
+ end
62
+
63
+ def pattern_forbidden?(pattern)
64
+ forbidden_patterns.any? && forbidden_patterns.include?(pattern)
65
+ end
66
+
67
+ def pattern_not_allowed?(pattern)
68
+ allowed_patterns.any? && !allowed_patterns.include?(pattern)
69
+ end
70
+
71
+ def allowed_patterns
72
+ cop_config['AllowedPatterns'] || []
73
+ end
74
+
75
+ def forbidden_patterns
76
+ cop_config['ForbiddenPatterns'] || []
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Codeur
6
+ # This cop makes sure that Rails helpers only uses class methods in order
7
+ # to be able to use them in the test, views or from anywhere else.
8
+ # ApplicationHelper is excluded from this rule by default.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # module CoolHelper
13
+ # def foobar
14
+ # # ...
15
+ # end
16
+ # end
17
+ #
18
+ # # good
19
+ # module CoolHelper
20
+ # def self.foobar
21
+ # # ...
22
+ # end
23
+ # end
24
+ #
25
+ class RailsAvoidInstanceMethodsInHelpers < Base
26
+ MSG = 'Prefer class methods in helpers.'
27
+
28
+ def on_def(node)
29
+ # NOTE: :sclass node is a "class << self" node
30
+ return if node.parent.sclass_type?
31
+
32
+ add_offense(node)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'codeur/rails_app_patterns'
4
+ require_relative 'codeur/rails_avoid_instance_methods_in_helpers'
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubocop'
4
+
5
+ require_relative 'rubocop/codeur'
6
+ require_relative 'rubocop/codeur/version'
7
+ require_relative 'rubocop/codeur/inject'
8
+
9
+ RuboCop::Codeur::Inject.defaults!
10
+
11
+ require_relative 'rubocop/cop/codeur_cops'
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/rubocop/codeur/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'rubocop-codeur'
7
+ spec.version = RuboCop::Codeur::VERSION
8
+ spec.authors = ['Codeur']
9
+ spec.email = ['dev@codeur.com']
10
+
11
+ spec.summary = 'Codeur rubocop config gem'
12
+ spec.description = 'Shared rubocop config gem for every Ruby projects at Codeur SARL'
13
+ spec.homepage = 'https://github.com/codeur/rubocop-codeur'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.6.0')
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+
23
+ spec.add_dependency 'rubocop', '~> 1.25'
24
+ spec.add_dependency 'rubocop-minitest', '~> 0.10', '>=0.10.2'
25
+ spec.add_dependency 'rubocop-performance', '~> 1.9', '>= 1.9.2'
26
+ spec.add_dependency 'rubocop-rails', '~> 2.9', '>= 2.9.1'
27
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-codeur
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
- - Dev-team Codeur
7
+ - Codeur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-28 00:00:00.000000000 Z
11
+ date: 2022-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.9.1
19
+ version: '1.25'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.9.1
26
+ version: '1.25'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubocop-minitest
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -91,32 +91,48 @@ executables: []
91
91
  extensions: []
92
92
  extra_rdoc_files: []
93
93
  files:
94
- - MIT-LICENSE
94
+ - ".github/workflows/quality.yml"
95
+ - ".github/workflows/test.yml"
96
+ - ".gitignore"
97
+ - ".rubocop.yml"
98
+ - Gemfile
99
+ - Gemfile.lock
100
+ - LICENSE.txt
95
101
  - README.md
102
+ - Rakefile
103
+ - bin/console
104
+ - bin/rake
105
+ - bin/setup
106
+ - config/default.yml
96
107
  - default.yml
97
- - lib/rubocop_codeur.rb
98
- - lib/rubocop_codeur/version.rb
108
+ - lib/rubocop-codeur.rb
109
+ - lib/rubocop/codeur.rb
110
+ - lib/rubocop/codeur/inject.rb
111
+ - lib/rubocop/codeur/version.rb
112
+ - lib/rubocop/cop/codeur/rails_app_patterns.rb
113
+ - lib/rubocop/cop/codeur/rails_avoid_instance_methods_in_helpers.rb
114
+ - lib/rubocop/cop/codeur_cops.rb
115
+ - rubocop-codeur.gemspec
99
116
  homepage: https://github.com/codeur/rubocop-codeur
100
117
  licenses:
101
118
  - MIT
102
- metadata:
103
- homepage_uri: https://github.com/codeur/rubocop-codeur
119
+ metadata: {}
104
120
  post_install_message:
105
121
  rdoc_options: []
106
122
  require_paths:
107
123
  - lib
108
124
  required_ruby_version: !ruby/object:Gem::Requirement
109
125
  requirements:
110
- - - "~>"
126
+ - - ">="
111
127
  - !ruby/object:Gem::Version
112
- version: '2.6'
128
+ version: 2.6.0
113
129
  required_rubygems_version: !ruby/object:Gem::Requirement
114
130
  requirements:
115
131
  - - ">="
116
132
  - !ruby/object:Gem::Version
117
133
  version: '0'
118
134
  requirements: []
119
- rubygems_version: 3.0.3
135
+ rubygems_version: 3.1.4
120
136
  signing_key:
121
137
  specification_version: 4
122
138
  summary: Codeur rubocop config gem
data/MIT-LICENSE DELETED
@@ -1,20 +0,0 @@
1
- Copyright 2021 Codeur SARL
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RubocopCodeur
4
- VERSION = '0.1.18'
5
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rubocop_codeur/version'
4
-
5
- module RubocopCodeur
6
- end