leftovers 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36067c7870efb2d16529b0af04739161fc445c310bd5eab7b4b5ff5ccf556126
4
- data.tar.gz: 5953a6893935af8ac6f1c33afad540c097515a12c4dede73261079cbbd2a561d
3
+ metadata.gz: f2cb691dc74d8b0d43765f899ea718a4d06c1ba8fa36ea3a68c44ece27531920
4
+ data.tar.gz: e24ade3f01a888de2e9438736d71b0e4f2d159a6783b3278e8ec7e58e7c8c626
5
5
  SHA512:
6
- metadata.gz: 70b0cd0d8f3caa5f14282b36bf7f3776a1b0396485a7cfb7fb66460fc3f287edf7ed1d8f733ce303fcb67704c8839df2bb9eb105c761f492b53e1ea575b8f685
7
- data.tar.gz: f43bf9b235fcc43dfdf0d322037523f659214d35387ad788dc5f2c8453a74ef74861db6cca91dc9ae159f8122edcf2fbb6adb9fa107b69e74a753b4e4d286d42
6
+ metadata.gz: a734ec1916762c5bc51fc212bfc254eb3d4083c968e6bcd128aa0c10ee9085762c6edbd86eb8afd3dd17ac5fa8b883d343bf34df3a3caaea1b84db5bc720bfaa
7
+ data.tar.gz: 7b80b90518a6a3e45aa3739394c18f4c7884ea07d75021dc919c62d23d6d110714c9969ab78b8078d6c219bfd9289a821bb4b828bc4e248a82a63f235cb7758f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ # v0.10.0
2
+ - Fixed an issue with t.belongs_to (within the migration generated by rails active_storage:install - thanks @veganstraightedge)
3
+ - this was two issues:
4
+ 1. it was raising an error because the DefinitionNode didn't act enough like an AST::Node, now it does
5
+ 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.
6
+
7
+ - 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.
8
+ - to have the previous behaviour, use the new `has_receiver: { literal: true }` or `literal: false` or `literal: null`
9
+
1
10
  # v0.9.0
2
11
  - Automatically test the config examples in the documentation, and fix the errors
3
12
  - 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
 
@@ -88,6 +88,8 @@ dynamic:
88
88
 
89
89
  # https://edgeapi.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
90
90
  - name: has_one
91
+ unless:
92
+ has_receiver: true
91
93
  defines:
92
94
  argument: 0
93
95
  transforms:
@@ -100,6 +102,8 @@ dynamic:
100
102
 
101
103
  - name: belongs_to
102
104
  has_argument: polymorphic
105
+ unless:
106
+ has_receiver: true
103
107
  defines:
104
108
  argument: 0
105
109
  transforms:
@@ -111,7 +115,9 @@ dynamic:
111
115
 
112
116
  - name: belongs_to
113
117
  unless:
114
- has_argument: polymorphic
118
+ any:
119
+ - has_argument: polymorphic
120
+ - has_receiver: true
115
121
  defines:
116
122
  argument: 0
117
123
  transforms:
@@ -125,6 +131,8 @@ dynamic:
125
131
  - add_suffix: _previously_changed?
126
132
 
127
133
  - name: [has_and_belongs_to_many, has_many]
134
+ unless:
135
+ has_receiver: true
128
136
  defines:
129
137
  argument: 0
130
138
  transforms:
@@ -139,7 +147,9 @@ dynamic:
139
147
  - has_one
140
148
  - belongs_to
141
149
  unless:
142
- has_argument: [class_name, polymorphic]
150
+ any:
151
+ - has_argument: [class_name, polymorphic]
152
+ - has_receiver: true
143
153
  calls:
144
154
  argument: 0
145
155
  camelize: true
@@ -149,7 +159,9 @@ dynamic:
149
159
  - has_many
150
160
  - has_and_belongs_to_many
151
161
  unless:
152
- has_argument: [class_name, polymorphic]
162
+ any:
163
+ - has_argument: [class_name, polymorphic]
164
+ - has_receiver: true
153
165
  calls:
154
166
  - argument: 0
155
167
  camelize: true
@@ -174,9 +186,11 @@ dynamic:
174
186
 
175
187
  - name: belongs_to
176
188
  unless:
177
- has_argument:
178
- at: optional
179
- has_value: true
189
+ any:
190
+ - has_argument:
191
+ at: optional
192
+ has_value: true
193
+ - has_receiver: true
180
194
  calls:
181
195
  argument: 0
182
196
 
@@ -185,6 +199,8 @@ dynamic:
185
199
  - has_many
186
200
  - belongs_to
187
201
  - has_and_belongs_to_many
202
+ unless:
203
+ has_receiver: true
188
204
  calls:
189
205
  - argument: class_name
190
206
  split: '::'
@@ -193,6 +209,8 @@ dynamic:
193
209
  add_suffix: '='
194
210
 
195
211
  - name: belongs_to
212
+ unless:
213
+ has_receiver: true
196
214
  calls:
197
215
  argument: ensuring_owner_was
198
216
 
@@ -202,6 +220,8 @@ dynamic:
202
220
  - has_many
203
221
  - belongs_to
204
222
  - has_and_belongs_to_many
223
+ unless:
224
+ has_receiver: true
205
225
  has_argument:
206
226
  at:
207
227
  - dependent
@@ -219,6 +239,8 @@ dynamic:
219
239
  argument: 0
220
240
 
221
241
  - name: [has_one, has_many, belongs_to, has_and_belongs_to_many]
242
+ unless:
243
+ has_receiver: true
222
244
  calls:
223
245
  argument: [before_add, after_add, before_remove, after_remove]
224
246
  nested: '*'
@@ -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
@@ -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"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- VERSION = '0.9.0'
4
+ VERSION = '0.10.0'
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.10.0
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-05-02 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
@@ -586,7 +588,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
586
588
  - !ruby/object:Gem::Version
587
589
  version: '0'
588
590
  requirements: []
589
- rubygems_version: 3.2.15
591
+ rubyforge_project:
592
+ rubygems_version: 2.7.6
590
593
  signing_key:
591
594
  specification_version: 4
592
595
  summary: Find unused methods and classes/modules