lib/pessimize/gem.rb
module Pessimize
class Gem
attr_reader :name, :original_tokens
attr_accessor :version
def initialize(gem_tokens)
self.original_tokens = gem_tokens
parse_name
parse_version
end
def tokens
compiled_tokens = original_tokens.dup
if version_index
compiled_tokens[version_index][2] = version
elsif version
compiled_tokens[after_name_index..0] = version_tokens
end
compiled_tokens
end
def to_s
tokens.inject("") { |a, t| a << t[2] }
end
protected
attr_writer :name, :original_tokens
attr_accessor :version_index,
:token_before_version,
:after_name_index
def version_tokens
[
[[], :on_comma, ","],
[[], :on_sp, " "],
[[], :on_tstring_beg, "\""],
[[], :on_tstring_content, version],
[[], :on_tstring_end, "\""]
]
end
def parse_name
name_index = original_tokens.index { |t| t[1] == :on_tstring_content }
self.name = original_tokens[name_index][2]
self.after_name_index = name_index + 2
end
def parse_version
token_before_version = original_tokens.index { |t| t[1] == :on_comma }
if token_before_version
remaining_tokens = original_tokens[(token_before_version + 1)..-1]
while [:on_sp, :on_tstring_beg, :on_ignored_nl].include? remaining_tokens.first[1]
remaining_tokens.shift
token_before_version += 1
end
if remaining_tokens.first[1] == :on_tstring_content
self.version_index = token_before_version + 1
self.version = remaining_tokens.first[2]
end
end
end
end
end