lib/leftovers.rb in leftovers-0.11.1 vs lib/leftovers.rb in leftovers-0.11.2
- old
+ new
@@ -1,155 +1,64 @@
# frozen_string_literal: true
-require 'parser'
-require 'parser/current' # to get the error message early and once.
+module Leftovers
+ require_relative 'leftovers/autoloader'
+ include Autoloader
-module Leftovers # rubocop:disable Metrics/ModuleLength
- class Error < ::StandardError; end
- class UnexpectedCase < Error; end
-
- class PrecompileError < Error
- attr_reader :line, :column
-
- def initialize(message, line: nil, column: nil)
- @line = line
- @column = column
- super(message)
- end
-
- def warn(path:)
- line_column = ":#{line}#{":#{column}" if column}" if line
- klass = cause ? cause.class : self.class
-
- Leftovers.warn "#{klass}: #{path}#{line_column} #{message}"
- end
- end
-
- autoload(:AST, "#{__dir__}/leftovers/ast")
- autoload(:CLI, "#{__dir__}/leftovers/cli")
- autoload(:Collector, "#{__dir__}/leftovers/collector")
- autoload(:ComparableInstance, "#{__dir__}/leftovers/comparable_instance")
- autoload(:ConfigLoader, "#{__dir__}/leftovers/config_loader")
- autoload(:Config, "#{__dir__}/leftovers/config")
- autoload(:Definition, "#{__dir__}/leftovers/definition")
- autoload(:DefinitionCollection, "#{__dir__}/leftovers/definition_collection")
- autoload(:DefinitionNode, "#{__dir__}/leftovers/definition_node")
- autoload(:DefinitionNodeSet, "#{__dir__}/leftovers/definition_node_set")
- autoload(:DefinitionSet, "#{__dir__}/leftovers/definition_set")
- autoload(:DefinitionToAdd, "#{__dir__}/leftovers/definition_to_add")
- autoload(:FileCollector, "#{__dir__}/leftovers/file_collector")
- autoload(:FileList, "#{__dir__}/leftovers/file_list")
- autoload(:File, "#{__dir__}/leftovers/file")
- autoload(:MatcherBuilders, "#{__dir__}/leftovers/matcher_builders")
- autoload(:Matchers, "#{__dir__}/leftovers/matchers")
- autoload(:MergedConfig, "#{__dir__}/leftovers/merged_config")
- autoload(:Parser, "#{__dir__}/leftovers/parser")
- autoload(:Precompilers, "#{__dir__}/leftovers/precompilers")
- autoload(:ProcessorBuilders, "#{__dir__}/leftovers/processor_builders")
- autoload(:RakeTask, "#{__dir__}/leftovers/rake_task")
- autoload(:Reporter, "#{__dir__}/leftovers/reporter")
- autoload(:TodoReporter, "#{__dir__}/leftovers/todo_reporter")
- autoload(:Processors, "#{__dir__}/leftovers/processors")
- autoload(:VERSION, "#{__dir__}/leftovers/version")
-
MEMOIZED_IVARS = %i{
@config
- @collector
- @reporter
- @leftovers
@try_require_cache
@stdout
@stderr
- @parallel
@pwd
- @progress
}.freeze
class << self
- attr_accessor :parallel, :progress
- attr_writer :reporter
- alias_method :parallel?, :parallel
- alias_method :progress?, :progress
+ attr_writer :stdout, :stderr
def stdout
- @stdout ||= $stdout
+ @stdout ||= ::StringIO.new
end
def stderr
- @stderr ||= $stderr
+ @stderr ||= ::StringIO.new
end
def config
- @config ||= Leftovers::MergedConfig.new(load_defaults: true)
+ @config ||= MergedConfig.new(load_defaults: true)
end
- def collector
- @collector ||= Leftovers::Collector.new
- end
-
- def reporter
- @reporter ||= Leftovers::Reporter.new
- end
-
- def leftovers
- @leftovers ||= begin
- collector.collect
- collector.definitions.reject(&:in_collection?)
- end
- end
-
- def run(stdout: StringIO.new, stderr: StringIO.new) # rubocop:disable Metrics/MethodLength
- @stdout = stdout
- @stderr = stderr
- return reporter.report_success if leftovers.empty?
-
- only_test = []
- none = []
- leftovers.sort_by(&:location_s).each do |definition|
- if !definition.test? && definition.in_test_collection?
- only_test << definition
- else
- none << definition
- end
- end
-
- reporter.report(only_test: only_test, none: none)
- end
-
def reset
MEMOIZED_IVARS.each do |ivar|
remove_instance_variable(ivar) if instance_variable_get(ivar)
end
end
def resolution_instructions_link
- "https://github.com/robotdana/leftovers/tree/v#{Leftovers::VERSION}/README.md#how-to-resolve"
+ "https://github.com/robotdana/leftovers/tree/v#{VERSION}/README.md#how-to-resolve"
end
def warn(message)
stderr.puts("\e[2K#{message}")
end
- def error(message)
+ def error(message, did_you_mean = nil)
warn("\e[31m#{message}\e[0m")
+ warn("\n#{did_you_mean}") if did_you_mean
exit 1
end
def puts(message)
stdout.puts("\e[2K#{message}")
end
def print(message)
- stdout.print(message)
+ stdout.print("\e[2K#{message}\r")
end
- def newline
- stdout.puts('')
- end
-
def pwd
- @pwd ||= Pathname.new(Dir.pwd + '/')
+ @pwd ||= ::Pathname.new(::Dir.pwd + '/')
end
def exit(status = 0)
throw :leftovers_exit, status
end
@@ -157,17 +66,15 @@
def try_require(requirable, message: nil)
warn message if !try_require_cache(requirable) && message
try_require_cache(requirable)
end
- def each_or_self(value, &block)
- return enum_for(__method__, value) unless block
-
+ def wrap_array(value)
case value
- when nil then nil
- when Array then value.each(&block)
- else yield(value)
+ when nil then []
+ when ::Array then value
+ else [value]
end
end
def unwrap_array(array)
if array.length <= 1
@@ -183,10 +90,10 @@
@try_require_cache ||= {}
@try_require_cache.fetch(requirable) do
require requirable
@try_require_cache[requirable] = true
- rescue LoadError
+ rescue ::LoadError
@try_require_cache[requirable] = false
end
end
end
end