leftovers 0.11.2 → 0.12.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: 315c6cd9bf74247b3a2833ab260854e397d8cc24bee3c12f3bc56d6d63e1c126
4
- data.tar.gz: 8f2c20446893d35ca268b7506f34e164038c86860c1ffa3bce5e94b83058a188
3
+ metadata.gz: 7e52a1e28bb2607d09a74d36c1602a7bdbabd0f7ec58f542bd836b1d509f9c8a
4
+ data.tar.gz: 73df5d8f0694d5bd44c6a99f9268f64474cebc4f1097a2261233fee3596e235f
5
5
  SHA512:
6
- metadata.gz: 8e9461b01555758b8f7f5de3c15e262fff559aaffc1045d9cfb0c121e68822a8ad4187599eae19154758f1418ec8fd859b2ccf47839b4831d4caab5f26662d53
7
- data.tar.gz: 81ee36d822947afbb3b626b9b09363b1ae9528aead85ac0312f80e7f07cc6867a0ef575255c02d723fa0f0dc46042b161d337cd3f5ee6a71e9075dc5eaec19f8
6
+ metadata.gz: 07a7d1443f20c26d39b3e030fc86469435fb6a067fb292d6c2c5bef8b4f7a34f19f7899c20c4d38f588612f6ea0b4e028d74319879cb14a7fa043deaf1ef7566
7
+ data.tar.gz: 1ab0edb8d8382e3c4fdef6cbd5dc78c57cd87a391baba773f1ced92fb3080528f8a80dd642c4c4f1db9c08c863b2532079d8bd764931b4b659a4e12d61fe357a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # v0.12.1
2
+
3
+ - handle anonymous block arguments e.g. `def method(&); other_method(&); end`. thanks @sclarsen and @orien and @juanlujoanne
4
+
5
+ # v0.12.0
6
+ - improve error handling when a file can't be processed
7
+ - fail rather than warn when encountering a syntax error in a file being processed
8
+
1
9
  # v0.11.2
2
10
 
3
11
  - add `has_block: true/false` for matching method calls with a block.
data/lib/leftovers/cli.rb CHANGED
@@ -9,11 +9,14 @@ module Leftovers
9
9
  end
10
10
 
11
11
  def run
12
- catch(:leftovers_exit) do
13
- parse_options
14
-
15
- runner.run
16
- end
12
+ parse_options
13
+
14
+ runner.run
15
+ rescue ::Leftovers::Error => e
16
+ Leftovers.warn("\e[31m#{e.class}: #{e.message}\e[0m\n\n#{e.backtrace.join("\n")}")
17
+ 1
18
+ rescue ::Leftovers::Exit => e
19
+ e.status # what why?
17
20
  end
18
21
 
19
22
  private
@@ -59,8 +59,8 @@ module Leftovers
59
59
  end
60
60
 
61
61
  def freeze_calls
62
- @calls = @calls.to_set.freeze
63
- @test_calls = @test_calls.to_set.freeze
62
+ @calls = @calls.to_set.compare_by_identity.freeze
63
+ @test_calls = @test_calls.to_set.compare_by_identity.freeze
64
64
  end
65
65
  end
66
66
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ class FileCollector
5
+ class NodeProcessor
6
+ class Error < ::Leftovers::FileCollector::Error
7
+ attr_reader :node
8
+
9
+ def initialize(message, node)
10
+ super(message)
11
+ @node = node
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -4,7 +4,17 @@ require 'parser'
4
4
 
5
5
  module Leftovers
6
6
  class FileCollector
7
- class NodeProcessor < ::Parser::AST::Processor
7
+ class NodeProcessor < ::Parser::AST::Processor # rubocop:disable Metrics/ClassLength
8
+ include Autoloader
9
+
10
+ def process(ast)
11
+ super
12
+ rescue FileCollector::Error
13
+ raise
14
+ rescue StandardError => e
15
+ raise Error.new(e.message, ast)
16
+ end
17
+
8
18
  def initialize(collector) # rubocop:disable Lint/MissingSuper # there isn't one to call
9
19
  @collector = collector
10
20
  end
@@ -100,7 +110,7 @@ module Leftovers
100
110
  # grab e.g. :to_s in each(&:to_s)
101
111
  def on_block_pass(node)
102
112
  super
103
- return unless node.first.sym?
113
+ return unless node.first&.sym?
104
114
 
105
115
  @collector.calls << node.first.to_sym
106
116
  end
@@ -4,6 +4,8 @@ require 'set'
4
4
 
5
5
  module Leftovers
6
6
  class FileCollector
7
+ class Error < ::Leftovers::Error; end
8
+
7
9
  include Autoloader
8
10
 
9
11
  attr_reader :calls, :allow_lines, :test_lines, :dynamic_lines
@@ -35,15 +37,27 @@ module Leftovers
35
37
  list
36
38
  end
37
39
 
38
- def collect(ruby = @ruby, line = 1)
40
+ def collect(ruby = @ruby, line = 1) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
39
41
  ast, comments = Parser.parse_with_comments(ruby, @file.relative_path, line)
40
42
  CommentsProcessor.process(comments, self)
41
43
  NodeProcessor.new(self).process(ast)
42
44
  rescue ::Parser::SyntaxError => e
