lib/spoom/cli/deadcode.rb in spoom-1.3.2 vs lib/spoom/cli/deadcode.rb in spoom-1.3.3

- old
+ new

@@ -22,11 +22,11 @@ default: ["text/x-ruby", "text/x-ruby-script"], aliases: :m, desc: "Allowed mime types" option :exclude, type: :array, - default: ["vendor/", "sorbet/"], + default: ["vendor/", "sorbet/", "tmp/", "log/", "node_modules/"], aliases: :x, desc: "Exclude paths" option :show_files, type: :boolean, default: false, @@ -56,11 +56,13 @@ $stderr.puts "Collecting files..." collector = FileCollector.new( allow_extensions: options[:allowed_extensions], allow_mime_types: options[:allowed_mime_types], - exclude_patterns: options[:exclude].map { |p| Pathname.new(File.join(exec_path, p, "**")).cleanpath.to_s }, + exclude_patterns: paths.flat_map do |path| + options[:exclude].map { |excluded| Pathname.new(File.join(path, excluded, "**")).cleanpath.to_s } + end, ) collector.visit_paths(paths) files = collector.files.sort if options[:show_files] @@ -69,36 +71,39 @@ $stderr.puts " #{gray(file)}" end $stderr.puts end - plugins = Spoom::Deadcode.plugins_from_gemfile_lock(context) + plugin_classes = Spoom::Deadcode.plugins_from_gemfile_lock(context) + plugin_classes.merge(Spoom::Deadcode.load_custom_plugins(context)) if options[:show_plugins] - $stderr.puts "\nLoaded #{blue(plugins.size.to_s)} plugins\n" - plugins.each do |plugin| - $stderr.puts " #{gray(plugin.class.to_s)}" + $stderr.puts "\nLoaded #{blue(plugin_classes.size.to_s)} plugins\n" + plugin_classes.each do |plugin| + $stderr.puts " #{gray(plugin.to_s)}" end $stderr.puts end - index = Spoom::Deadcode::Index.new + model = Spoom::Model.new + index = Spoom::Deadcode::Index.new(model) + plugins = plugin_classes.map { |plugin| plugin.new(index) } $stderr.puts "Indexing #{blue(files.size.to_s)} files..." files.each do |file| - content = File.read(file) - content = ERB.new(content).src if file.end_with?(".erb") - - tree = Spoom::Deadcode.parse_ruby(content, file: file) - Spoom::Deadcode.index_node(index, tree, content, file: file, plugins: plugins) - rescue Spoom::Deadcode::ParserError => e + index.index_file(file, plugins: plugins) + rescue ParseError => e say_error("Error parsing #{file}: #{e.message}") next - rescue Spoom::Deadcode::IndexerError => e + rescue Spoom::Deadcode::Index::Error => e say_error("Error indexing #{file}: #{e.message}") next end + model.finalize! + index.apply_plugins!(plugins) + index.finalize! + if options[:show_defs] $stderr.puts "\nDefinitions:" index.definitions.each do |name, definitions| $stderr.puts " #{blue(name)}" definitions.each do |definition| @@ -121,11 +126,10 @@ definitions_count = index.definitions.size.to_s references_count = index.references.size.to_s $stderr.puts "Analyzing #{blue(definitions_count)} definitions against #{blue(references_count)} references..." - index.finalize! dead = index.definitions.values.flatten.select(&:dead?) if options[:sort] == "name" dead.sort_by!(&:name) else @@ -146,11 +150,11 @@ end end desc "remove LOCATION", "Remove dead code at LOCATION" def remove(location_string) - location = Spoom::Deadcode::Location.from_string(location_string) + location = Location.from_string(location_string) context = self.context remover = Spoom::Deadcode::Remover.new(context) new_source = remover.remove_location(nil, location) context.write!("PATCH", new_source) @@ -161,10 +165,10 @@ context.write!(location.file, new_source) rescue Spoom::Deadcode::Remover::Error => e say_error("Can't remove code at #{location_string}: #{e.message}") exit(1) - rescue Spoom::Deadcode::Location::LocationError => e + rescue Location::LocationError => e say_error(e.message) exit(1) end end end