rubocop-magic_numbers 0.1.0 → 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 +4 -4
- data/README.md +84 -3
- data/lib/rubocop/cop/magic_numbers/base.rb +18 -2
- data/lib/rubocop/cop/magic_numbers/no_argument.rb +11 -6
- data/lib/rubocop/cop/magic_numbers/no_assignment.rb +5 -5
- data/lib/rubocop/cop/magic_numbers/no_default.rb +1 -2
- data/lib/rubocop/cop/magic_numbers/no_return.rb +3 -3
- data/lib/rubocop/magic_numbers/version.rb +1 -1
- data/lib/rubocop-magic_numbers.rb +3 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea6ef829ef5402bdcd314250492b87a6f734d7633c54531cfa779689b690b851
|
4
|
+
data.tar.gz: b59bc49fb9783017ae9aa7999984d474779b215df32ac20da1bcafdcb60ade76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15ca87f92adc73951779988d2a75f06ed141fe15dbde2959cfb690a70dff4addc7e5839d68745f490d715fdd73ed581390c7121f599f8c22f00220aede4eecb3
|
7
|
+
data.tar.gz: 7559121922795e3c71a9db0b975b83267bbe16f2aac43d1d9cb79e112235fe4ef7ae3387dc5aea1690232efc17747e84ffe2a4be77d5feb058cb0fc546f5a5a2
|
data/README.md
CHANGED
@@ -40,7 +40,74 @@ $ bundle install
|
|
40
40
|
|
41
41
|
## Usage
|
42
42
|
|
43
|
-
After installing the gem, `rubocop` should automatically detect and raise offenses for magic numbers within your code.
|
43
|
+
After installing the gem, `rubocop` should automatically detect and raise offenses for magic numbers within your code.
|
44
|
+
|
45
|
+
The gem will detect offenses of the following sorts:
|
46
|
+
|
47
|
+
### MagicNumbers/NoArgument
|
48
|
+
|
49
|
+
Detects when magic numbers are used as method arguments.
|
50
|
+
|
51
|
+
``` ruby
|
52
|
+
# BAD
|
53
|
+
@user.too_many_widgets?(20) # what does 20 mean?!
|
54
|
+
|
55
|
+
# GOOD
|
56
|
+
@user.too_many_widgets?(FREE_SUBSCRIPTION_WIDGET_MAX)
|
57
|
+
|
58
|
+
# BAD
|
59
|
+
monthly_average = total / 28 # why 28?
|
60
|
+
|
61
|
+
# GOOD
|
62
|
+
monthly_average = total / FOUR_WEEK_MONTH_IN_DAYS
|
63
|
+
```
|
64
|
+
|
65
|
+
### MagicNumbers/NoAssignment
|
66
|
+
|
67
|
+
``` ruby
|
68
|
+
# BAD
|
69
|
+
total_widget_limit = 20 # why 20?
|
70
|
+
|
71
|
+
# GOOD
|
72
|
+
total_widget_limit = FREE_SUBSCRIPTION_WIDGET_MAX
|
73
|
+
```
|
74
|
+
|
75
|
+
### MagicNumbers/NoDefault
|
76
|
+
|
77
|
+
|
78
|
+
``` ruby
|
79
|
+
# BAD
|
80
|
+
def over_widget_limit?(20)
|
81
|
+
# ...
|
82
|
+
end
|
83
|
+
|
84
|
+
# GOOD
|
85
|
+
def over_widget_limit?(FREE_SUBSCRIPTION_WIDGET_MAX)
|
86
|
+
# ...
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
|
91
|
+
### MagicNumbers/NoReturn
|
92
|
+
|
93
|
+
|
94
|
+
``` ruby
|
95
|
+
# BAD
|
96
|
+
def widget_limit_for_user(user)
|
97
|
+
return 20 if user.subscription_free?
|
98
|
+
|
99
|
+
return 40
|
100
|
+
end
|
101
|
+
|
102
|
+
# GOOD
|
103
|
+
def widget_limit_for_user(user)
|
104
|
+
return FREE_SUBSCRIPTION_WIDGET_MAX if user.subscription_free?
|
105
|
+
|
106
|
+
PAID_SUBSCRIPTION_WIDGET_MAX
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
110
|
+
You can customize the behavior of the gem by adding configurations to a `.rubocop.yml` file in your project's root directory.
|
44
111
|
|
45
112
|
Here are some examples of configurations you can use:
|
46
113
|
|
@@ -48,8 +115,22 @@ Here are some examples of configurations you can use:
|
|
48
115
|
require:
|
49
116
|
- rubocop-magic_numbers
|
50
117
|
|
51
|
-
|
52
|
-
#
|
118
|
+
MagicNumbers/NoArgument:
|
119
|
+
ForbiddenNumerics: All/Float/Integer # default All
|
120
|
+
IgnoredMethods:
|
121
|
+
- '[]' # defaults to just the #[] method
|
122
|
+
PermittedValues: # defaults to []
|
123
|
+
- -1
|
124
|
+
- 1
|
125
|
+
MagicNumbers/NoAssignment:
|
126
|
+
ForbiddenNumerics: All/Float/Integer # default All
|
127
|
+
|
128
|
+
MagicNumbers/Default:
|
129
|
+
ForbiddenNumerics: All/Float/Integer # default All
|
130
|
+
|
131
|
+
MagicNumbers/NoReturn:
|
132
|
+
AllowedReturns: Implicit/Explicit/None # default None
|
133
|
+
ForbiddenNumerics: All/Float/Integer # default All
|
53
134
|
```
|
54
135
|
|
55
136
|
For more information on configuring `rubocop`, please refer to the [official documentation](https://docs.rubocop.org/rubocop/configuration.html).
|
@@ -1,12 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'rubocop'
|
3
4
|
require 'rubocop/cop/cop'
|
5
|
+
# rubocop:disable Lint/SuppressedException
|
6
|
+
# This is only available in newer versions of the RuboCop gem
|
7
|
+
begin
|
8
|
+
require 'rubocop/cop/base'
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
# rubocop:enable Lint/SuppressedException
|
4
12
|
|
5
13
|
module RuboCop
|
6
14
|
module Cop
|
7
|
-
module MagicNumbers
|
15
|
+
module MagicNumbers # rubocop:disable Style/Documentation
|
16
|
+
def self.best_base_class
|
17
|
+
if ::RuboCop::Cop.const_defined?('Base')
|
18
|
+
::RuboCop::Cop::Base
|
19
|
+
else
|
20
|
+
::RuboCop::Cop::Cop
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
8
24
|
# Base class for all shared behaviour between these cops
|
9
|
-
class Base <
|
25
|
+
class Base < best_base_class
|
10
26
|
CONFIG_ALL = 'All'
|
11
27
|
CONFIG_FLOAT = 'Float'
|
12
28
|
CONFIG_INTEGER = 'Integer'
|
@@ -12,15 +12,15 @@ module RuboCop
|
|
12
12
|
#
|
13
13
|
# GOOD:
|
14
14
|
# object.bottles_on_the_wall(DEFAULT_BOTTLE_COUNT)
|
15
|
-
class NoArgument < Base
|
15
|
+
class NoArgument < RuboCop::Cop::MagicNumbers::Base
|
16
16
|
MAGIC_NUMBER_ARGUMENT_PATTERN = <<-PATTERN
|
17
17
|
(send
|
18
18
|
{
|
19
19
|
_
|
20
20
|
_
|
21
|
-
(%<illegal_scalar_pattern>s _)
|
21
|
+
(%<illegal_scalar_pattern>s $_)
|
22
22
|
| # This is a union of lhs and rhs literal
|
23
|
-
(%<illegal_scalar_pattern>s _)
|
23
|
+
(%<illegal_scalar_pattern>s $_)
|
24
24
|
_
|
25
25
|
_
|
26
26
|
}
|
@@ -38,14 +38,14 @@ module RuboCop
|
|
38
38
|
}.freeze
|
39
39
|
|
40
40
|
def cop_config
|
41
|
-
|
41
|
+
DEFAULT_CONFIG.merge(super)
|
42
42
|
end
|
43
43
|
|
44
44
|
def on_message_send(node)
|
45
45
|
return unless illegal_argument?(node)
|
46
46
|
return if ignored_method?(node)
|
47
47
|
|
48
|
-
add_offense(node,
|
48
|
+
add_offense(node, message: ARGUMENT_MSG)
|
49
49
|
end
|
50
50
|
alias on_send on_message_send # rubocop API method name
|
51
51
|
|
@@ -62,13 +62,18 @@ module RuboCop
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def illegal_argument?(node)
|
65
|
-
node_matches_pattern?(
|
65
|
+
captured_value = node_matches_pattern?(
|
66
66
|
node:,
|
67
67
|
pattern: format(
|
68
68
|
MAGIC_NUMBER_ARGUMENT_PATTERN,
|
69
69
|
illegal_scalar_pattern:
|
70
70
|
)
|
71
71
|
)
|
72
|
+
captured_value && !permitted_values.include?(captured_value)
|
73
|
+
end
|
74
|
+
|
75
|
+
def permitted_values
|
76
|
+
Array(cop_config['PermittedValues'])
|
72
77
|
end
|
73
78
|
end
|
74
79
|
end
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# bad: hours = 24
|
13
13
|
#
|
14
14
|
# good: HOURS_IN_ONE_DAY = 24
|
15
|
-
class NoAssignment < Base
|
15
|
+
class NoAssignment < RuboCop::Cop::MagicNumbers::Base
|
16
16
|
MAGIC_NUMBER_ARGUMENT_TO_SETTER_PATTERN = <<-PATTERN
|
17
17
|
(send
|
18
18
|
({send self} ...)
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
return unless illegal_scalar_value?(node)
|
44
44
|
return unless node_within_method?(node)
|
45
45
|
|
46
|
-
add_offense(node,
|
46
|
+
add_offense(node, message: LOCAL_VARIABLE_ASSIGN_MSG)
|
47
47
|
end
|
48
48
|
alias on_lvasgn on_local_variable_assignment # rubocop API method name
|
49
49
|
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
return unless illegal_scalar_value?(node)
|
52
52
|
return unless node_within_method?(node)
|
53
53
|
|
54
|
-
add_offense(node,
|
54
|
+
add_offense(node, message: INSTANCE_VARIABLE_ASSIGN_MSG)
|
55
55
|
end
|
56
56
|
alias on_ivasgn on_instance_variable_assignment # rubocop API method name
|
57
57
|
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
return unless illegal_scalar_argument_to_setter?(node)
|
60
60
|
return unless node_within_method?(node)
|
61
61
|
|
62
|
-
add_offense(node,
|
62
|
+
add_offense(node, message: PROPERTY_MSG)
|
63
63
|
end
|
64
64
|
alias on_send on_message_send # rubocop API method name
|
65
65
|
|
@@ -69,7 +69,7 @@ module RuboCop
|
|
69
69
|
# numbers amongst their assignments
|
70
70
|
return false unless illegal_multi_assign_right_hand_side?(node)
|
71
71
|
|
72
|
-
add_offense(node,
|
72
|
+
add_offense(node, message: MULTIPLE_ASSIGN_MSG)
|
73
73
|
end
|
74
74
|
alias on_masgn on_multiple_assign
|
75
75
|
|
@@ -13,7 +13,7 @@ module RuboCop
|
|
13
13
|
#
|
14
14
|
# GOOD
|
15
15
|
# def on_the_wall(bottles = DEFAULT_BOTTLE_COUNT)
|
16
|
-
class NoDefault < Base
|
16
|
+
class NoDefault < RuboCop::Cop::MagicNumbers::Base
|
17
17
|
MAGIC_NUMBER_OPTIONAL_ARGUMENT_PATTERN = <<-PATTERN
|
18
18
|
(def
|
19
19
|
_
|
@@ -35,7 +35,6 @@ module RuboCop
|
|
35
35
|
|
36
36
|
add_offense(
|
37
37
|
node,
|
38
|
-
location: :expression,
|
39
38
|
message: DEFAULT_OPTIONAL_ARGUMENT_MSG
|
40
39
|
)
|
41
40
|
end
|
@@ -7,7 +7,7 @@ module RuboCop
|
|
7
7
|
module MagicNumbers
|
8
8
|
# Raises an offense if a method returns with a magic number
|
9
9
|
# Catches both explicit and implicit returns
|
10
|
-
class NoReturn < Base
|
10
|
+
class NoReturn < RuboCop::Cop::MagicNumbers::Base
|
11
11
|
MAGIC_NUMBER_RETURN_PATTERN = <<~PATTERN.chomp
|
12
12
|
(%<illegal_scalar_pattern>s _)
|
13
13
|
PATTERN
|
@@ -32,7 +32,7 @@ module RuboCop
|
|
32
32
|
return if allowed_returns.include?(RETURN_TYPE_IMPLICIT)
|
33
33
|
return unless implicit_return?(node.children.last)
|
34
34
|
|
35
|
-
add_offense(node.children.last,
|
35
|
+
add_offense(node.children.last, message: NO_EXPLICIT_RETURN_MSG)
|
36
36
|
end
|
37
37
|
alias on_def on_method_defined
|
38
38
|
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
return if allowed_returns.include?(RETURN_TYPE_EXPLICIT)
|
41
41
|
return unless forbidden_numerics.include?(node.children.first&.type)
|
42
42
|
|
43
|
-
add_offense(node.children.first,
|
43
|
+
add_offense(node.children.first, message: NO_EXPLICIT_RETURN_MSG)
|
44
44
|
end
|
45
45
|
|
46
46
|
private
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-magic_numbers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Morrice
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-06-
|
12
|
+
date: 2023-06-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: parser
|
@@ -49,6 +49,7 @@ extensions: []
|
|
49
49
|
extra_rdoc_files: []
|
50
50
|
files:
|
51
51
|
- README.md
|
52
|
+
- lib/rubocop-magic_numbers.rb
|
52
53
|
- lib/rubocop/cop/magic_numbers/base.rb
|
53
54
|
- lib/rubocop/cop/magic_numbers/no_argument.rb
|
54
55
|
- lib/rubocop/cop/magic_numbers/no_assignment.rb
|