43
- ::Leftovers.warn(
44
- "\e[31m#{filename}:#{e.diagnostic.location.line}:#{e.diagnostic.location.column} " \
45
- "SyntaxError: #{e.message}\e[0m"
46
- )
45
+ raise Error, <<~MESSAGE.chomp, e.backtrace
46
+ SyntaxError: #{e.message}
47
+ when processing #{filename}:#{e.diagnostic.location.line}:#{e.diagnostic.location.column}
48
+ MESSAGE
49
+ rescue NodeProcessor::Error => e
50
+ raise Error, <<~MESSAGE.chomp, e.backtrace
51
+ #{e.cause.class}: #{e.message}
52
+ when processing #{e.node} at #{filename}:#{e.node.loc.line}:#{e.node.loc.column}
53
+ MESSAGE
54
+ rescue Error
55
+ raise
56
+ rescue ::StandardError => e
57
+ raise Error, <<~MESSAGE.chomp, e.backtrace
58
+ #{e.class}: #{e.message}
59
+ when processing #{filename}
60
+ MESSAGE
47
61
  end
48
62
 
49
63
  def collect_subfile(string, location)
@@ -112,9 +126,6 @@ module Leftovers
112
126
 
113
127
  def collect_dynamic(node)
114
128
  ::Leftovers.config.dynamic.process(nil, node, node, self)
115
- rescue ::StandardError => e
116
- raise Error, "#{e.class}: #{e.message}\n" \
117
- "when processing #{node} at #{filename}:#{node.loc.line}:#{node.loc.column}", e.backtrace
118
129
  end
119
130
 
120
131
  private
@@ -15,8 +15,14 @@ module Leftovers
15
15
  when :Array then Matchers::NodeType.new(:array)
16
16
  when :Hash then Matchers::NodeType.new(:hash)
17
17
  when :Proc then Matchers::NodeIsProc
18
- when :Method then Matchers::NodeType.new(::Set[:send, :csend, :def, :defs])
19
- when :Constant then Matchers::NodeType.new(::Set[:const, :class, :module, :casgn])
18
+ when :Method
19
+ Matchers::NodeType.new(
20
+ ::Set[:send, :csend, :def, :defs].compare_by_identity.freeze
21
+ )
22
+ when :Constant
23
+ Matchers::NodeType.new(
24
+ ::Set[:const, :class, :module, :casgn].compare_by_identity.freeze
25
+ )
20
26
  # :nocov:
21
27
  else raise UnexpectedCase, "Unhandled value #{type.inspect}"
22
28
  # :nocov:
@@ -66,7 +66,7 @@ module Leftovers
66
66
  end
67
67
 
68
68
  def build_grouped(set: nil, regexp: nil, nil: nil, **matcher_classes) # rubocop:disable Lint/UnusedMethodArgument i want to throw away nils
69
- set = set.to_set.compare_by_identity if set.is_a?(::Array)
69
+ set = set.to_set.compare_by_identity.freeze if set.is_a?(::Array)
70
70
  regexp = ::Regexp.union(regexp) if regexp.is_a?(::Array)
71
71
  matcher_classes = matcher_classes.each_value.flat_map do |matchers|
72
72
  build_grouped_for_matcher(matchers)
@@ -17,7 +17,7 @@ module Leftovers
17
17
 
18
18
  def initialize(load_defaults: false)
19
19
  @configs = []
20
- @loaded_configs = ::Set.new
20
+ @loaded_configs = ::Set.new.compare_by_identity
21
21
  return unless load_defaults
22
22
 
23
23
  self << :ruby
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- VERSION = '0.11.2'
4
+ VERSION = '0.12.1'
5
5
  end
data/lib/leftovers.rb CHANGED
@@ -1,6 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
+ class Exit < ::StandardError
5
+ attr_reader :status
6
+
7
+ def initialize(status) # rubocop:disable Lint/MissingSuper
8
+ @status = status
9
+ end
10
+ end
11
+
4
12
  require_relative 'leftovers/autoloader'
5
13
  include Autoloader
6
14
 
@@ -44,7 +52,7 @@ module Leftovers
44
52
  def error(message, did_you_mean = nil)
45
53
  warn("\e[31m#{message}\e[0m")
46
54
  warn("\n#{did_you_mean}") if did_you_mean
47
- exit 1
55
+ raise Exit, 1
48
56
  end
49
57
 
50
58
  def puts(message)
@@ -60,7 +68,7 @@ module Leftovers
60
68
  end
61
69
 
62
70
  def exit(status = 0)
63
- throw :leftovers_exit, status
71
+ raise Exit, status
64
72
  end
65
73
 
66
74
  def try_require(requirable, message: nil)
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.11.2
4
+ version: 0.12.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-11-12 00:00:00.000000000 Z
11
+ date: 2023-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -439,6 +439,7 @@ files:
439
439
  - lib/leftovers/file_collector.rb
440
440
  - lib/leftovers/file_collector/comments_processor.rb
441
441
  - lib/leftovers/file_collector/node_processor.rb
442
+ - lib/leftovers/file_collector/node_processor/error.rb
442
443
  - lib/leftovers/file_list.rb
443
444
  - lib/leftovers/matcher_builders.rb
444
445
  - lib/leftovers/matcher_builders/and.rb
@@ -584,7 +585,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
584
585
  - !ruby/object:Gem::Version
585
586
  version: '0'
586
587
  requirements: []
587
- rubygems_version: 3.2.15
588
+ rubygems_version: 3.1.6
588
589
  signing_key:
589
590
  specification_version: 4
590
591
  summary: Find unused methods and classes/modules