diff --git a/lib/pessimize/gemspec.rb b/lib/pessimize/gemspec.rb new file mode 100644 index 0000000..590ee36 --- /dev/null +++ b/lib/pessimize/gemspec.rb @@ -0,0 +1,27 @@ +require 'pessimize/gemfile' + +module Pessimize + class Gemspec < Gemfile + protected + + def parse_gems_from_tokens! + enum = tokens.each_with_index + + loop do + (tok, i) = enum.next + + if tok[1] == :on_ident && (tok[2] == "add_dependency" || tok[2] == "add_development_dependency") + gem_toks = [] + until all_gem_tokens_collected?(tok[0], enum.peek[0]) + (tok, j) = enum.next + gem_toks << tok + end + + self.gems << Pessimize::Gem.new(gem_toks) + self.gem_token_map << [i + 1, j] + end + end + rescue StopIteration + end + end +end diff --git a/lib/pessimize/pessimizer.rb b/lib/pessimize/pessimizer.rb index 31eb5b9..b3bcdee 100644 --- a/lib/pessimize/pessimizer.rb +++ b/lib/pessimize/pessimizer.rb @@ -1,4 +1,5 @@ require 'pessimize/gemfile' +require 'pessimize/gemspec' require 'pessimize/gemfile_lock_version_parser' require 'pessimize/version_mapper' @@ -13,7 +14,8 @@ def initialize(file_manager, options) def run collect_gems_and_versions update_gem_versions - write_new_gemfile + puts gemfile.to_s + # write_new_gemfile puts "~> written #{gemfile.gems.length} gems to Gemfile, constrained to #{options[:version_constraint]} version updates\n\n" end @@ -24,8 +26,16 @@ def sep(num = 1) "\n" * num end + def file_to_pessimize + if options[:gemspec] + Gemspec.new(File.read(options[:gemspec])) + else + Gemfile.new(file_manager.gemfile_contents) + end + end + def collect_gems_and_versions - self.gemfile = Gemfile.new(file_manager.gemfile_contents) + self.gemfile = file_to_pessimize lock_parser.call File.open(file_manager.gemfile_lock) end diff --git a/lib/pessimize/shell.rb b/lib/pessimize/shell.rb index 0aeac3f..b5e49d4 100644 --- a/lib/pessimize/shell.rb +++ b/lib/pessimize/shell.rb @@ -37,6 +37,7 @@ def cli_options opt :version_constraint, "Version constraint ('minor' or 'patch')", default: 'minor', type: :string, short: 'c' opt :backup, "Backup existing Gemfile and Gemfile.lock", default: true, type: :boolean, short: 'b' + opt :gemspec, "Pessimize gemspec", type: String, short: 's' end end