2018-11-02 19:07:56 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require "rubygems/dependency"
|
2019-06-01 05:49:40 -04:00
|
|
|
require_relative "shared_helpers"
|
|
|
|
require_relative "rubygems_ext"
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
module Bundler
|
|
|
|
class Dependency < Gem::Dependency
|
|
|
|
attr_reader :autorequire
|
2022-09-03 13:30:07 -04:00
|
|
|
attr_reader :groups, :platforms, :gemfile, :path, :git, :github, :branch, :ref, :force_ruby_platform
|
2018-11-02 19:07:56 -04:00
|
|
|
|
2022-09-07 01:13:04 -04:00
|
|
|
ALL_RUBY_VERSIONS = ((18..27).to_a + (30..31).to_a).freeze
|
2018-11-02 19:07:56 -04:00
|
|
|
PLATFORM_MAP = {
|
2022-09-07 01:13:04 -04:00
|
|
|
:ruby => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
|
|
|
|
:mri => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
|
|
|
|
:rbx => [Gem::Platform::RUBY],
|
|
|
|
:truffleruby => [Gem::Platform::RUBY],
|
|
|
|
:jruby => [Gem::Platform::JAVA, [18, 19]],
|
|
|
|
:windows => [Gem::Platform::WINDOWS, ALL_RUBY_VERSIONS],
|
|
|
|
:mswin => [Gem::Platform::MSWIN, ALL_RUBY_VERSIONS],
|
|
|
|
:mswin64 => [Gem::Platform::MSWIN64, ALL_RUBY_VERSIONS - [18]],
|
|
|
|
:mingw => [Gem::Platform::MINGW, ALL_RUBY_VERSIONS],
|
|
|
|
:x64_mingw => [Gem::Platform::X64_MINGW, ALL_RUBY_VERSIONS - [18, 19]],
|
|
|
|
}.each_with_object({}) do |(platform, spec), hash|
|
|
|
|
hash[platform] = spec[0]
|
|
|
|
spec[1]&.each {|version| hash[:"#{platform}_#{version}"] = spec[0] }
|
|
|
|
end.freeze
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
def initialize(name, version, options = {}, &blk)
|
|
|
|
type = options["type"] || :runtime
|
|
|
|
super(name, version, type)
|
|
|
|
|
|
|
|
@autorequire = nil
|
|
|
|
@groups = Array(options["group"] || :default).map(&:to_sym)
|
|
|
|
@source = options["source"]
|
2022-09-03 13:30:07 -04:00
|
|
|
@path = options["path"]
|
2019-06-01 05:49:40 -04:00
|
|
|
@git = options["git"]
|
2021-12-10 02:40:58 -05:00
|
|
|
@github = options["github"]
|
2019-06-01 05:49:40 -04:00
|
|
|
@branch = options["branch"]
|
2021-12-10 02:40:58 -05:00
|
|
|
@ref = options["ref"]
|
2018-11-02 19:07:56 -04:00
|
|
|
@platforms = Array(options["platforms"])
|
|
|
|
@env = options["env"]
|
|
|
|
@should_include = options.fetch("should_include", true)
|
|
|
|
@gemfile = options["gemfile"]
|
2022-07-26 00:43:48 -04:00
|
|
|
@force_ruby_platform = options["force_ruby_platform"]
|
2018-11-02 19:07:56 -04:00
|
|
|
|
|
|
|
@autorequire = Array(options["require"] || []) if options.key?("require")
|
|
|
|
end
|
|
|
|
|
|
|
|
# Returns the platforms this dependency is valid for, in the same order as
|
|
|
|
# passed in the `valid_platforms` parameter
|
|
|
|
def gem_platforms(valid_platforms)
|
|
|
|
return valid_platforms if @platforms.empty?
|
|
|
|
|
2021-04-21 07:54:29 -04:00
|
|
|
valid_platforms.select {|p| expanded_platforms.include?(GemHelpers.generic(p)) }
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
2019-06-19 09:31:40 -04:00
|
|
|
def expanded_platforms
|
2022-07-12 23:56:36 -04:00
|
|
|
@expanded_platforms ||= @platforms.map {|pl| PLATFORM_MAP[pl] }.compact.flatten.uniq
|
2019-06-19 09:31:40 -04:00
|
|
|
end
|
|
|
|
|
2018-11-02 19:07:56 -04:00
|
|
|
def should_include?
|
|
|
|
@should_include && current_env? && current_platform?
|
|
|
|
end
|
|
|
|
|
|
|
|
def current_env?
|
|
|
|
return true unless @env
|
|
|
|
if @env.is_a?(Hash)
|
|
|
|
@env.all? do |key, val|
|
|
|
|
ENV[key.to_s] && (val.is_a?(String) ? ENV[key.to_s] == val : ENV[key.to_s] =~ val)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
ENV[@env.to_s]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def current_platform?
|
|
|
|
return true if @platforms.empty?
|
|
|
|
@platforms.any? do |p|
|
|
|
|
Bundler.current_ruby.send("#{p}?")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_lock
|
|
|
|
out = super
|
|
|
|
out << "!" if source
|
2022-08-24 12:09:10 -04:00
|
|
|
out
|
2018-11-02 19:07:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def specific?
|
|
|
|
super
|
|
|
|
rescue NoMethodError
|
|
|
|
requirement != ">= 0"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|