leftovers 0.9.0 → 0.11.1

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: 36067c7870efb2d16529b0af04739161fc445c310bd5eab7b4b5ff5ccf556126
4
- data.tar.gz: 5953a6893935af8ac6f1c33afad540c097515a12c4dede73261079cbbd2a561d
3
+ metadata.gz: 99d72b44b74c747074583f8c9254872a175563d0f25135b7798c5e76f42c19ef
4
+ data.tar.gz: 6b4bd9219256b8734df956978892da7ffe028e0539367a1f98d46c73912ae79e
5
5
  SHA512:
6
- metadata.gz: 70b0cd0d8f3caa5f14282b36bf7f3776a1b0396485a7cfb7fb66460fc3f287edf7ed1d8f733ce303fcb67704c8839df2bb9eb105c761f492b53e1ea575b8f685
7
- data.tar.gz: f43bf9b235fcc43dfdf0d322037523f659214d35387ad788dc5f2c8453a74ef74861db6cca91dc9ae159f8122edcf2fbb6adb9fa107b69e74a753b4e4d286d42
6
+ metadata.gz: d51c93c652bdd0aa55a176c1600e9d557fd29e7e9726411d7ac6eb086178a655e17e96e8d7530c97945f169d32961649358dd712daf9e50cb82b30caa1b55c10
7
+ data.tar.gz: b8ca04321b17c7d9c9b831f3fb2fab47554d859f910d38f08a04d41f344c4585a1008019af12d13b3e2807027fe6ba7d6fd6a4d1eca3fb947d68d6812249bc39
data/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ # v0.11.1
2
+ - Fixed an issue with parsing files that have `MyConstant ||= value` patterns #19 (thanks for the pr - @kamoh)
3
+
4
+ # v0.11.0
5
+ - Fixed an issue with active_record's `before_save` with multiple callbacks #18, #17 - thanks @palexvs for raising the issue and creating a pr
6
+ - Due to this pr, i reviewed everything else that i think calls `ActiveSupport::Callbacks.set_callback`, and ensured they all:
7
+ - can have multiple args if relevant
8
+ - accept single values and array values for the if/unless args
9
+ - don't eval strings, that's not been a rails feature for a while
10
+ - Fix active_model & active_record validation methods to more comprehensively handle all the keys that could be given symbols of method names, instead of only the documented ones
11
+
12
+ # v0.10.0
13
+ - Fixed an issue with t.belongs_to (within the migration generated by rails active_storage:install - thanks @veganstraightedge)
14
+ - this was two issues:
15
+ 1. it was raising an error because the DefinitionNode didn't act enough like an AST::Node, now it does
16
+ 2. this should never have been defining anything anyway as the activerecord method was being assumed to be used, now if there's an explicit receiver for belongs_to/has_many etc, don't consider them the active record association methods.
17
+
18
+ - now `has_receiver: true` and `has_receiver: false/nil` act differently, they refer to the presence or absence of any receiver, instead of the receiver being literally true or false or nil.
19
+ - to have the previous behaviour, use the new `has_receiver: { literal: true }` or `literal: false` or `literal: null`
20
+
1
21
  # v0.9.0
2
22
  - Automatically test the config examples in the documentation, and fix the errors
3
23
  - simplify the `type: Proc` matcher
@@ -504,7 +504,7 @@ and when used in:
504
504
 
505
505
  It can have any of these properties:
