diff options
author | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-09-08 22:46:43 +0000 |
---|---|---|
committer | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-09-08 22:46:43 +0000 |
commit | 59991b6ac517fcaa4f8122a1da6552a66892449e (patch) | |
tree | 1379ec1662eca3c5a08e02e221c4b4045d08f0a7 /lib/rubygems/request_set/lockfile | |
parent | 230b8d533e67b82654975fdc581693967ff06daf (diff) |
* lib/rubygems: Update to RubyGems HEAD(fe61e4c112).
this version contains new feature that warn invalid SPDX license
identifiers. https://github.com/rubygems/rubygems/pull/1249
and #1032, #1023, #1332, #1328, #1306, #1321, #1324
* test/rubygems: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51801 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems/request_set/lockfile')
-rw-r--r-- | lib/rubygems/request_set/lockfile/parser.rb | 97 | ||||
-rw-r--r-- | lib/rubygems/request_set/lockfile/tokenizer.rb | 29 |
2 files changed, 70 insertions, 56 deletions
diff --git a/lib/rubygems/request_set/lockfile/parser.rb b/lib/rubygems/request_set/lockfile/parser.rb index 7778b7ae17..f43f6457fd 100644 --- a/lib/rubygems/request_set/lockfile/parser.rb +++ b/lib/rubygems/request_set/lockfile/parser.rb @@ -11,13 +11,13 @@ class Gem::RequestSet::Lockfile::Parser def parse until @tokens.empty? do - type, data, column, line = get + token = get - case type + case token.type when :section then @tokens.skip :newline - case data + case token.value when 'DEPENDENCIES' then parse_DEPENDENCIES when 'GIT' then @@ -29,10 +29,10 @@ class Gem::RequestSet::Lockfile::Parser when 'PLATFORMS' then parse_PLATFORMS else - type, = get until @tokens.empty? or peek.first == :section + token = get until @tokens.empty? or peek.first == :section end else - raise "BUG: unhandled token #{type} (#{data.inspect}) at line #{line} column #{column}" + raise "BUG: unhandled token #{token.type} (#{token.value.inspect}) at line #{token.line} column #{token.column}" end end end @@ -41,35 +41,33 @@ class Gem::RequestSet::Lockfile::Parser # Gets the next token for a Lockfile def get expected_types = nil, expected_value = nil # :nodoc: - current_token = @tokens.shift + token = @tokens.shift - type, value, column, line = current_token + if expected_types and not Array(expected_types).include? token.type then + unget token - if expected_types and not Array(expected_types).include? type then - unget current_token - - message = "unexpected token [#{type.inspect}, #{value.inspect}], " + + message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " + "expected #{expected_types.inspect}" - raise Gem::RequestSet::Lockfile::ParseError.new message, column, line, @filename + raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename end - if expected_value and expected_value != value then - unget current_token + if expected_value and expected_value != token.value then + unget token - message = "unexpected token [#{type.inspect}, #{value.inspect}], " + + message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " + "expected [#{expected_types.inspect}, " + "#{expected_value.inspect}]" - raise Gem::RequestSet::Lockfile::ParseError.new message, column, line, @filename + raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename end - current_token + token end def parse_DEPENDENCIES # :nodoc: - while not @tokens.empty? and :text == peek.first do - _, name, = get :text + while not @tokens.empty? and :text == peek.type do + token = get :text requirements = [] @@ -77,17 +75,17 @@ class Gem::RequestSet::Lockfile::Parser when :bang then get :bang - requirements << pinned_requirement(name) + requirements << pinned_requirement(token.value) when :l_paren then get :l_paren loop do - _, op, = get :requirement - _, version, = get :text + op = get(:requirement).value + version = get(:text).value requirements << "#{op} #{version}" - break unless peek[0] == :comma + break unless peek.type == :comma get :comma end @@ -96,13 +94,13 @@ class Gem::RequestSet::Lockfile::Parser if peek[0] == :bang then requirements.clear - requirements << pinned_requirement(name) + requirements << pinned_requirement(token.value) get :bang end end - @set.gem name, *requirements + @set.gem token.value, *requirements skip :newline end @@ -113,7 +111,7 @@ class Gem::RequestSet::Lockfile::Parser while [:entry, 'remote'] == peek.first(2) do get :entry, 'remote' - _, data, = get :text + data = get(:text).value skip :newline sources << Gem::Source.new(data) @@ -128,8 +126,10 @@ class Gem::RequestSet::Lockfile::Parser set = Gem::Resolver::LockSet.new sources last_specs = nil - while not @tokens.empty? and :text == peek.first do - _, name, column, = get :text + while not @tokens.empty? and :text == peek.type do + token = get :text + name = token.value + column = token.column case peek[0] when :newline then @@ -139,7 +139,9 @@ class Gem::RequestSet::Lockfile::Parser when :l_paren then get :l_paren - type, data, = get [:text, :requirement] + token = get [:text, :requirement] + type = token.type + data = token.value if type == :text and column == 4 then version, platform = data.split '-', 2 @@ -169,16 +171,17 @@ class Gem::RequestSet::Lockfile::Parser def parse_GIT # :nodoc: get :entry, 'remote' - _, repository, = get :text + repository = get(:text).value skip :newline get :entry, 'revision' - _, revision, = get :text + revision = get(:text).value skip :newline - type, value = peek.first 2 + type = peek.type + value = peek.value if type == :entry and %w[branch ref tag].include? value then get get :text @@ -195,8 +198,10 @@ class Gem::RequestSet::Lockfile::Parser last_spec = nil - while not @tokens.empty? and :text == peek.first do - _, name, column, = get :text + while not @tokens.empty? and :text == peek.type do + token = get :text + name = token.value + column = token.column case peek[0] when :newline then @@ -204,7 +209,9 @@ class Gem::RequestSet::Lockfile::Parser when :l_paren then get :l_paren - type, data, = get [:text, :requirement] + token = get [:text, :requirement] + type = token.type + data = token.value if type == :text and column == 4 then last_spec = set.add_git_spec name, data, repository, revision, true @@ -227,7 +234,7 @@ class Gem::RequestSet::Lockfile::Parser def parse_PATH # :nodoc: get :entry, 'remote' - _, directory, = get :text + directory = get(:text).value skip :newline @@ -239,7 +246,9 @@ class Gem::RequestSet::Lockfile::Parser last_spec = nil while not @tokens.empty? and :text == peek.first do - _, name, column, = get :text + token = get :text + name = token.value + column = token.column case peek[0] when :newline then @@ -247,7 +256,9 @@ class Gem::RequestSet::Lockfile::Parser when :l_paren then get :l_paren - type, data, = get [:text, :requirement] + token = get [:text, :requirement] + type = token.type + data = token.value if type == :text and column == 4 then last_spec = set.add_vendor_gem name, directory @@ -270,7 +281,7 @@ class Gem::RequestSet::Lockfile::Parser def parse_PLATFORMS # :nodoc: while not @tokens.empty? and :text == peek.first do - _, name, = get :text + name = get(:text).value @platforms << name @@ -285,14 +296,14 @@ class Gem::RequestSet::Lockfile::Parser def parse_dependency name, op # :nodoc: return Gem::Dependency.new name, op unless peek[0] == :text - _, version, = get :text + version = get(:text).value requirements = ["#{op} #{version}"] - while peek[0] == :comma do + while peek.type == :comma do get :comma - _, op, = get :requirement - _, version, = get :text + op = get(:requirement).value + version = get(:text).value requirements << "#{op} #{version}" end diff --git a/lib/rubygems/request_set/lockfile/tokenizer.rb b/lib/rubygems/request_set/lockfile/tokenizer.rb index 73c9a834bb..422b03c03f 100644 --- a/lib/rubygems/request_set/lockfile/tokenizer.rb +++ b/lib/rubygems/request_set/lockfile/tokenizer.rb @@ -2,6 +2,9 @@ require 'strscan' require 'rubygems/request_set/lockfile/parser' class Gem::RequestSet::Lockfile::Tokenizer + Token = Struct.new :type, :value, :column, :line + EOF = Token.new :EOF + def self.from_file file new File.read(file), file end @@ -19,11 +22,11 @@ class Gem::RequestSet::Lockfile::Tokenizer end def to_a - @tokens + @tokens.map { |token| [token.type, token.value, token.column, token.line] } end def skip type - @tokens.shift while not @tokens.empty? and peek.first == type + @tokens.shift while not @tokens.empty? and peek.type == type end ## @@ -48,7 +51,7 @@ class Gem::RequestSet::Lockfile::Tokenizer alias :shift :next_token def peek - @tokens.first || [:EOF] + @tokens.first || EOF end private @@ -71,7 +74,7 @@ class Gem::RequestSet::Lockfile::Tokenizer @tokens << case when s.scan(/\r?\n/) then - token = [:newline, nil, *token_pos(pos)] + token = Token.new(:newline, nil, *token_pos(pos)) @line_pos = s.pos @line += 1 token @@ -79,25 +82,25 @@ class Gem::RequestSet::Lockfile::Tokenizer if leading_whitespace then text = s.matched text += s.scan(/[^\s)]*/).to_s # in case of no match - [:text, text, *token_pos(pos)] + Token.new(:text, text, *token_pos(pos)) else - [:section, s.matched, *token_pos(pos)] + Token.new(:section, s.matched, *token_pos(pos)) end when s.scan(/([a-z]+):\s/) then s.pos -= 1 # rewind for possible newline - [:entry, s[1], *token_pos(pos)] + Token.new(:entry, s[1], *token_pos(pos)) when s.scan(/\(/) then - [:l_paren, nil, *token_pos(pos)] + Token.new(:l_paren, nil, *token_pos(pos)) when s.scan(/\)/) then - [:r_paren, nil, *token_pos(pos)] + Token.new(:r_paren, nil, *token_pos(pos)) when s.scan(/<=|>=|=|~>|<|>|!=/) then - [:requirement, s.matched, *token_pos(pos)] + Token.new(:requirement, s.matched, *token_pos(pos)) when s.scan(/,/) then - [:comma, nil, *token_pos(pos)] + Token.new(:comma, nil, *token_pos(pos)) when s.scan(/!/) then - [:bang, nil, *token_pos(pos)] + Token.new(:bang, nil, *token_pos(pos)) when s.scan(/[^\s),!]*/) then - [:text, s.matched, *token_pos(pos)] + Token.new(:text, s.matched, *token_pos(pos)) else raise "BUG: can't create token for: #{s.string[s.pos..-1].inspect}" end |