diff options
Diffstat (limited to 'lib/rubygems/request_set')
| -rw-r--r-- | lib/rubygems/request_set/gem_dependency_api.rb | 374 | ||||
| -rw-r--r-- | lib/rubygems/request_set/lockfile.rb | 69 | ||||
| -rw-r--r-- | lib/rubygems/request_set/lockfile/parser.rb | 354 | ||||
| -rw-r--r-- | lib/rubygems/request_set/lockfile/tokenizer.rb | 112 |
4 files changed, 215 insertions, 694 deletions
diff --git a/lib/rubygems/request_set/gem_dependency_api.rb b/lib/rubygems/request_set/gem_dependency_api.rb index 4b2699d7d2..99d96f928b 100644 --- a/lib/rubygems/request_set/gem_dependency_api.rb +++ b/lib/rubygems/request_set/gem_dependency_api.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + ## # A semi-compatible DSL for the Bundler Gemfile and Isolate gem dependencies # files. @@ -31,136 +32,138 @@ # See `gem help install` and `gem help gem_dependencies` for further details. class Gem::RequestSet::GemDependencyAPI - ENGINE_MAP = { # :nodoc: - :jruby => %w[jruby], - :jruby_18 => %w[jruby], - :jruby_19 => %w[jruby], - :maglev => %w[maglev], - :mri => %w[ruby], - :mri_18 => %w[ruby], - :mri_19 => %w[ruby], - :mri_20 => %w[ruby], - :mri_21 => %w[ruby], - :rbx => %w[rbx], - :ruby => %w[ruby rbx maglev], - :ruby_18 => %w[ruby rbx maglev], - :ruby_19 => %w[ruby rbx maglev], - :ruby_20 => %w[ruby rbx maglev], - :ruby_21 => %w[ruby rbx maglev], - } - - mswin = Gem::Platform.new 'x86-mswin32' - mswin64 = Gem::Platform.new 'x64-mswin64' - x86_mingw = Gem::Platform.new 'x86-mingw32' - x64_mingw = Gem::Platform.new 'x64-mingw32' + jruby: %w[jruby], + jruby_18: %w[jruby], + jruby_19: %w[jruby], + maglev: %w[maglev], + mri: %w[ruby], + mri_18: %w[ruby], + mri_19: %w[ruby], + mri_20: %w[ruby], + mri_21: %w[ruby], + rbx: %w[rbx], + truffleruby: %w[truffleruby], + ruby: %w[ruby rbx maglev truffleruby], + ruby_18: %w[ruby rbx maglev truffleruby], + ruby_19: %w[ruby rbx maglev truffleruby], + ruby_20: %w[ruby rbx maglev truffleruby], + ruby_21: %w[ruby rbx maglev truffleruby], + }.freeze + + mswin = Gem::Platform.new "x86-mswin32" + mswin64 = Gem::Platform.new "x64-mswin64" + x86_mingw = Gem::Platform.new "x86-mingw32" + x64_mingw = Gem::Platform.new "x64-mingw32" PLATFORM_MAP = { # :nodoc: - :jruby => Gem::Platform::RUBY, - :jruby_18 => Gem::Platform::RUBY, - :jruby_19 => Gem::Platform::RUBY, - :maglev => Gem::Platform::RUBY, - :mingw => x86_mingw, - :mingw_18 => x86_mingw, - :mingw_19 => x86_mingw, - :mingw_20 => x86_mingw, - :mingw_21 => x86_mingw, - :mri => Gem::Platform::RUBY, - :mri_18 => Gem::Platform::RUBY, - :mri_19 => Gem::Platform::RUBY, - :mri_20 => Gem::Platform::RUBY, - :mri_21 => Gem::Platform::RUBY, - :mswin => mswin, - :mswin_18 => mswin, - :mswin_19 => mswin, - :mswin_20 => mswin, - :mswin_21 => mswin, - :mswin64 => mswin64, - :mswin64_19 => mswin64, - :mswin64_20 => mswin64, - :mswin64_21 => mswin64, - :rbx => Gem::Platform::RUBY, - :ruby => Gem::Platform::RUBY, - :ruby_18 => Gem::Platform::RUBY, - :ruby_19 => Gem::Platform::RUBY, - :ruby_20 => Gem::Platform::RUBY, - :ruby_21 => Gem::Platform::RUBY, - :x64_mingw => x64_mingw, - :x64_mingw_20 => x64_mingw, - :x64_mingw_21 => x64_mingw - } - - gt_eq_0 = Gem::Requirement.new '>= 0' - tilde_gt_1_8_0 = Gem::Requirement.new '~> 1.8.0' - tilde_gt_1_9_0 = Gem::Requirement.new '~> 1.9.0' - tilde_gt_2_0_0 = Gem::Requirement.new '~> 2.0.0' - tilde_gt_2_1_0 = Gem::Requirement.new '~> 2.1.0' + jruby: Gem::Platform::RUBY, + jruby_18: Gem::Platform::RUBY, + jruby_19: Gem::Platform::RUBY, + maglev: Gem::Platform::RUBY, + mingw: x86_mingw, + mingw_18: x86_mingw, + mingw_19: x86_mingw, + mingw_20: x86_mingw, + mingw_21: x86_mingw, + mri: Gem::Platform::RUBY, + mri_18: Gem::Platform::RUBY, + mri_19: Gem::Platform::RUBY, + mri_20: Gem::Platform::RUBY, + mri_21: Gem::Platform::RUBY, + mswin: mswin, + mswin_18: mswin, + mswin_19: mswin, + mswin_20: mswin, + mswin_21: mswin, + mswin64: mswin64, + mswin64_19: mswin64, + mswin64_20: mswin64, + mswin64_21: mswin64, + rbx: Gem::Platform::RUBY, + ruby: Gem::Platform::RUBY, + ruby_18: Gem::Platform::RUBY, + ruby_19: Gem::Platform::RUBY, + ruby_20: Gem::Platform::RUBY, + ruby_21: Gem::Platform::RUBY, + truffleruby: Gem::Platform::RUBY, + x64_mingw: x64_mingw, + x64_mingw_20: x64_mingw, + x64_mingw_21: x64_mingw, + }.freeze + + gt_eq_0 = Gem::Requirement.new ">= 0" + tilde_gt_1_8_0 = Gem::Requirement.new "~> 1.8.0" + tilde_gt_1_9_0 = Gem::Requirement.new "~> 1.9.0" + tilde_gt_2_0_0 = Gem::Requirement.new "~> 2.0.0" + tilde_gt_2_1_0 = Gem::Requirement.new "~> 2.1.0" VERSION_MAP = { # :nodoc: - :jruby => gt_eq_0, - :jruby_18 => tilde_gt_1_8_0, - :jruby_19 => tilde_gt_1_9_0, - :maglev => gt_eq_0, - :mingw => gt_eq_0, - :mingw_18 => tilde_gt_1_8_0, - :mingw_19 => tilde_gt_1_9_0, - :mingw_20 => tilde_gt_2_0_0, - :mingw_21 => tilde_gt_2_1_0, - :mri => gt_eq_0, - :mri_18 => tilde_gt_1_8_0, - :mri_19 => tilde_gt_1_9_0, - :mri_20 => tilde_gt_2_0_0, - :mri_21 => tilde_gt_2_1_0, - :mswin => gt_eq_0, - :mswin_18 => tilde_gt_1_8_0, - :mswin_19 => tilde_gt_1_9_0, - :mswin_20 => tilde_gt_2_0_0, - :mswin_21 => tilde_gt_2_1_0, - :mswin64 => gt_eq_0, - :mswin64_19 => tilde_gt_1_9_0, - :mswin64_20 => tilde_gt_2_0_0, - :mswin64_21 => tilde_gt_2_1_0, - :rbx => gt_eq_0, - :ruby => gt_eq_0, - :ruby_18 => tilde_gt_1_8_0, - :ruby_19 => tilde_gt_1_9_0, - :ruby_20 => tilde_gt_2_0_0, - :ruby_21 => tilde_gt_2_1_0, - :x64_mingw => gt_eq_0, - :x64_mingw_20 => tilde_gt_2_0_0, - :x64_mingw_21 => tilde_gt_2_1_0, - } + jruby: gt_eq_0, + jruby_18: tilde_gt_1_8_0, + jruby_19: tilde_gt_1_9_0, + maglev: gt_eq_0, + mingw: gt_eq_0, + mingw_18: tilde_gt_1_8_0, + mingw_19: tilde_gt_1_9_0, + mingw_20: tilde_gt_2_0_0, + mingw_21: tilde_gt_2_1_0, + mri: gt_eq_0, + mri_18: tilde_gt_1_8_0, + mri_19: tilde_gt_1_9_0, + mri_20: tilde_gt_2_0_0, + mri_21: tilde_gt_2_1_0, + mswin: gt_eq_0, + mswin_18: tilde_gt_1_8_0, + mswin_19: tilde_gt_1_9_0, + mswin_20: tilde_gt_2_0_0, + mswin_21: tilde_gt_2_1_0, + mswin64: gt_eq_0, + mswin64_19: tilde_gt_1_9_0, + mswin64_20: tilde_gt_2_0_0, + mswin64_21: tilde_gt_2_1_0, + rbx: gt_eq_0, + ruby: gt_eq_0, + ruby_18: tilde_gt_1_8_0, + ruby_19: tilde_gt_1_9_0, + ruby_20: tilde_gt_2_0_0, + ruby_21: tilde_gt_2_1_0, + truffleruby: gt_eq_0, + x64_mingw: gt_eq_0, + x64_mingw_20: tilde_gt_2_0_0, + x64_mingw_21: tilde_gt_2_1_0, + }.freeze WINDOWS = { # :nodoc: - :mingw => :only, - :mingw_18 => :only, - :mingw_19 => :only, - :mingw_20 => :only, - :mingw_21 => :only, - :mri => :never, - :mri_18 => :never, - :mri_19 => :never, - :mri_20 => :never, - :mri_21 => :never, - :mswin => :only, - :mswin_18 => :only, - :mswin_19 => :only, - :mswin_20 => :only, - :mswin_21 => :only, - :mswin64 => :only, - :mswin64_19 => :only, - :mswin64_20 => :only, - :mswin64_21 => :only, - :rbx => :never, - :ruby => :never, - :ruby_18 => :never, - :ruby_19 => :never, - :ruby_20 => :never, - :ruby_21 => :never, - :x64_mingw => :only, - :x64_mingw_20 => :only, - :x64_mingw_21 => :only, - } + mingw: :only, + mingw_18: :only, + mingw_19: :only, + mingw_20: :only, + mingw_21: :only, + mri: :never, + mri_18: :never, + mri_19: :never, + mri_20: :never, + mri_21: :never, + mswin: :only, + mswin_18: :only, + mswin_19: :only, + mswin_20: :only, + mswin_21: :only, + mswin64: :only, + mswin64_19: :only, + mswin64_20: :only, + mswin64_21: :only, + rbx: :never, + ruby: :never, + ruby_18: :never, + ruby_19: :never, + ruby_20: :never, + ruby_21: :never, + x64_mingw: :only, + x64_mingw_20: :only, + x64_mingw_21: :only, + }.freeze ## # The gems required by #gem statements in the gem.deps.rb file @@ -191,7 +194,7 @@ class Gem::RequestSet::GemDependencyAPI # Creates a new GemDependencyAPI that will add dependencies to the # Gem::RequestSet +set+ based on the dependency API description in +path+. - def initialize set, path + def initialize(set, path) @set = set @path = path @@ -203,7 +206,7 @@ class Gem::RequestSet::GemDependencyAPI @git_set = @set.git_set @git_sources = {} @installing = false - @requires = Hash.new { |h, name| h[name] = [] } + @requires = Hash.new {|h, name| h[name] = [] } @vendor_set = @set.vendor_set @source_set = @set.source_set @gem_sources = {} @@ -212,7 +215,7 @@ class Gem::RequestSet::GemDependencyAPI git_source :github do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/" - "git://github.com/#{repo_name}.git" + "https://github.com/#{repo_name}.git" end git_source :bitbucket do |repo_name| @@ -228,11 +231,11 @@ class Gem::RequestSet::GemDependencyAPI # Adds +dependencies+ to the request set if any of the +groups+ are allowed. # This is used for gemspec dependencies. - def add_dependencies groups, dependencies # :nodoc: + def add_dependencies(groups, dependencies) # :nodoc: return unless (groups & @without_groups).empty? dependencies.each do |dep| - @set.gem dep.name, *dep.requirement + @set.gem dep.name, *dep.requirement.as_list end end @@ -241,7 +244,7 @@ class Gem::RequestSet::GemDependencyAPI ## # Finds a gemspec with the given +name+ that lives at +path+. - def find_gemspec name, path # :nodoc: + def find_gemspec(name, path) # :nodoc: glob = File.join path, "#{name}.gemspec" spec_files = Dir[glob] @@ -259,7 +262,7 @@ class Gem::RequestSet::GemDependencyAPI raise ArgumentError, "no gemspecs found at #{Dir.pwd}" else raise ArgumentError, - "found multiple gemspecs at #{Dir.pwd}, " + + "found multiple gemspecs at #{Dir.pwd}, " \ "use the name: option to specify the one you want" end end @@ -269,7 +272,7 @@ class Gem::RequestSet::GemDependencyAPI # In installing mode certain restrictions are ignored such as ruby version # mismatch checks. - def installing= installing # :nodoc: + def installing=(installing) # :nodoc: @installing = installing end @@ -277,7 +280,7 @@ class Gem::RequestSet::GemDependencyAPI # Loads the gem dependency file and returns self. def load - instance_eval File.read(@path).untaint, @path, 1 + instance_eval File.read(@path), @path, 1 self end @@ -327,7 +330,7 @@ class Gem::RequestSet::GemDependencyAPI # git: :: # Install this dependency from a git repository: # - # gem 'private_gem', git: git@my.company.example:private_gem.git' + # gem 'private_gem', git: 'git@my.company.example:private_gem.git' # # gist: :: # Install this dependency from the gist ID: @@ -353,8 +356,8 @@ class Gem::RequestSet::GemDependencyAPI # tag: :: # Use the given tag for git:, gist: and github: dependencies. - def gem name, *requirements - options = requirements.pop if requirements.last.kind_of?(Hash) + def gem(name, *requirements) + options = requirements.pop if requirements.last.is_a?(Hash) options ||= {} options[:git] = @current_repository if @current_repository @@ -369,15 +372,15 @@ class Gem::RequestSet::GemDependencyAPI duplicate = @dependencies.include? name @dependencies[name] = - if requirements.empty? and not source_set then + if requirements.empty? && !source_set Gem::Requirement.default - elsif source_set then + elsif source_set Gem::Requirement.source_set else Gem::Requirement.create requirements end - return unless gem_platforms options + return unless gem_platforms name, options groups = gem_group name, options @@ -387,7 +390,7 @@ class Gem::RequestSet::GemDependencyAPI gem_requires name, options - if duplicate then + if duplicate warn <<-WARNING Gem dependencies file #{@path} requires #{name} more than once. WARNING @@ -401,8 +404,8 @@ Gem dependencies file #{@path} requires #{name} more than once. # # Returns +true+ if the gist or git option was handled. - def gem_git name, options # :nodoc: - if gist = options.delete(:gist) then + def gem_git(name, options) # :nodoc: + if gist = options.delete(:gist) options[:git] = "https://gist.github.com/#{gist}.git" end @@ -424,7 +427,7 @@ Gem dependencies file #{@path} requires #{name} more than once. # # Returns reference for the git gem. - def gem_git_reference options # :nodoc: + def gem_git_reference(options) # :nodoc: ref = options.delete :ref branch = options.delete :branch tag = options.delete :tag @@ -433,14 +436,13 @@ Gem dependencies file #{@path} requires #{name} more than once. reference ||= ref reference ||= branch reference ||= tag - reference ||= 'master' if ref && branch warn <<-WARNING Gem dependencies file #{@path} includes git reference for both ref and branch but only ref is used. WARNING end - if (ref||branch) && tag + if (ref || branch) && tag warn <<-WARNING Gem dependencies file #{@path} includes git reference for both ref/branch and tag but only ref/branch is used. WARNING @@ -457,7 +459,7 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # # Returns +true+ if the custom source option was handled. - def gem_git_source name, options # :nodoc: + def gem_git_source(name, options) # :nodoc: return unless git_source = (@git_sources.keys & options.keys).last source_callback = @git_sources[git_source] @@ -478,9 +480,9 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # Handles the :group and :groups +options+ for the gem with the given # +name+. - def gem_group name, options # :nodoc: + def gem_group(name, options) # :nodoc: g = options.delete :group - all_groups = g ? Array(g) : [] + all_groups = g ? Array(g) : [] groups = options.delete :groups all_groups |= groups if groups @@ -497,7 +499,7 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # # Returns +true+ if the path option was handled. - def gem_path name, options # :nodoc: + def gem_path(name, options) # :nodoc: return unless directory = options.delete(:path) pin_gem_source name, :path, directory @@ -514,7 +516,7 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # # Returns +true+ if the source option was handled. - def gem_source name, options # :nodoc: + def gem_source(name, options) # :nodoc: return unless source = options.delete(:source) pin_gem_source name, :source, source @@ -530,9 +532,9 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # Handles the platforms: option from +options+. Returns true if the # platform matches the current platform. - def gem_platforms options # :nodoc: - platform_names = Array(options.delete :platform) - platform_names.concat Array(options.delete :platforms) + def gem_platforms(name, options) # :nodoc: + platform_names = Array(options.delete(:platform)) + platform_names.concat Array(options.delete(:platforms)) platform_names.concat @current_platforms if @current_platforms return true if platform_names.empty? @@ -541,9 +543,9 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta raise ArgumentError, "unknown platform #{platform_name.inspect}" unless platform = PLATFORM_MAP[platform_name] - next false unless Gem::Platform.match platform + next false unless Gem::Platform.match_gem? platform, name - if engines = ENGINE_MAP[platform_name] then + if engines = ENGINE_MAP[platform_name] next false unless engines.include? Gem.ruby_engine end @@ -564,9 +566,9 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # Records the require: option from +options+ and adds those files, or the # default file to the require list for +name+. - def gem_requires name, options # :nodoc: - if options.include? :require then - if requires = options.delete(:require) then + def gem_requires(name, options) # :nodoc: + if options.include? :require + if requires = options.delete(:require) @requires[name].concat Array requires end else @@ -587,11 +589,10 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # gem 'activerecord' # end - def git repository + def git(repository) @current_repository = repository yield - ensure @current_repository = nil end @@ -601,7 +602,7 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # for use in gems built from git repositories. You must provide a block # that accepts a git repository name for expansion. - def git_source name, &callback + def git_source(name, &callback) @git_sources[name] = callback end @@ -634,9 +635,9 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # The group to add development dependencies to. By default this is # :development. Only one group may be specified. - def gemspec options = {} - name = options.delete(:name) || '{,*}' - path = options.delete(:path) || '.' + def gemspec(options = {}) + name = options.delete(:name) || "{,*}" + path = options.delete(:path) || "." development_group = options.delete(:development_group) || :development spec = find_gemspec name, path @@ -679,11 +680,10 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # development`. See `gem help install` and `gem help gem_dependencies` for # further details. - def group *groups + def group(*groups) @current_groups = groups yield - ensure @current_groups = nil end @@ -692,14 +692,14 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # Pins the gem +name+ to the given +source+. Adding a gem with the same # name from a different +source+ will raise an exception. - def pin_gem_source name, type = :default, source = nil + def pin_gem_source(name, type = :default, source = nil) source_description = case type - when :default then '(default)' + when :default then "(default)" when :path then "path: #{source}" when :git then "git: #{source}" when :source then "source: #{source}" - else '(unknown)' + else "(unknown)" end raise ArgumentError, @@ -754,11 +754,10 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # NOTE: There is inconsistency in what environment a platform matches. You # may need to read the source to know the exact details. - def platform *platforms + def platform(*platforms) @current_platforms = platforms yield - ensure @current_platforms = nil end @@ -769,7 +768,7 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # Block form for restricting gems to a particular set of platforms. See # #platform. - alias :platforms :platform + alias_method :platforms, :platform ## # :category: Gem Dependencies DSL @@ -779,45 +778,43 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # You may also provide +engine:+ and +engine_version:+ options to restrict # this gem dependencies file to a particular ruby engine and its engine # version. This matching is performed by using the RUBY_ENGINE and - # engine_specific VERSION constants. (For JRuby, JRUBY_VERSION). + # RUBY_ENGINE_VERSION constants. - def ruby version, options = {} + def ruby(version, options = {}) engine = options[:engine] engine_version = options[:engine_version] raise ArgumentError, - 'you must specify engine_version along with the ruby engine' if - engine and not engine_version + "You must specify engine_version along with the Ruby engine" if + engine && !engine_version return true if @installing - unless RUBY_VERSION == version then - message = "Your Ruby version is #{RUBY_VERSION}, " + + unless version == RUBY_VERSION + message = "Your Ruby version is #{RUBY_VERSION}, " \ "but your #{gem_deps_file} requires #{version}" raise Gem::RubyVersionMismatch, message end - if engine and engine != Gem.ruby_engine then - message = "Your ruby engine is #{Gem.ruby_engine}, " + + if engine && engine != Gem.ruby_engine + message = "Your Ruby engine is #{Gem.ruby_engine}, " \ "but your #{gem_deps_file} requires #{engine}" raise Gem::RubyVersionMismatch, message end - if engine_version then - my_engine_version = Object.const_get "#{Gem.ruby_engine.upcase}_VERSION" - - if engine_version != my_engine_version then + if engine_version + if engine_version != RUBY_ENGINE_VERSION message = - "Your ruby engine version is #{Gem.ruby_engine} #{my_engine_version}, " + + "Your Ruby engine version is #{Gem.ruby_engine} #{RUBY_ENGINE_VERSION}, " \ "but your #{gem_deps_file} requires #{engine} #{engine_version}" raise Gem::RubyVersionMismatch, message end end - return true + true end ## @@ -834,16 +831,11 @@ Gem dependencies file #{@path} includes git reference for both ref/branch and ta # * The +prepend:+ option is not supported. If you wish to order sources # then list them in your preferred order. - def source url + def source(url) Gem.sources.clear if @default_sources @default_sources = false Gem.sources << url end - - # TODO: remove this typo name at RubyGems 3.0 - - Gem::RequestSet::GemDepedencyAPI = self # :nodoc: - end diff --git a/lib/rubygems/request_set/lockfile.rb b/lib/rubygems/request_set/lockfile.rb index 7f6eadb939..8b9c9690d6 100644 --- a/lib/rubygems/request_set/lockfile.rb +++ b/lib/rubygems/request_set/lockfile.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + ## # Parses a gem.deps.rb.lock file and constructs a LockSet containing the # dependencies found inside. If the lock file is missing no LockSet is @@ -9,7 +10,6 @@ class Gem::RequestSet::Lockfile # Raised when a lockfile cannot be parsed class ParseError < Gem::Exception - ## # The column where the error was encountered @@ -29,7 +29,7 @@ class Gem::RequestSet::Lockfile # Raises a ParseError with the given +message+ which was encountered at a # +line+ and +column+ while parsing. - def initialize message, column, line, path + def initialize(message, column, line, path) @line = line @column = column @path = path @@ -38,16 +38,16 @@ class Gem::RequestSet::Lockfile end ## - # Creates a new Lockfile for the given +request_set+ and +gem_deps_file+ + # Creates a new Lockfile for the given Gem::RequestSet and +gem_deps_file+ # location. - def self.build request_set, gem_deps_file, dependencies = nil + def self.build(request_set, gem_deps_file, dependencies = nil) request_set.resolve dependencies ||= requests_to_deps request_set.sorted_requests new request_set, gem_deps_file, dependencies end - def self.requests_to_deps requests # :nodoc: + def self.requests_to_deps(requests) # :nodoc: deps = {} requests.each do |request| @@ -56,11 +56,11 @@ class Gem::RequestSet::Lockfile requirement = request.request.dependency.requirement deps[name] = if [Gem::Resolver::VendorSpecification, - Gem::Resolver::GitSpecification].include? spec.class then - Gem::Requirement.source_set - else - requirement - end + Gem::Resolver::GitSpecification].include? spec.class + Gem::Requirement.source_set + else + requirement + end end deps @@ -71,43 +71,40 @@ class Gem::RequestSet::Lockfile attr_reader :platforms - def initialize request_set, gem_deps_file, dependencies + def initialize(request_set, gem_deps_file, dependencies) @set = request_set @dependencies = dependencies @gem_deps_file = File.expand_path(gem_deps_file) @gem_deps_dir = File.dirname(@gem_deps_file) - - @gem_deps_file.untaint unless gem_deps_file.tainted? - - @platforms = [] + @platforms = [] end - def add_DEPENDENCIES out # :nodoc: + def add_DEPENDENCIES(out) # :nodoc: out << "DEPENDENCIES" - out.concat @dependencies.sort_by { |name,| name }.map { |name, requirement| + out.concat @dependencies.sort.map {|name, requirement| " #{name}#{requirement.for_lockfile}" } out << nil end - def add_GEM out, spec_groups # :nodoc: + def add_GEM(out, spec_groups) # :nodoc: return if spec_groups.empty? source_groups = spec_groups.values.flatten.group_by do |request| request.spec.source.uri end - source_groups.sort_by { |group,| group.to_s }.map do |group, requests| + source_groups.sort_by {|group,| group.to_s }.map do |group, requests| out << "GEM" out << " remote: #{group}" out << " specs:" - requests.sort_by { |request| request.name }.each do |request| - next if request.spec.name == 'bundler' + requests.sort_by(&:name).each do |request| + next if request.spec.name == "bundler" platform = "-#{request.spec.platform}" unless - Gem::Platform::RUBY == request.spec.platform + request.spec.platform == Gem::Platform::RUBY out << " #{request.name} (#{request.version}#{platform})" @@ -122,7 +119,7 @@ class Gem::RequestSet::Lockfile end end - def add_GIT out, git_requests + def add_GIT(out, git_requests) return if git_requests.empty? by_repository_revision = git_requests.group_by do |request| @@ -136,10 +133,10 @@ class Gem::RequestSet::Lockfile out << " revision: #{revision}" out << " specs:" - requests.sort_by { |request| request.name }.each do |request| + requests.sort_by(&:name).each do |request| out << " #{request.name} (#{request.version})" - dependencies = request.spec.dependencies.sort_by { |dep| dep.name } + dependencies = request.spec.dependencies.sort_by(&:name) dependencies.each do |dep| out << " #{dep.name}#{dep.requirement.for_lockfile}" end @@ -148,14 +145,14 @@ class Gem::RequestSet::Lockfile end end - def relative_path_from dest, base # :nodoc: + def relative_path_from(dest, base) # :nodoc: dest = File.expand_path(dest) base = File.expand_path(base) - if dest.index(base) == 0 then - offset = dest[base.size+1..-1] + if dest.index(base) == 0 + offset = dest[base.size + 1..-1] - return '.' unless offset + return "." unless offset offset else @@ -163,7 +160,7 @@ class Gem::RequestSet::Lockfile end end - def add_PATH out, path_requests # :nodoc: + def add_PATH(out, path_requests) # :nodoc: return if path_requests.empty? out << "PATH" @@ -178,12 +175,12 @@ class Gem::RequestSet::Lockfile out << nil end - def add_PLATFORMS out # :nodoc: + def add_PLATFORMS(out) # :nodoc: out << "PLATFORMS" - platforms = requests.map { |request| request.spec.platform }.uniq + platforms = requests.map {|request| request.spec.platform }.uniq - platforms = platforms.sort_by { |platform| platform.to_s } + platforms = platforms.sort_by(&:to_s) platforms.each do |platform| out << " #{platform}" @@ -193,7 +190,7 @@ class Gem::RequestSet::Lockfile end def spec_groups - requests.group_by { |request| request.spec.class } + requests.group_by {|request| request.spec.class } end ## @@ -223,7 +220,7 @@ class Gem::RequestSet::Lockfile def write content = to_s - open "#{@gem_deps_file}.lock", 'w' do |io| + File.open "#{@gem_deps_file}.lock", "w" do |io| io.write content end end @@ -234,5 +231,3 @@ class Gem::RequestSet::Lockfile @set.sorted_requests end end - -require 'rubygems/request_set/lockfile/tokenizer' diff --git a/lib/rubygems/request_set/lockfile/parser.rb b/lib/rubygems/request_set/lockfile/parser.rb deleted file mode 100644 index ebea940188..0000000000 --- a/lib/rubygems/request_set/lockfile/parser.rb +++ /dev/null @@ -1,354 +0,0 @@ -# frozen_string_literal: true -class Gem::RequestSet::Lockfile::Parser - ### - # Parses lockfiles - - def initialize tokenizer, set, platforms, filename = nil - @tokens = tokenizer - @filename = filename - @set = set - @platforms = platforms - end - - def parse - until @tokens.empty? do - token = get - - case token.type - when :section then - @tokens.skip :newline - - case token.value - when 'DEPENDENCIES' then - parse_DEPENDENCIES - when 'GIT' then - parse_GIT - when 'GEM' then - parse_GEM - when 'PATH' then - parse_PATH - when 'PLATFORMS' then - parse_PLATFORMS - else - token = get until @tokens.empty? or peek.first == :section - end - else - raise "BUG: unhandled token #{token.type} (#{token.value.inspect}) at line #{token.line} column #{token.column}" - end - end - end - - ## - # Gets the next token for a Lockfile - - def get expected_types = nil, expected_value = nil # :nodoc: - token = @tokens.shift - - if expected_types and not Array(expected_types).include? token.type then - unget token - - 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 then - unget token - - 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 - end - - token - end - - def parse_DEPENDENCIES # :nodoc: - while not @tokens.empty? and :text == peek.type do - token = get :text - - requirements = [] - - case peek[0] - when :bang then - get :bang - - requirements << pinned_requirement(token.value) - when :l_paren then - get :l_paren - - loop do - op = get(:requirement).value - version = get(:text).value - - requirements << "#{op} #{version}" - - break unless peek.type == :comma - - get :comma - end - - get :r_paren - - if peek[0] == :bang then - requirements.clear - requirements << pinned_requirement(token.value) - - get :bang - end - end - - @set.gem token.value, *requirements - - skip :newline - end - end - - def parse_GEM # :nodoc: - sources = [] - - while [:entry, 'remote'] == peek.first(2) do - get :entry, 'remote' - data = get(:text).value - skip :newline - - sources << Gem::Source.new(data) - end - - sources << Gem::Source.new(Gem::DEFAULT_HOST) if sources.empty? - - get :entry, 'specs' - - skip :newline - - set = Gem::Resolver::LockSet.new sources - last_specs = nil - - while not @tokens.empty? and :text == peek.type do - token = get :text - name = token.value - column = token.column - - case peek[0] - when :newline then - last_specs.each do |spec| - spec.add_dependency Gem::Dependency.new name if column == 6 - end - when :l_paren then - get :l_paren - - token = get [:text, :requirement] - type = token.type - data = token.value - - if type == :text and column == 4 then - version, platform = data.split '-', 2 - - platform = - platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY - - last_specs = set.add name, version, platform - else - dependency = parse_dependency name, data - - last_specs.each do |spec| - spec.add_dependency dependency - end - end - - get :r_paren - else - raise "BUG: unknown token #{peek}" - end - - skip :newline - end - - @set.sets << set - end - - def parse_GIT # :nodoc: - get :entry, 'remote' - repository = get(:text).value - - skip :newline - - 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 then - get - get :text - - skip :newline - end - - get :entry, 'specs' - - skip :newline - - set = Gem::Resolver::GitSet.new - set.root_dir = @set.install_dir - - last_spec = nil - - while not @tokens.empty? and :text == peek.type do - token = get :text - name = token.value - column = token.column - - case peek[0] - when :newline then - last_spec.add_dependency Gem::Dependency.new name if column == 6 - when :l_paren then - get :l_paren - - 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 - else - dependency = parse_dependency name, data - - last_spec.add_dependency dependency - end - - get :r_paren - else - raise "BUG: unknown token #{peek}" - end - - skip :newline - end - - @set.sets << set - end - - def parse_PATH # :nodoc: - get :entry, 'remote' - directory = get(:text).value - - skip :newline - - get :entry, 'specs' - - skip :newline - - set = Gem::Resolver::VendorSet.new - last_spec = nil - - while not @tokens.empty? and :text == peek.first do - token = get :text - name = token.value - column = token.column - - case peek[0] - when :newline then - last_spec.add_dependency Gem::Dependency.new name if column == 6 - when :l_paren then - get :l_paren - - 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 - else - dependency = parse_dependency name, data - - last_spec.dependencies << dependency - end - - get :r_paren - else - raise "BUG: unknown token #{peek}" - end - - skip :newline - end - - @set.sets << set - end - - def parse_PLATFORMS # :nodoc: - while not @tokens.empty? and :text == peek.first do - name = get(:text).value - - @platforms << name - - skip :newline - end - end - - ## - # Parses the requirements following the dependency +name+ and the +op+ for - # the first token of the requirements and returns a Gem::Dependency object. - - def parse_dependency name, op # :nodoc: - return Gem::Dependency.new name, op unless peek[0] == :text - - version = get(:text).value - - requirements = ["#{op} #{version}"] - - while peek.type == :comma do - get :comma - op = get(:requirement).value - version = get(:text).value - - requirements << "#{op} #{version}" - end - - Gem::Dependency.new name, requirements - end - - private - - def skip type # :nodoc: - @tokens.skip type - end - - ## - # Peeks at the next token for Lockfile - - def peek # :nodoc: - @tokens.peek - end - - if [].respond_to? :flat_map - def pinned_requirement name # :nodoc: - requirement = Gem::Dependency.new name - specification = @set.sets.flat_map { |set| - set.find_all(requirement) - }.compact.first - - specification && specification.version - end - else # FIXME: remove when 1.8 is dropped - def pinned_requirement name # :nodoc: - requirement = Gem::Dependency.new name - specification = @set.sets.map { |set| - set.find_all(requirement) - }.flatten(1).compact.first - - specification && specification.version - end - end - - ## - # Ungets the last token retrieved by #get - - def unget token # :nodoc: - @tokens.unshift token - end -end diff --git a/lib/rubygems/request_set/lockfile/tokenizer.rb b/lib/rubygems/request_set/lockfile/tokenizer.rb deleted file mode 100644 index a758743dda..0000000000 --- a/lib/rubygems/request_set/lockfile/tokenizer.rb +++ /dev/null @@ -1,112 +0,0 @@ -# frozen_string_literal: true -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 - - def initialize input, filename = nil, line = 0, pos = 0 - @line = line - @line_pos = pos - @tokens = [] - @filename = filename - tokenize input - end - - def make_parser set, platforms - Gem::RequestSet::Lockfile::Parser.new self, set, platforms, @filename - end - - def to_a - @tokens.map { |token| [token.type, token.value, token.column, token.line] } - end - - def skip type - @tokens.shift while not @tokens.empty? and peek.type == type - end - - ## - # Calculates the column (by byte) and the line of the current token based on - # +byte_offset+. - - def token_pos byte_offset # :nodoc: - [byte_offset - @line_pos, @line] - end - - def empty? - @tokens.empty? - end - - def unshift token - @tokens.unshift token - end - - def next_token - @tokens.shift - end - alias :shift :next_token - - def peek - @tokens.first || EOF - end - - private - - def tokenize input - require 'strscan' - s = StringScanner.new input - - until s.eos? do - pos = s.pos - - pos = s.pos if leading_whitespace = s.scan(/ +/) - - if s.scan(/[<|=>]{7}/) then - message = "your #{@filename} contains merge conflict markers" - column, line = token_pos pos - - raise Gem::RequestSet::Lockfile::ParseError.new message, column, line, @filename - end - - @tokens << - case - when s.scan(/\r?\n/) then - token = Token.new(:newline, nil, *token_pos(pos)) - @line_pos = s.pos - @line += 1 - token - when s.scan(/[A-Z]+/) then - if leading_whitespace then - text = s.matched - text += s.scan(/[^\s)]*/).to_s # in case of no match - Token.new(:text, text, *token_pos(pos)) - else - Token.new(:section, s.matched, *token_pos(pos)) - end - when s.scan(/([a-z]+):\s/) then - s.pos -= 1 # rewind for possible newline - Token.new(:entry, s[1], *token_pos(pos)) - when s.scan(/\(/) then - Token.new(:l_paren, nil, *token_pos(pos)) - when s.scan(/\)/) then - Token.new(:r_paren, nil, *token_pos(pos)) - when s.scan(/<=|>=|=|~>|<|>|!=/) then - Token.new(:requirement, s.matched, *token_pos(pos)) - when s.scan(/,/) then - Token.new(:comma, nil, *token_pos(pos)) - when s.scan(/!/) then - Token.new(:bang, nil, *token_pos(pos)) - when s.scan(/[^\s),!]*/) then - Token.new(:text, s.matched, *token_pos(pos)) - else - raise "BUG: can't create token for: #{s.string[s.pos..-1].inspect}" - end - end - - @tokens - end -end |