506
506
  - [`at:`](#at)
507
- - [`has_value:`](#has_value_has_receiver)
507
+ - [`has_value:`](#has_value)
508
508
 
509
509
  Arrays are not necessary for single values and if the rule contains only `at:` it can be omitted, and the values moved up a level.
510
510
 
@@ -522,7 +522,7 @@ The method call/constant variable/assignment will be considered matching if it h
522
522
 
523
523
  It can have any of these properties:
524
524
  - [`at:`](#at)
525
- - [`has_value:`](#has_value_has_receiver)
525
+ - [`has_value:`](#has_value)
526
526
 
527
527
  Arrays are not necessary for single values and if the rule contains only `at:` it can be omitted, and the values moved up a level
528
528
 
@@ -603,9 +603,9 @@ dynamic:
603
603
  will match the first argument of anything named my_method or with the receiver MyReceiver, that have both the keyword arguments part_a and part_b
604
604
 
605
605
 
606
- ## `has_value:`, `has_receiver:`
606
+ ## `has_value:`
607
607
 
608
- filter [`arguments:`](#arguments), [`has_arguments:`](#has_arguments), and [`keywords:`](#keywords), by the argument/assigned/receiver value
608
+ filter [`arguments:`](#arguments), [`has_arguments:`](#has_arguments), and [`keywords:`](#keywords), by the argument/assigned value
609
609
 
610
610
  Each entry can be one of
611
611
  - `true`, `false`, `nil`, or an Integer. matches the literal value
@@ -616,11 +616,33 @@ Each entry can be one of
616
616
  - [`matches:`](#matches)
617
617
  - or have at least one of the following properties to match within an array or hash:
618
618
  - [`at`](#at)
619
- - [`has_value`](#has_value_has_receiver)
619
+ - [`has_value`](#has_value)
620
620
  - or have the following property to match the value type
621
621
  - [`type`](#type)
622
622
  - or have the following property to match the receiver
623
- - [`has_receiver`](#has_value_has_receiver)
623
+ - [`has_receiver`](#has_receiver)
624
+
625
+ ## `has_receiver:`
626
+
627
+ filter [`dynamic:`](#dynamic), and [`keep:`](#keep), by the receiver presence or value
628
+
629
+ Each entry can be one of
630
+ - `true`, `false`, matches the presence of any receiver or not
631
+ - an Integer. matches the literal value
632
+ - a String. matches the literal string or symbol value
633
+ - or have at least one of the following properties to match the name:
634
+ - [`has_prefix:`](#has_prefix)
635
+ - [`has_suffix:`](#has_suffix)
636
+ - [`matches:`](#matches)
637
+ - or have at least one of the following properties to match the literal value or match within an array or hash:
638
+ - [`at`](#at)
639
+ - [`has_value`](#has_value)
640
+ - or have the following property to match the value type
641
+ - [`type`](#type)
642
+ - or have the following property to match the receiver of the receiver
643
+ - [`has_receiver`](#has_receiver)
644
+ - or have the following property to match a literal true, false, or nil value:
645
+ - `literal: true`, or `literal: false`, or `literal: nil`
624
646
 
625
647
  ## `privacy:`
626
648
 
@@ -15,7 +15,10 @@ keep:
15
15
  dynamic:
16
16
  # https://api.rubyonrails.org/v7.0.2.2/classes/ActionMailbox/Base.html
17
17
  - names: [before_processing, after_processing, around_processing]
18
- calls: ['*', if, unless]
18
+ calls:
19
+ - arguments: '*'
20
+ - arguments: [if, unless]
21
+ nested: '*'
19
22
 
20
23
  # https://guides.rubyonrails.org/action_mailbox_basics.html#examples
21
24
  # i'm guessing a lot about how this is supposed to work
@@ -26,7 +26,10 @@ dynamic:
26
26
  - before_action
27
27
  - after_action
28
28
  - around_action
29
- calls: ['*', if, unless]
29
+ calls:
30
+ - arguments: '*'
31
+ - arguments: [if, unless]
32
+ nested: '*'
30
33
 
31
34
  # https://guides.rubyonrails.org/action_mailer_basics.html#intercepting-emails
32
35
  - names: interceptors=
@@ -37,21 +37,29 @@ dynamic:
37
37
  - prepend_around_action
38
38
  - prepend_before_action
39
39
  calls:
40
- - arguments: ['*', if, unless]
40
+ - arguments: '*'
41
+ - arguments: [if, unless]
42
+ nested: '*'
41
43
 
42
44
  - names:
43
45
  - skip_after_action
44
46
  - skip_around_action
45
47
  - skip_before_action
46
- calls: [if, unless]
48
+ calls:
49
+ arguments: [if, unless]
50
+ nested: '*'
47
51
 
48
52
  - names: protect_from_forgery
49
- calls: [if, unless]
53
+ calls:
54
+ arguments: [if, unless]
55
+ nested: '*'
50
56
 
51
57
 
52
58
  # https://edgeapi.rubyonrails.org/classes/ActionController/Logging/ClassMethods.html#method-i-log_at
53
59
  - names: log_at
54
- calls: [if, unless]
60
+ calls:
61
+ arguments: [if, unless]
62
+ nested: '*'
55
63
 
56
64
 
57
65
  - name: helper
@@ -23,10 +23,9 @@ dynamic:
23
23
  - around_perform
24
24
  - after_perform
25
25
  calls:
26
- - arguments: 0
26
+ - arguments: '*'
27
27
  - arguments: [if, unless]
28
- nested:
29
- arguments: '*'
28
+ nested: '*'
30
29
 
31
30
  # https://api.rubyonrails.org/v7.0.2.2/classes/ActiveJob/Exceptions/ClassMethods.html#method-i-discard_on
32
31
  # https://api.rubyonrails.org/v7.0.2.2/classes/ActiveJob/Exceptions/ClassMethods.html#method-i-retry_on
@@ -82,25 +82,26 @@ dynamic:
82
82
  - before_validation
83
83
  - after_validation
84
84
  calls:
85
- - arguments: 0
85
+ - arguments: '*'
86
86
  - arguments: [if, unless]
87
- nested:
88
- arguments: '*'
87
+ nested: '*'
89
88
  - name:
90
89
  - validates_associated
91
90
  calls:
92
- - arguments: ['*', if, unless]
91
+ - arguments: '*'
92
+ - arguments: [if, unless]
93
+ nested: '*'
94
+
93
95
  # https://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates
94
96
  - name: [validates, validates!]
95
97
  calls:
96
98
  - arguments:
97
99
  - '*'
100
+ - 'in'
98
101
  - within
99
- - inclusion
100
- - exclusion
101
102
  - scope
102
- - if
103
- - unless
103
+ - with
104
+ - without
104
105
  - arguments: [if, unless]
105
106
  nested: '*'
106
107
  - arguments: [inclusion, exclusion]
@@ -108,6 +109,17 @@ dynamic:
108
109
  arguments:
109
110
  - 'in'
110
111
  - within
112
+ - arguments: format
113
+ nested:
114
+ arguments:
115
+ - with
116
+ - without
117
+ - arguments: length
118
+ nested:
119
+ arguments:
120
+ - is
121
+ - minimum
122
+ - maximum
111
123
  - arguments: [comparison, numericality]
112
124
  nested:
113
125
  arguments:
@@ -118,14 +130,10 @@ dynamic:
118
130
  - less_than_or_equal_to
119
131
  - other_than
120
132
  - keywords:
121
- unless: [if, unless]
133
+ unless: [if, unless, 'on', allow_blank, allow_nil, strict]
122
134
  camelize: true
123
135
  add_suffix: Validator
124
136
  split: '::'
125
- eval:
126
- - arguments: [if, unless]
127
- - arguments: [if, unless]
128
- nested: '*'
129
137
 
130
138
  - name: validates_confirmation_of
131
139
  calls:
@@ -139,10 +147,9 @@ dynamic:
139
147
  argument: '*'
140
148
  add_suffix: _confirmation
141
149
 
142
- - name: validates_comparison_of
150
+ - name: [validates_comparison_of, validates_numericality_of]
143
151
  calls:
144
152
  argument:
145
- - '*'
146
153
  - greater_than
147
154
  - greater_than_or_equal_to
148
155
  - equal_to
@@ -150,13 +157,24 @@ dynamic:
150
157
  - less_than_or_equal_to
151
158
  - other_than
152
159
 
160
+ # why!?
161
+ - name: validates_numericality_of
162
+ calls:
163
+ argument:
164
+ - only_integer
165
+
153
166
  - name: [validates_exclusion_of, validates_inclusion_of]
154
167
  calls:
155
168
  argument:
156
- - '*'
157
169
  - 'in'
158
170
  - within
159
171
 
172
+ - name: validates_length_of
173
+ calls: [is, minimum, maximum]
174
+
175
+ - name: validates_format_of
176
+ calls: [with, without]
177
+
160
178
  - name:
161
179
  - validates_absence_of
162
180
  - validates_acceptance_of
@@ -170,9 +188,7 @@ dynamic:
170
188
  - validates_presence_of
171
189
  - validates_size_of
172
190
  calls:
173
- - arguments: ['*', if, unless]
174
- eval:
175
- - arguments: [if, unless]
191
+ - arguments: '*'
176
192
  - arguments: [if, unless]
177
193
  nested: '*'
178
194
 
@@ -183,9 +199,7 @@ dynamic:
183
199
  - validate_associated
184
200
  - validates_each
185
201
  calls:
186
- - arguments: ['*', if, unless]
187
- eval:
188
- - arguments: [if, unless]
202
+ - arguments: '*'
189
203
  - arguments: [if, unless]
190
204
  nested: '*'
191
205
 
@@ -193,10 +207,7 @@ dynamic:
193
207
  - name: validates_with
194
208
  calls:
195
209
  arguments: [if, unless]
196
- eval:
197
- - arguments: [if, unless]
198
- - arguments: [if, unless]
199
- nested: '*'
210
+ nested: '*'
200
211
 
201
212
  # https://api.rubyonrails.org/classes/ActiveModel/AttributeMethods/ClassMethods.html#method-i-alias_attribute
202
213
  # https://api.rubyonrails.org/classes/ActiveModel/Dirty.html
@@ -22,7 +22,23 @@ dynamic:
22
22
  - validates_numericality_of
23
23
  - validates_presence_of
24
24
  - validates_uniqueness_of
25
- calls: ['*', if, unless]
25
+ calls:
26
+ - arguments: '*'
27
+ - arguments: [if, unless]
28
+ nested: '*'
29
+
30
+ - name: validates_uniqueness_of
31
+ calls:
32
+ arguments: scope
33
+ nested: '*'
34
+
35
+ - name: [validates, validates!]
36
+ calls:
37
+ - arguments: scope
38
+ - arguments: uniqueness
39
+ nested:
40
+ arguments: scope
41
+ nested: '*'
26
42
 
27
43
  # https://edgeapi.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html
28
44
  # i had to read the code for this
@@ -88,6 +104,8 @@ dynamic:
88
104
 
89
105
  # https://edgeapi.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
90
106
  - name: has_one
107
+ unless:
108
+ has_receiver: true
91
109
  defines:
92
110
  argument: 0
93
111
  transforms:
@@ -100,6 +118,8 @@ dynamic:
100
118
 
101
119
  - name: belongs_to
102
120
  has_argument: polymorphic
121
+ unless:
122
+ has_receiver: true
103
123
  defines:
104
124
  argument: 0
105
125
  transforms:
@@ -111,7 +131,9 @@ dynamic:
111
131
 
112
132
  - name: belongs_to
113
133
  unless:
114
- has_argument: polymorphic
134
+ any:
135
+ - has_argument: polymorphic
136
+ - has_receiver: true
115
137
  defines:
116
138
  argument: 0
117
139
  transforms:
@@ -125,6 +147,8 @@ dynamic:
125
147
  - add_suffix: _previously_changed?
126
148
 
127
149
  - name: [has_and_belongs_to_many, has_many]
150
+ unless:
151
+ has_receiver: true
128
152
  defines:
129
153
  argument: 0
130
154
  transforms:
@@ -139,7 +163,9 @@ dynamic:
139
163
  - has_one
140
164
  - belongs_to
141
165
  unless:
142
- has_argument: [class_name, polymorphic]
166
+ any:
167
+ - has_argument: [class_name, polymorphic]
168
+ - has_receiver: true
143
169
  calls:
144
170
  argument: 0
145
171
  camelize: true
@@ -149,7 +175,9 @@ dynamic:
149
175
  - has_many
150
176
  - has_and_belongs_to_many
151
177
  unless:
152
- has_argument: [class_name, polymorphic]
178
+ any:
179
+ - has_argument: [class_name, polymorphic]
180
+ - has_receiver: true
153
181
  calls:
154
182
  - argument: 0
155
183
  camelize: true
@@ -174,9 +202,11 @@ dynamic:
174
202
 
175
203
  - name: belongs_to
176
204
  unless:
177
- has_argument:
178
- at: optional
179
- has_value: true
205
+ any:
206
+ - has_argument:
207
+ at: optional
208
+ has_value: true
209
+ - has_receiver: true
180
210
  calls:
181
211
  argument: 0
182
212
 
@@ -185,6 +215,8 @@ dynamic:
185
215
  - has_many
186
216
  - belongs_to
187
217
  - has_and_belongs_to_many
218
+ unless:
219
+ has_receiver: true
188
220
  calls:
189
221
  - argument: class_name
190
222
  split: '::'
@@ -193,6 +225,8 @@ dynamic:
193
225
  add_suffix: '='
194
226
 
195
227
  - name: belongs_to
228
+ unless:
229
+ has_receiver: true
196
230
  calls:
197
231
  argument: ensuring_owner_was
198
232
 
@@ -202,6 +236,8 @@ dynamic:
202
236
  - has_many
203
237
  - belongs_to
204
238
  - has_and_belongs_to_many
239
+ unless:
240
+ has_receiver: true
205
241
  has_argument:
206
242
  at:
207
243
  - dependent
@@ -219,6 +255,8 @@ dynamic:
219
255
  argument: 0
220
256
 
221
257
  - name: [has_one, has_many, belongs_to, has_and_belongs_to_many]
258
+ unless:
259
+ has_receiver: true
222
260
  calls:
223
261
  argument: [before_add, after_add, before_remove, after_remove]
224
262
  nested: '*'
@@ -345,10 +383,9 @@ dynamic:
345
383
  - before_save
346
384
  - before_update
347
385
  calls:
348
- - arguments: 0
386
+ - arguments: '*'
349
387
  - arguments: [if, unless]
350
- nested:
351
- arguments: '*'
388
+ nested: '*'
352
389
 
353
390
  - name:
354
391
  - includes
@@ -146,8 +146,12 @@ dynamic:
146
146
 
147
147
  # https://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method-i-set_callback
148
148
  - name: set_callback
149
- calls: [2, if, unless]
149
+ calls:
150
+ - arguments: '2+'
151
+ - arguments: [if, unless]
152
+ nested: '*'
150
153
 
154
+ # The second argument indicates whether the callback is to be run :before, :after, or :around the event. If omitted, :before is assumed.
151
155
  - name: set_callback
152
156
  calls: 1
153
157
  unless:
@@ -156,7 +160,9 @@ dynamic:
156
160
 
157
161
  # https://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method-i-skip_callback
158
162
  - name: skip_callback
159
- calls: [if, unless]
163
+ calls:
164
+ arguments: [if, unless]
165
+ nested: '*'
160
166
 
161
167
  # https://api.rubyonrails.org/classes/ActiveSupport/Configurable/ClassMethods.html#method-i-config_accessor
162
168
  - name: config_accessor
@@ -203,7 +209,11 @@ dynamic:
203
209
  # https://api.rubyonrails.org/classes/ActiveSupport/Reloader.html#method-c-to_prepare
204
210
  # this is not well documented but uses set_callback internally so we can just guess
205
211
  - name: [before_class_unload, after_class_unload, to_prepare]
206
- calls: [0, if, unless]
212
+ calls:
213
+ - arguments: '*'
214
+ - arguments: [if, unless]
215
+ nested:
216
+ arguments: '*'
207
217
 
208
218
  # https://api.rubyonrails.org/classes/Module/Concerning.html#method-i-concern
209
219
  - name: concern
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ class ConfigLoader
5
+ class HasReceiverSchema < ValueOrObjectSchema
6
+ inherit_attributes_from HasValueSchema, except: :unless
7
+
8
+ attribute :literal, ValueOrArraySchema[ScalarValueSchema],
9
+ require_group: :matcher
10
+ attribute :unless, ValueOrArraySchema[HasReceiverSchema], require_group: :matcher
11
+
12
+ self.or_value_schema = ScalarValueSchema
13
+ end
14
+ end
15
+ end
@@ -12,7 +12,7 @@ module Leftovers
12
12
  attribute :at, ValueOrArraySchema[ArgumentPositionSchema], require_group: :matcher
13
13
  attribute :has_value, ValueOrArraySchema[HasValueSchema], require_group: :matcher
14
14
 
15
- attribute :has_receiver, ValueOrArraySchema[HasValueSchema], require_group: :matcher
15
+ attribute :has_receiver, ValueOrArraySchema[HasReceiverSchema], require_group: :matcher
16
16
  attribute :type, ValueOrArraySchema[ValueTypeSchema], require_group: :matcher
17
17
  attribute :unless, ValueOrArraySchema[HasValueSchema], require_group: :matcher
18
18
 
@@ -9,7 +9,7 @@ module Leftovers
9
9
  attribute :document, TrueSchema, require_group: :matcher
10
10
  attribute :has_arguments, ValueOrArraySchema[HasArgumentSchema], aliases: :has_argument,
11
11
  require_group: :matcher
12
- attribute :has_receiver, ValueOrArraySchema[HasValueSchema], require_group: :matcher
12
+ attribute :has_receiver, ValueOrArraySchema[HasReceiverSchema], require_group: :matcher
13
13
  attribute :type, ValueOrArraySchema[ValueTypeSchema], require_group: :matcher
14
14
  attribute :privacy, ValueOrArraySchema[PrivacySchema], require_group: :matcher
15
15
  attribute :unless, ValueOrArraySchema[RulePatternSchema], require_group: :matcher
@@ -4,7 +4,7 @@ module Leftovers
4
4
  class ConfigLoader
5
5
  class ValueMatcherConditionSchema < ObjectSchema
6
6
  attribute :has_arguments, ValueOrArraySchema[HasArgumentSchema], aliases: :has_argument
7
- attribute :has_receiver, ValueOrArraySchema[HasValueSchema]
7
+ attribute :has_receiver, ValueOrArraySchema[HasReceiverSchema]
8
8
  attribute :unless, ValueOrArraySchema[ValueMatcherConditionSchema]
9
9
  attribute :all, ArraySchema[ValueMatcherConditionSchema]
10
10
  attribute :any, ArraySchema[ValueMatcherConditionSchema]
@@ -13,6 +13,7 @@ module Leftovers
13
13
  autoload(:DynamicSchema, "#{__dir__}/config_loader/dynamic_schema")
14
14
  autoload(:HasArgumentSchema, "#{__dir__}/config_loader/has_argument_schema")
15
15
  autoload(:HasValueSchema, "#{__dir__}/config_loader/has_value_schema")
16
+ autoload(:HasReceiverSchema, "#{__dir__}/config_loader/has_receiver_schema")
16
17
  autoload(:InheritSchemaAttributes, "#{__dir__}/config_loader/inherit_schema_attributes")
17
18
  autoload(:KeepTestOnlySchema, "#{__dir__}/config_loader/keep_test_only_schema")
18
19
  autoload(:KeywordArgumentSchema, "#{__dir__}/config_loader/keyword_argument_schema")
@@ -1,25 +1,19 @@
1
1
  # frozen-string-literal: true
2
2
 
3
3
  module Leftovers
4
- class DefinitionNode
5
- attr_reader :name, :loc, :node
4
+ class DefinitionNode < ::Leftovers::AST::Node
5
+ attr_reader :name, :path
6
+ alias_method :to_sym, :name
6
7
 
7
8
  def initialize(node, name:, location: node.loc.expression)
8
- @node = node
9
9
  @name = name
10
- @loc = location
10
+ @path = node.path
11
+ @location = location
12
+ super(:leftovers_definition)
11
13
  end
12
14
 
13
- def kwargs
14
- nil
15
- end
16
-
17
- def positional_arguments
18
- nil
19
- end
20
-
21
- def path
22
- node.path
15
+ def to_s
16
+ name.to_s
23
17
  end
24
18
  end
25
19
  end
@@ -110,6 +110,7 @@ module Leftovers
110
110
  alias_method :on_module, :on_class
111
111
 
112
112
  # grab Constant = Class.new or CONSTANT = 'string'.freeze
113
+ # or Constant ||= Class.new
113
114
  def on_casgn(node)
114
115
  super
115
116
 
@@ -96,8 +96,9 @@ module Leftovers
96
96
  # just collects the :call=, super will collect the :call
97
97
  when :send, :csend then calls << :"#{node.name}="
98
98
  # just collects the call, super will collect the definition
99
- when :ivasgn, :gvasgn, :cvasgn then calls << node.name
100
- when :lvasgn then nil # we don't care about lvasgn
99
+ when :ivasgn, :gvasgn, :cvasgn, :casgn then calls << node.name
100
+ when :lvasgn then nil # we don't check local variable use, rubocop already covers this
101
+
101
102
  # :nocov:
102
103
  else raise Leftovers::UnexpectedCase, "Unhandled value #{node.type.inspect}"
103
104
  # :nocov:
@@ -4,10 +4,19 @@ module Leftovers
4
4
  module MatcherBuilders
5
5
  module NodeHasReceiver
6
6
  class << self
7
- def build(pattern)
8
- matcher = ::Leftovers::MatcherBuilders::NodeValue.build(pattern)
7
+ def build(pattern) # rubocop:disable Metrics/MethodLength
8
+ case pattern
9
+ when true
10
+ ::Leftovers::Matchers::NodeHasAnyReceiver
11
+ when false, :_leftovers_nil_value
12
+ ::Leftovers::Matchers::Not.new(
13
+ ::Leftovers::Matchers::NodeHasAnyReceiver
14
+ )
15
+ else
16
+ matcher = ::Leftovers::MatcherBuilders::NodeValue.build(pattern)
9
17
 
10
- ::Leftovers::Matchers::NodeHasReceiver.new(matcher) if matcher
18
+ ::Leftovers::Matchers::NodeHasReceiver.new(matcher) if matcher
19
+ end
11
20
  end
12
21
  end
13
22
  end
@@ -53,6 +53,7 @@ module Leftovers
53
53
  names: nil, match: nil, has_prefix: nil, has_suffix: nil,
54
54
  type: nil,
55
55
  has_receiver: nil,
56
+ literal: nil,
56
57
  unless_arg: nil
57
58
  )
58
59
  ::Leftovers::MatcherBuilders::And.build([
@@ -60,6 +61,7 @@ module Leftovers
60
61
  build_node_name_matcher(names, match, has_prefix, has_suffix),
61
62
  ::Leftovers::MatcherBuilders::NodeType.build(type),
62
63
  ::Leftovers::MatcherBuilders::NodeHasReceiver.build(has_receiver),
64
+ ::Leftovers::MatcherBuilders::NodeValue.build(literal),
63
65
  build_unless(unless_arg)
64
66
  ])
65
67
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Matchers
5
+ module NodeHasAnyReceiver
6
+ def self.===(node)
7
+ node.receiver
8
+ end
9
+
10
+ freeze
11
+ end
12
+ end
13
+ end
@@ -10,6 +10,7 @@ module Leftovers
10
10
  :NodeHasAnyPositionalArgumentWithValue,
11
11
  "#{__dir__}/matchers/node_has_any_positional_argument_with_value"
12
12
  )
13
+ autoload(:NodeHasAnyReceiver, "#{__dir__}/matchers/node_has_any_receiver")
13
14
  autoload(
14
15
  :NodeHasPositionalArgumentWithValue,
15
16
  "#{__dir__}/matchers/node_has_positional_argument_with_value"
@@ -35,8 +35,8 @@ module Leftovers
35
35
  end
36
36
 
37
37
  def print_definition(definition)
38
- puts "#{aqua definition.location_s} "\
39
- "#{definition} "\
38
+ puts "#{aqua definition.location_s} " \
39
+ "#{definition} " \
40
40
  "#{grey definition.highlighted_source("\e[33m", "\e[0;2m")}"
41
41
  end
42
42
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- VERSION = '0.9.0'
4
+ VERSION = '0.11.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leftovers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dana Sherson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-15 00:00:00.000000000 Z
11
+ date: 2022-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -409,6 +409,7 @@ files:
409
409
  - lib/leftovers/config_loader/document_schema.rb
410
410
  - lib/leftovers/config_loader/dynamic_schema.rb
411
411
  - lib/leftovers/config_loader/has_argument_schema.rb
412
+ - lib/leftovers/config_loader/has_receiver_schema.rb
412
413
  - lib/leftovers/config_loader/has_value_schema.rb
413
414
  - lib/leftovers/config_loader/inherit_schema_attributes.rb
414
415
  - lib/leftovers/config_loader/keep_test_only_schema.rb
@@ -477,6 +478,7 @@ files:
477
478
  - lib/leftovers/matchers/any.rb
478
479
  - lib/leftovers/matchers/node_has_any_keyword_argument.rb
479
480
  - lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb
481
+ - lib/leftovers/matchers/node_has_any_receiver.rb
480
482
  - lib/leftovers/matchers/node_has_positional_argument.rb
481
483
  - lib/leftovers/matchers/node_has_positional_argument_with_value.rb
482
484
  - lib/leftovers/matchers/node_has_receiver.rb