class Gem::Requirement
Requirement
是一组或多组版本限制。它支持一些不同的限制运算符 (=, !=, >, <, >=, <=, ~>
)。
请参阅 Gem::Version
,了解 RubyGems 中版本和需求如何协同工作。
常量
- DefaultPrereleaseRequirement
-
默认需求匹配任何版本
- DefaultRequirement
-
默认需求匹配任何非预发布版本
- PATTERN
-
匹配需求的正则表达式
公共类方法
源代码
# File lib/rubygems/requirement.rb, line 55 def self.create(*inputs) return new inputs if inputs.length > 1 input = inputs.shift case input when Gem::Requirement then input when Gem::Version, Array then new input when "!" then source_set else if input.respond_to? :to_str new [input.to_str] else default end end end
用于创建 Gem::Requirement
对象的工厂方法。输入可以是 Version、String
或 nil。旨在简化客户端代码。
如果输入“奇怪”,则返回默认版本需求。
源代码
# File lib/rubygems/requirement.rb, line 80 def self.default_prerelease new ">= 0.a" end
源代码
# File lib/rubygems/requirement.rb, line 131 def initialize(*requirements) requirements = requirements.flatten requirements.compact! requirements.uniq! if requirements.empty? @requirements = [DefaultRequirement] else @requirements = requirements.map! {|r| self.class.parse r } end end
从 requirements
构造一个需求。需求可以是字符串、Gem::Version 或它们的数组。nil
和重复的需求将被忽略。空的需求集与 ">= 0"
相同。
源代码
# File lib/rubygems/requirement.rb, line 103 def self.parse(obj) return ["=", obj] if Gem::Version === obj unless PATTERN =~ obj.to_s raise BadRequirementError, "Illformed requirement [#{obj.inspect}]" end if $1 == ">=" && $2 == "0" DefaultRequirement elsif $1 == ">=" && $2 == "0.a" DefaultPrereleaseRequirement else [-($1 || "="), Gem::Version.new($2)] end end
解析 obj
,返回一个 [op, version]
对。 obj
可以是 String
或 Gem::Version
。
如果 obj
是一个 String
,它可以是一个完整的需求规范,如 ">= 1.2"
,或者是一个简单的版本号,如 "1.2"
。
parse("> 1.0") # => [">", Gem::Version.new("1.0")] parse("1.0") # => ["=", Gem::Version.new("1.0")] parse(Gem::Version.new("1.0")) # => ["=, Gem::Version.new("1.0")]
公共实例方法
源代码
# File lib/rubygems/requirement.rb, line 146 def concat(new) new = new.flatten new.compact! new.uniq! new = new.map {|r| self.class.parse r } @requirements.concat new end
将 new
的需求连接到此需求上。
源代码
# File lib/rubygems/requirement.rb, line 184 def exact? return false unless @requirements.size == 1 @requirements[0][0] == "=" end
如果需求仅适用于精确的版本,则为 true
源代码
# File lib/rubygems/requirement.rb, line 173 def none? if @requirements.size == 1 @requirements[0] == DefaultRequirement else false end end
如果此 gem 没有要求,则为 true。
源代码
# File lib/rubygems/requirement.rb, line 226 def prerelease? requirements.any? {|r| r.last.prerelease? } end
如果其中的任何版本是预发布版本,则需求是预发布版本
源代码
# File lib/rubygems/requirement.rb, line 239 def satisfied_by?(version) raise ArgumentError, "Need a Gem::Version: #{version.inspect}" unless Gem::Version === version requirements.all? {|op, rv| OPS.fetch(op).call version, rv } end
如果 version
满足此 Requirement
,则为 True。
源代码
# File lib/rubygems/requirement.rb, line 251 def specific? return true if @requirements.length > 1 # GIGO, > 1, > 2 is silly !%w[> >=].include? @requirements.first.first # grab the operator end
如果该需求并非始终匹配最新版本,则为 True。
受保护的实例方法
源代码
# File lib/rubygems/requirement.rb, line 277 def _sorted_requirements @_sorted_requirements ||= requirements.sort_by(&:to_s) end
源代码
# File lib/rubygems/requirement.rb, line 281 def _tilde_requirements @_tilde_requirements ||= _sorted_requirements.select {|r| r.first == "~>" } end