@@ -504,22 +504,45 @@ def self.platformed?(platform)
504504 private
505505
506506 def content_addressable_required_rubygems_version
507- return if meets_content_addressable_rubygems_floor?
507+ floor = Gem ::Requirement . new ( CONTENT_ADDRESSABLE_REQUIRED_RUBYGEMS_VERSION ) . requirements . first . last
508+ requirement = begin
509+ Gem ::Requirement . new ( required_rubygems_version . presence &.split ( /\s *,\s */ ) || [ ">= 0" ] )
510+ rescue Gem ::Requirement ::BadRequirementError
511+ nil
512+ end
508513
509- errors . add ( :required_rubygems_version ,
510- "must be #{ CONTENT_ADDRESSABLE_REQUIRED_RUBYGEMS_VERSION } for content-addressable gems (set required_rubygems_version in the gemspec)" )
514+ if requirement . nil? || !meets_version_floor? ( requirement , floor )
515+ errors . add ( :required_rubygems_version ,
516+ "must be #{ CONTENT_ADDRESSABLE_REQUIRED_RUBYGEMS_VERSION } for content-addressable gems " \
517+ "(set required_rubygems_version in the gemspec)" )
518+ elsif conflicts_content_addressable_rubygems_floor? ( requirement , floor )
519+ errors . add ( :required_rubygems_version ,
520+ "must not conflict with RubyGems #{ CONTENT_ADDRESSABLE_REQUIRED_RUBYGEMS_VERSION } required to install content-addressable gems " \
521+ "(remove or loosen the conflicting constraint in the gemspec)" )
522+ end
511523 end
512524
513- def meets_content_addressable_rubygems_floor?
514- floor = Gem ::Requirement . new ( CONTENT_ADDRESSABLE_REQUIRED_RUBYGEMS_VERSION )
515- requirements = required_rubygems_version . presence &.split ( /\s *,\s */ ) || [ ">= 0" ]
516- requirement = Gem ::Requirement . new ( requirements )
525+ def meets_version_floor? ( requirement , floor )
526+ requirement . requirements . any? do |operator , version |
527+ [ ">=" , "~>" , "=" , ">" ] . include? ( operator ) && version >= floor
528+ end
529+ end
517530
518- requirement . requirements . any? do |operator , required_version |
519- [ ">=" , "~>" , "=" , ">" ] . include? ( operator ) && floor . satisfied_by? ( required_version )
531+ def conflicts_version_floor? ( requirement , floor )
532+ conflict = requirement . requirements . any? do |operator , version |
533+ case operator
534+ when "<" then version <= floor
535+ when "<=" , "=" then version < floor
536+ when "~>" then version . bump <= floor . release
537+ else false
538+ end
539+ end
540+
541+ return true if conflict
542+
543+ !requirement . satisfied_by? ( floor ) && requirement . requirements . any? do |operator , version |
544+ [ "<=" , "=" ] . include? ( operator ) && version == floor
520545 end
521- rescue Gem ::Requirement ::BadRequirementError
522- false
523546 end
524547
525548 def update_prerelease
0 commit comments