rubocop-petal 0.1.0 → 0.2.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 +4 -4
- data/.github/workflows/build.yml +5 -3
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +15 -0
- data/Gemfile.lock +5 -5
- data/README.md +9 -2
- data/config/default.yml +31 -0
- data/lib/rubocop/cop/grape/helpers_include_module.rb +61 -0
- data/lib/rubocop/cop/grape/unnecessary_namespace.rb +64 -0
- data/lib/rubocop/cop/migration/use_change_table_bulk.rb +30 -0
- data/lib/rubocop/cop/rspec/authenticated_as.rb +32 -0
- data/lib/rubocop/cop/rspec/create_list_max.rb +42 -0
- data/lib/rubocop/petal/version.rb +1 -1
- data/rubocop-petal.gemspec +2 -2
- metadata +20 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55cc186c715bd9f5f1b239fbedcf1ff306f82fe4c9aa4be1a3a00dbedf593ce2
|
4
|
+
data.tar.gz: 18690d528f7fc3c9caf8534a4278e6674d6979b0c982981514efa139d5fe47ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ed1e80327d5bbce723c817ed98847e548a7f05b8f770d9023bfe1f81492177bee7d6710851bd1f15c79fc7c536e9517014284923634cf6e0910e4451436a265
|
7
|
+
data.tar.gz: bb64a217f444e47098cddea795e43a12751d0687901a87fbf5e8bc8f627aac999cfbf6885c28ba8a240fdeb2022b0b6bd45ab263108a23e1ba076b5c95486e1e
|
data/.github/workflows/build.yml
CHANGED
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
# main
|
4
|
+
|
5
|
+
# v0.2.0
|
6
|
+
|
7
|
+
* Added cop `RSpec/AuthenticatedAs` ([#3](https://github.com/petalmd/rubocop-petal/pull/3))
|
8
|
+
* Added cop `Grape/UnnecessaryNamespace` ([#2](https://github.com/petalmd/rubocop-petal/pull/2))
|
9
|
+
* Added cop `RSpec/CreateListMax` ([#4](https://github.com/petalmd/rubocop-petal/pull/4))
|
10
|
+
* Added Cop `Migration/UseChangeTableBulk` ([#7](https://github.com/petalmd/rubocop-petal/pull/7))
|
11
|
+
* Added cop `Grape/HelpersIncludeModule` ([#1](https://github.com/petalmd/rubocop-petal/pull/1))
|
12
|
+
|
13
|
+
# v0.1.0
|
14
|
+
|
15
|
+
* First version
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rubocop-petal (0.
|
5
|
-
rubocop
|
6
|
-
rubocop-rails
|
4
|
+
rubocop-petal (0.2.0)
|
5
|
+
rubocop (>= 1.7.0, < 2.0)
|
6
|
+
rubocop-rails (~> 2.10.0)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
@@ -51,10 +51,10 @@ GEM
|
|
51
51
|
unicode-display_width (>= 1.4.0, < 3.0)
|
52
52
|
rubocop-ast (1.15.0)
|
53
53
|
parser (>= 3.0.1.1)
|
54
|
-
rubocop-rails (2.
|
54
|
+
rubocop-rails (2.10.1)
|
55
55
|
activesupport (>= 4.2.0)
|
56
56
|
rack (>= 1.1)
|
57
|
-
rubocop (>=
|
57
|
+
rubocop (>= 1.7.0, < 2.0)
|
58
58
|
rubocop-rspec (2.6.0)
|
59
59
|
rubocop (~> 1.19)
|
60
60
|
ruby-progressbar (1.11.0)
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# RuboCop::Petal
|
2
2
|
|
3
3
|
[](https://github.com/petalmd/rubocop-petal/actions/workflows/build.yml)
|
4
|
+
[](https://badge.fury.io/rb/rubocop-petal)
|
4
5
|
|
5
6
|
Petal custom cops. List of cops can be find [here](https://github.com/petalmd/rubocop-petal/tree/main/lib/rubocop/cop).
|
6
7
|
|
@@ -26,21 +27,27 @@ In your `.rubocop.yml` file, add `rubocop-petal`
|
|
26
27
|
|
27
28
|
```yaml
|
28
29
|
require:
|
29
|
-
- rubocop-
|
30
|
+
- rubocop-petal
|
30
31
|
```
|
31
32
|
|
32
33
|
## Development
|
33
34
|
|
34
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
|
35
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
|
36
|
+
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
35
37
|
|
36
38
|
To install this gem onto your local machine, run `bundle exec rake install`.
|
37
39
|
|
40
|
+
To run all checks like the CI simply run `bundle exec rake`.
|
41
|
+
|
38
42
|
## Create new cop
|
39
43
|
|
40
44
|
```shell
|
41
45
|
bundle exec rake 'new_cop[Rails/MyNewCop]'
|
42
46
|
```
|
43
47
|
|
48
|
+
Have a look to [RuboCop documentation](https://docs.rubocop.org/rubocop/1.23/development.html) to get started with
|
49
|
+
_node pattern_.
|
50
|
+
|
44
51
|
## Release
|
45
52
|
|
46
53
|
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
data/config/default.yml
CHANGED
@@ -1,3 +1,34 @@
|
|
1
|
+
RSpec/AuthenticatedAs:
|
2
|
+
Description: 'Suggest to use authenticated_as instead of legacy api_key.'
|
3
|
+
Enabled: true
|
4
|
+
Include:
|
5
|
+
- spec/api/**/*_spec.rb
|
6
|
+
|
7
|
+
RSpec/CreateListMax:
|
8
|
+
Description: 'Prevent creating to most records with `FactoryBot.create_list`.'
|
9
|
+
Enabled: true
|
10
|
+
Max: 5
|
11
|
+
Include:
|
12
|
+
- spec/**/*
|
13
|
+
|
14
|
+
Migration/UseChangeTableBulk:
|
15
|
+
Description: 'Enforces the use of option `bulk: true` with `change_table`'
|
16
|
+
Enabled: true
|
17
|
+
Include:
|
18
|
+
- db/migrate/**
|
19
|
+
|
20
|
+
Grape/HelpersIncludeModule:
|
21
|
+
Description: 'Prevent using helpers with block to include module'
|
22
|
+
Enabled: true
|
23
|
+
Include:
|
24
|
+
- app/api/**/*
|
25
|
+
|
26
|
+
Grape/UnnecessaryNamespace:
|
27
|
+
Description: 'Detect unnecessary usage of Grape namespace.'
|
28
|
+
Enabled: true
|
29
|
+
Include:
|
30
|
+
- app/api/**/*
|
31
|
+
|
1
32
|
Rails/EnumPrefix:
|
2
33
|
Description: 'Set prefix options when using enums.'
|
3
34
|
Enabled: true
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Grape
|
6
|
+
# Prevent usage of Grape `helpers` with a block to include module.
|
7
|
+
# Using a bloc will create a new unnecessary module.
|
8
|
+
#
|
9
|
+
# # bad
|
10
|
+
# helpers do
|
11
|
+
# include MyModule
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# # bad
|
15
|
+
# helpers do
|
16
|
+
# include MyModule
|
17
|
+
# include MyOtherModule
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# helpers MyModule
|
22
|
+
#
|
23
|
+
# # good
|
24
|
+
# helpers MyModule, MyOtherModule
|
25
|
+
class HelpersIncludeModule < Base
|
26
|
+
MSG = 'Use `helpers %<module_name>s` instead of `helpers` with a block.'
|
27
|
+
|
28
|
+
def_node_matcher :helpers?, <<~PATTERN
|
29
|
+
(send nil? :helpers)
|
30
|
+
PATTERN
|
31
|
+
|
32
|
+
def_node_matcher :called_include?, <<~PATTERN
|
33
|
+
(send nil? :include (const _ $_))
|
34
|
+
PATTERN
|
35
|
+
|
36
|
+
def on_send(node)
|
37
|
+
return unless helpers?(node)
|
38
|
+
|
39
|
+
helpers_block_node = node.block_node.children.last
|
40
|
+
block_nodes = block_nodes_in_helpers(helpers_block_node)
|
41
|
+
|
42
|
+
block_nodes.each do |block_node|
|
43
|
+
if (module_name = called_include?(block_node))
|
44
|
+
add_offense(block_node, message: format(MSG, module_name: module_name))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def block_nodes_in_helpers(node)
|
52
|
+
if node.begin_type?
|
53
|
+
node.children
|
54
|
+
else
|
55
|
+
[node]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Grape
|
6
|
+
# Detect unnecessary usage of Grape namespace.
|
7
|
+
#
|
8
|
+
# # bad
|
9
|
+
# namespace :my_namespace
|
10
|
+
# get {}
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# # good
|
14
|
+
# get :my_namespace {}
|
15
|
+
#
|
16
|
+
class UnnecessaryNamespace < Base
|
17
|
+
MSG = 'Unnecessary usage of Grape namespace. '\
|
18
|
+
'Specify endpoint name with a argument: `get :my_namespace`.'
|
19
|
+
HTTP_ACTIONS = Set.new(%i[get put post patch delete])
|
20
|
+
GRAPE_NAMESPACE_ALIAS = Set.new(%i[namespace resource resources])
|
21
|
+
METHOD_JUSTIFY_NAMESPACE = Set.new(%i[route_param namespaces resource resources version])
|
22
|
+
|
23
|
+
def_node_matcher :namespace?, <<~PATTERN
|
24
|
+
(send nil? GRAPE_NAMESPACE_ALIAS ({sym | str} _))
|
25
|
+
PATTERN
|
26
|
+
|
27
|
+
def_node_matcher :justify_namespace?, <<~PATTERN
|
28
|
+
(block (send nil? METHOD_JUSTIFY_NAMESPACE ...) ...)
|
29
|
+
PATTERN
|
30
|
+
|
31
|
+
def_node_matcher :http_action?, <<~PATTERN
|
32
|
+
(block (send nil? HTTP_ACTIONS) ...)
|
33
|
+
PATTERN
|
34
|
+
|
35
|
+
def on_send(node)
|
36
|
+
return unless namespace?(node)
|
37
|
+
|
38
|
+
node_to_select_http_action = namespace_node(node)
|
39
|
+
|
40
|
+
return if node_to_select_http_action.any? do |namespace_node|
|
41
|
+
justify_namespace?(namespace_node)
|
42
|
+
end
|
43
|
+
|
44
|
+
http_action_node = select_http_action_block_node(node_to_select_http_action)
|
45
|
+
add_offense(node) if http_action_node.size == 1
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def select_http_action_block_node(nodes)
|
51
|
+
nodes.select { |node| http_action?(node) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def namespace_node(node)
|
55
|
+
if node.block_node.children.last.block_type?
|
56
|
+
[node.block_node.children.last]
|
57
|
+
else
|
58
|
+
node.block_node.children.last.children
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Migration
|
6
|
+
# Use `bulk: true` with `change_table`.
|
7
|
+
# # bad
|
8
|
+
#
|
9
|
+
# change_table :my_table
|
10
|
+
#
|
11
|
+
# # good
|
12
|
+
#
|
13
|
+
# change_table :my_table, bulk: true
|
14
|
+
class UseChangeTableBulk < Base
|
15
|
+
MSG = 'Use `change_table` with `bulk: true`.'
|
16
|
+
RESTRICT_ON_SEND = %i[change_table].freeze
|
17
|
+
|
18
|
+
def_node_matcher :use_bulk?, <<~PATTERN
|
19
|
+
(send nil? :change_table _ (hash <(pair (sym :bulk) true) ...>) ...)
|
20
|
+
PATTERN
|
21
|
+
|
22
|
+
def on_send(node)
|
23
|
+
return if use_bulk?(node)
|
24
|
+
|
25
|
+
add_offense(node)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module RSpec
|
6
|
+
# Suggest to use authenticated_as instead of legacy api_key.
|
7
|
+
# It is faster, can be setup for multiple test.
|
8
|
+
#
|
9
|
+
# # bad
|
10
|
+
# get 'api/my_endpoint', headers: { HTTP_API_KEY: user.api_key }
|
11
|
+
#
|
12
|
+
# # good
|
13
|
+
# authenticated_as user
|
14
|
+
# get 'api/my_endpoint'
|
15
|
+
#
|
16
|
+
class AuthenticatedAs < Base
|
17
|
+
MSG = 'Use `authenticated_as` instead of legacy api_key.'
|
18
|
+
|
19
|
+
def_node_search :use_header_api_key, <<~PATTERN
|
20
|
+
(sym :HTTP_API_KEY)
|
21
|
+
PATTERN
|
22
|
+
|
23
|
+
def on_send(node)
|
24
|
+
api_key_usage = use_header_api_key(node).to_a.first
|
25
|
+
return unless api_key_usage
|
26
|
+
|
27
|
+
add_offense(api_key_usage)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module RSpec
|
6
|
+
# Prevent creating to most records with `FactoryBot.create_list`.
|
7
|
+
# Creating to much records can significantly increase spec time.
|
8
|
+
#
|
9
|
+
# @example Max: 5 (default)
|
10
|
+
# # Maximum amount params allowed for `create_list`.
|
11
|
+
#
|
12
|
+
# # bad
|
13
|
+
# create_list :my_model, 10
|
14
|
+
#
|
15
|
+
# # good
|
16
|
+
# create_list :my_model, 5
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# build_stubbed_list :my_model, 10
|
20
|
+
#
|
21
|
+
class CreateListMax < Base
|
22
|
+
MSG = 'Creating more than `%<max_config>s` records is discouraged.'
|
23
|
+
DEFAULT_MAX = 5
|
24
|
+
RESTRICT_ON_SEND = [:create_list].freeze
|
25
|
+
|
26
|
+
def_node_search :create_list, <<~PATTERN
|
27
|
+
(send _ :create_list (sym _) (:int $_) ...)
|
28
|
+
PATTERN
|
29
|
+
|
30
|
+
def on_send(node)
|
31
|
+
amount = create_list(node).to_a.first
|
32
|
+
|
33
|
+
return unless amount
|
34
|
+
|
35
|
+
max_config = cop_config['Max'] || DEFAULT_MAX
|
36
|
+
|
37
|
+
add_offense(node, message: format(MSG, max_config: max_config)) if amount > max_config
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/rubocop-petal.gemspec
CHANGED
@@ -31,6 +31,6 @@ Gem::Specification.new do |spec|
|
|
31
31
|
# For more information and examples about making a new gem, checkout our
|
32
32
|
# guide at: https://bundler.io/guides/creating_gem.html
|
33
33
|
|
34
|
-
spec.add_runtime_dependency 'rubocop'
|
35
|
-
spec.add_dependency 'rubocop-rails'
|
34
|
+
spec.add_runtime_dependency 'rubocop', '>= 1.7.0', '< 2.0'
|
35
|
+
spec.add_dependency 'rubocop-rails', '~> 2.10.0'
|
36
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-petal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean-Francis Bastien
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01-
|
11
|
+
date: 2022-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -16,28 +16,34 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.7.0
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
29
|
+
version: 1.7.0
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.0'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: rubocop-rails
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
37
|
+
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
39
|
+
version: 2.10.0
|
34
40
|
type: :runtime
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
|
-
- - "
|
44
|
+
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
46
|
+
version: 2.10.0
|
41
47
|
description:
|
42
48
|
email:
|
43
49
|
- jfbastien@petalmd.com
|
@@ -49,6 +55,7 @@ files:
|
|
49
55
|
- ".gitignore"
|
50
56
|
- ".rspec"
|
51
57
|
- ".rubocop.yml"
|
58
|
+
- CHANGELOG.md
|
52
59
|
- Gemfile
|
53
60
|
- Gemfile.lock
|
54
61
|
- LICENSE.txt
|
@@ -59,10 +66,15 @@ files:
|
|
59
66
|
- config/default.yml
|
60
67
|
- lib/rubocop-petal.rb
|
61
68
|
- lib/rubocop/cop/chewy/reset_on_type.rb
|
69
|
+
- lib/rubocop/cop/grape/helpers_include_module.rb
|
70
|
+
- lib/rubocop/cop/grape/unnecessary_namespace.rb
|
71
|
+
- lib/rubocop/cop/migration/use_change_table_bulk.rb
|
62
72
|
- lib/rubocop/cop/petal_cops.rb
|
63
73
|
- lib/rubocop/cop/rails/enum_prefix.rb
|
64
74
|
- lib/rubocop/cop/rails/risky_activerecord_invocation.rb
|
65
75
|
- lib/rubocop/cop/rails/table_name.rb
|
76
|
+
- lib/rubocop/cop/rspec/authenticated_as.rb
|
77
|
+
- lib/rubocop/cop/rspec/create_list_max.rb
|
66
78
|
- lib/rubocop/petal.rb
|
67
79
|
- lib/rubocop/petal/inject.rb
|
68
80
|
- lib/rubocop/petal/version.rb
|