diff options
Diffstat (limited to 'lib/rubygems/request_set/lockfile')
-rw-r--r-- | lib/rubygems/request_set/lockfile/parser.rb | 61 | ||||
-rw-r--r-- | lib/rubygems/request_set/lockfile/tokenizer.rb | 38 |
2 files changed, 55 insertions, 44 deletions
diff --git a/lib/rubygems/request_set/lockfile/parser.rb b/lib/rubygems/request_set/lockfile/parser.rb index 8c12b435af..e751a1445e 100644 --- a/lib/rubygems/request_set/lockfile/parser.rb +++ b/lib/rubygems/request_set/lockfile/parser.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + class Gem::RequestSet::Lockfile::Parser ### # Parses lockfiles @@ -19,18 +20,18 @@ class Gem::RequestSet::Lockfile::Parser @tokens.skip :newline case token.value - when 'DEPENDENCIES' then + when "DEPENDENCIES" then parse_DEPENDENCIES - when 'GIT' then + when "GIT" then parse_GIT - when 'GEM' then + when "GEM" then parse_GEM - when 'PATH' then + when "PATH" then parse_PATH - when 'PLATFORMS' then + when "PLATFORMS" then parse_PLATFORMS else - token = get until @tokens.empty? or peek.first == :section + token = get until @tokens.empty? || peek.first == :section end else raise "BUG: unhandled token #{token.type} (#{token.value.inspect}) at line #{token.line} column #{token.column}" @@ -44,20 +45,20 @@ class Gem::RequestSet::Lockfile::Parser def get(expected_types = nil, expected_value = nil) # :nodoc: token = @tokens.shift - if expected_types and not Array(expected_types).include? token.type + if expected_types && !Array(expected_types).include?(token.type) unget token - message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " + + message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " \ "expected #{expected_types.inspect}" raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename end - if expected_value and expected_value != token.value + if expected_value && expected_value != token.value unget token - message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " + - "expected [#{expected_types.inspect}, " + + message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " \ + "expected [#{expected_types.inspect}, " \ "#{expected_value.inspect}]" raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename @@ -67,7 +68,7 @@ class Gem::RequestSet::Lockfile::Parser end def parse_DEPENDENCIES # :nodoc: - while not @tokens.empty? and :text == peek.type do + while !@tokens.empty? && peek.type == :text do token = get :text requirements = [] @@ -110,8 +111,8 @@ class Gem::RequestSet::Lockfile::Parser def parse_GEM # :nodoc: sources = [] - while [:entry, 'remote'] == peek.first(2) do - get :entry, 'remote' + while peek.first(2) == [:entry, "remote"] do + get :entry, "remote" data = get(:text).value skip :newline @@ -120,14 +121,14 @@ class Gem::RequestSet::Lockfile::Parser sources << Gem::Source.new(Gem::DEFAULT_HOST) if sources.empty? - get :entry, 'specs' + get :entry, "specs" skip :newline set = Gem::Resolver::LockSet.new sources last_specs = nil - while not @tokens.empty? and :text == peek.type do + while !@tokens.empty? && peek.type == :text do token = get :text name = token.value column = token.column @@ -144,8 +145,8 @@ class Gem::RequestSet::Lockfile::Parser type = token.type data = token.value - if type == :text and column == 4 - version, platform = data.split '-', 2 + if type == :text && column == 4 + version, platform = data.split "-", 2 platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY @@ -171,26 +172,26 @@ class Gem::RequestSet::Lockfile::Parser end def parse_GIT # :nodoc: - get :entry, 'remote' + get :entry, "remote" repository = get(:text).value skip :newline - get :entry, 'revision' + get :entry, "revision" revision = get(:text).value skip :newline type = peek.type value = peek.value - if type == :entry and %w[branch ref tag].include? value + if type == :entry && %w[branch ref tag].include?(value) get get :text skip :newline end - get :entry, 'specs' + get :entry, "specs" skip :newline @@ -199,7 +200,7 @@ class Gem::RequestSet::Lockfile::Parser last_spec = nil - while not @tokens.empty? and :text == peek.type do + while !@tokens.empty? && peek.type == :text do token = get :text name = token.value column = token.column @@ -214,7 +215,7 @@ class Gem::RequestSet::Lockfile::Parser type = token.type data = token.value - if type == :text and column == 4 + if type == :text && column == 4 last_spec = set.add_git_spec name, data, repository, revision, true else dependency = parse_dependency name, data @@ -234,19 +235,19 @@ class Gem::RequestSet::Lockfile::Parser end def parse_PATH # :nodoc: - get :entry, 'remote' + get :entry, "remote" directory = get(:text).value skip :newline - get :entry, 'specs' + get :entry, "specs" skip :newline set = Gem::Resolver::VendorSet.new last_spec = nil - while not @tokens.empty? and :text == peek.first do + while !@tokens.empty? && peek.first == :text do token = get :text name = token.value column = token.column @@ -261,7 +262,7 @@ class Gem::RequestSet::Lockfile::Parser type = token.type data = token.value - if type == :text and column == 4 + if type == :text && column == 4 last_spec = set.add_vendor_gem name, directory else dependency = parse_dependency name, data @@ -281,7 +282,7 @@ class Gem::RequestSet::Lockfile::Parser end def parse_PLATFORMS # :nodoc: - while not @tokens.empty? and :text == peek.first do + while !@tokens.empty? && peek.first == :text do name = get(:text).value @platforms << name @@ -331,7 +332,7 @@ class Gem::RequestSet::Lockfile::Parser set.find_all(requirement) end.compact.first - specification && specification.version + specification&.version end ## diff --git a/lib/rubygems/request_set/lockfile/tokenizer.rb b/lib/rubygems/request_set/lockfile/tokenizer.rb index 6918e8e1a5..65cef3baa0 100644 --- a/lib/rubygems/request_set/lockfile/tokenizer.rb +++ b/lib/rubygems/request_set/lockfile/tokenizer.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true -require 'rubygems/request_set/lockfile/parser' + +# ) frozen_string_literal: true +require_relative "parser" class Gem::RequestSet::Lockfile::Tokenizer Token = Struct.new :type, :value, :column, :line @@ -26,7 +28,7 @@ class Gem::RequestSet::Lockfile::Tokenizer end def skip(type) - @tokens.shift while not @tokens.empty? and peek.type == type + @tokens.shift while !@tokens.empty? && peek.type == type end ## @@ -48,7 +50,7 @@ class Gem::RequestSet::Lockfile::Tokenizer def next_token @tokens.shift end - alias :shift :next_token + alias_method :shift, :next_token def peek @tokens.first || EOF @@ -57,7 +59,7 @@ class Gem::RequestSet::Lockfile::Tokenizer private def tokenize(input) - require 'strscan' + require "strscan" s = StringScanner.new input until s.eos? do @@ -73,13 +75,14 @@ class Gem::RequestSet::Lockfile::Tokenizer end @tokens << - case - when s.scan(/\r?\n/) then + if s.scan(/\r?\n/) + token = Token.new(:newline, nil, *token_pos(pos)) @line_pos = s.pos @line += 1 token - when s.scan(/[A-Z]+/) then + elsif s.scan(/[A-Z]+/) + if leading_whitespace text = s.matched text += s.scan(/[^\s)]*/).to_s # in case of no match @@ -87,20 +90,27 @@ class Gem::RequestSet::Lockfile::Tokenizer else Token.new(:section, s.matched, *token_pos(pos)) end - when s.scan(/([a-z]+):\s/) then + elsif s.scan(/([a-z]+):\s/) + s.pos -= 1 # rewind for possible newline Token.new(:entry, s[1], *token_pos(pos)) - when s.scan(/\(/) then + elsif s.scan(/\(/) + Token.new(:l_paren, nil, *token_pos(pos)) - when s.scan(/\)/) then + elsif s.scan(/\)/) + Token.new(:r_paren, nil, *token_pos(pos)) - when s.scan(/<=|>=|=|~>|<|>|!=/) then + elsif s.scan(/<=|>=|=|~>|<|>|!=/) + Token.new(:requirement, s.matched, *token_pos(pos)) - when s.scan(/,/) then + elsif s.scan(/,/) + Token.new(:comma, nil, *token_pos(pos)) - when s.scan(/!/) then + elsif s.scan(/!/) + Token.new(:bang, nil, *token_pos(pos)) - when s.scan(/[^\s),!]*/) then + elsif s.scan(/[^\s),!]*/) + Token.new(:text, s.matched, *token_pos(pos)) else raise "BUG: can't create token for: #{s.string[s.pos..-1].inspect}" |