diff -x CVS -ru rubygems/lib/rubygems/cache.rb rubygems.new/lib/rubygems/cache.rb --- rubygems/lib/rubygems/cache.rb 2004-03-19 04:27:24.000000000 +0100 +++ rubygems.new/lib/rubygems/cache.rb 2004-04-04 11:24:27.000000000 +0200 @@ -64,7 +64,7 @@ result = [] @gems.each do |full_spec_name, spec| next unless spec.name == gem_name - result << spec if version_requirement.satisfied_by?(spec.version) + result << spec if version_requirement.satisfied_by?(spec.api_version) end result = result.sort result diff -x CVS -ru rubygems/lib/rubygems/remote_installer.rb rubygems.new/lib/rubygems/remote_installer.rb --- rubygems/lib/rubygems/remote_installer.rb 2004-04-02 14:48:29.000000000 +0200 +++ rubygems.new/lib/rubygems/remote_installer.rb 2004-04-04 11:34:42.000000000 +0200 @@ -16,15 +16,15 @@ ## # This method will install package_name onto the local system. # package_name:: [String] Name of the Gem to install - # version_requirement:: [default = "> 0.0.0"] Gem version requirement to install - def install(package_name, version_requirement = "> 0.0.0", force=false, directory=Gem.dir) + # api_version_requirement:: [default = "1"] API version requirement to install + def install(package_name, api_version_requirement = "1", force=false, directory=Gem.dir) - unless version_requirement.respond_to?(:version) - version_requirement = Version::Requirement.new(version_requirement) + unless api_version_requirement.respond_to?(:version) + api_version_requirement = Version::APIRequirement.new(api_version_requirement) end sources = get_cache_sources() caches = get_caches(sources) - spec, source = find_latest_valid_package_in_caches(package_name,version_requirement,caches) + spec, source = find_latest_valid_package_in_caches(package_name,api_version_requirement,caches) dependencies = find_dependencies_not_installed(spec.dependencies) install_dependencies(dependencies) cache_dir = File.join(Gem::dir, "cache") @@ -88,7 +88,7 @@ cache.each do |name, spec| if (/#{package_name}/i === name && spec.version > max_version && - version_requirement.satisfied_by?(spec.version)) then + version_requirement.satisfied_by?(spec.api_version)) then package = [spec, source] max_version = spec.version end diff -x CVS -ru rubygems/lib/rubygems/specification.rb rubygems.new/lib/rubygems/specification.rb --- rubygems/lib/rubygems/specification.rb 2004-04-03 16:50:37.000000000 +0200 +++ rubygems.new/lib/rubygems/specification.rb 2004-04-04 10:43:00.000000000 +0200 @@ -44,7 +44,8 @@ ## # These attributes are required # - required_attribute :rubygems_version, :name, :platform, :date, :summary, :require_paths, :version + required_attribute :rubygems_version, :name, :platform, :date, :summary, + :require_paths, :version, :api_version ## # These attributes are optional @@ -174,6 +175,20 @@ end ## + # Sets the API version of the Specification + # + # version:: [String or Gem::Version] The version + # + # Note that the API version must comply with the versioning policy. + # + def api_version=(version) + unless version.respond_to? :version + api_version = Version.new(version) + end + @api_version = api_version + end + + ## # Helper method if the require path is singular # # path:: [String] The require path. @@ -197,7 +212,7 @@ # gem:: [String or Gem::Dependency] The Gem name/dependency. # requirement:: [default="> 0.0.0"] The version requirement. # - def add_dependency(gem, requirement="> 0.0.0") + def add_dependency(gem, requirement="1") unless gem.respond_to?(:name) && gem.respond_to?(:version_requirement) gem = Dependency.new(gem, requirement) end @@ -240,7 +255,7 @@ # def satisfies_requirement?(dependency) return @name==dependency.name && - dependency.version_requirement.satisfied_by?(@version) + dependency.version_requirement.satisfied_by?(@api_version) end ## @@ -259,7 +274,7 @@ # def to_yaml_properties mark_version - result = ['@rubygems_version', '@name', '@version', '@date', '@platform', '@summary', '@require_paths', '@files'] + result = ['@rubygems_version', '@name', '@version', '@api_version', '@date', '@platform', '@summary', '@require_paths', '@files'] result << '@autorequire' if @autorequire result << '@author' if @author result << '@email' if @email @@ -283,6 +298,7 @@ result = "Gem::Specification.new do |s|\n" result << "s.name = %q{#{name}}\n" result << "s.version = %q{#{version}}\n" + result << "s.api_version = %q{#{api_version}}\n" result << "s.platform = %q{#{platform}}\n" if @platform result << "s.has_rdoc = #{has_rdoc?}\n" if has_rdoc? result << "s.test_suite_file = %q{#{test_suite_file}}\n" if has_test_suite? diff -x CVS -ru rubygems/lib/rubygems/version.rb rubygems.new/lib/rubygems/version.rb --- rubygems/lib/rubygems/version.rb 2004-01-24 19:49:22.000000000 +0100 +++ rubygems.new/lib/rubygems/version.rb 2004-04-04 10:46:55.000000000 +0200 @@ -23,7 +23,7 @@ # def initialize(name, version_requirement) @name = name - @version_requirement = Version::Requirement.new(version_requirement) + @version_requirement = Version::APIRequirement.new(version_requirement) end end @@ -169,5 +169,67 @@ @version.scan(/\d+/).map {|s| s.to_i} end end + + ## + # APIRequirement implements the API versioning semantics. + # + class APIRequirement < Version + + NUM_RE = /(\d.\d)|(\d)/ # either 1 or 1.1 etc + + ## + # Used to simplify conversion code, especially from strings + # + def to_requirement + self + end + + ## + # Overrides to check for comparator + # + # str:: [String] the version requirement string + # return:: [Boolean] true if the string format is correct, otherwise false + # + def correct?(str) + /^#{NUM_RE}$/.match(str) + end + + ## + # Constructs a version requirement instance + # + # str:: [String] the version requirement string (e.g. "> 1.23") + # + def initialize(str) + super + @nums = parse + end + + ## + # Determines if the API version requirement is satisfied by the supplied version + # + # vn:: [Gem::Version] the version to compare against + # return:: [Boolean] true if this requirement is satisfied by the version, otherwise false + # + def satisfied_by?(vn) + other = vn.to_ints + case @nums.size + when 1 + other[0] == @nums[0] + when 2 + other[0] == @nums[0] && other[1] >= @nums[1] + end + end + + private + + ## + # parses the version requirement string, returning the + # comparator and the number + # + def parse + return @version.scan(/\d+/).map {|s| s.to_i} + end + end end + end diff -x CVS -ru rubygems/lib/rubygems.rb rubygems.new/lib/rubygems.rb --- rubygems/lib/rubygems.rb 2004-03-29 04:30:55.000000000 +0200 +++ rubygems.new/lib/rubygems.rb 2004-04-04 10:49:20.000000000 +0200 @@ -13,7 +13,7 @@ # return:: [Boolean] true if the Gem is loaded, otherwise false. # raises:: [LoadError] if Gem cannot be found or version requirement not met. # - def require_gem(gem, version_requirement="> 0.0.0") + def require_gem(gem, version_requirement="1") unless gem.respond_to?(:name) && gem.respond_to?(:version_requirement) gem = Gem::Dependency.new(gem, version_requirement) end diff -x CVS -ru rubygems/packages/sources/sources.gemspec rubygems.new/packages/sources/sources.gemspec --- rubygems/packages/sources/sources.gemspec 2003-11-22 19:58:46.000000000 +0100 +++ rubygems.new/packages/sources/sources.gemspec 2004-04-04 10:51:22.000000000 +0200 @@ -6,6 +6,7 @@ spec = Gem::Specification.new do |s| s.name = 'sources' s.version = "0.0.1" + s.api_version = "1.0.0" s.platform = Gem::Platform::RUBY s.summary = "This package provides download sources for remote gem installation" s.files = Dir.glob("lib/**/*").delete_if {|item| item.include?("CVS")} diff -x CVS -ru rubygems/test/test_cache.rb rubygems.new/test/test_cache.rb --- rubygems/test/test_cache.rb 2004-03-29 01:50:15.000000000 +0200 +++ rubygems.new/test/test_cache.rb 2004-04-04 11:17:05.000000000 +0200 @@ -37,6 +37,7 @@ @sample_spec = Gem::Specification.new do |s| s.name = 'foo' s.version = "1.2.3" + s.api_version = "1.2.0" s.platform = Gem::Platform::RUBY s.summary = "This is a cool package" s.files = [] @@ -44,6 +45,7 @@ @second_sample_spec = Gem::Specification.new do |s| s.name = 'anothergem' s.version = "0.0.1" + s.api_version = "1.0.0" s.platform = Gem::Platform::RUBY s.summary = "This is a cool package" s.files = [] diff -x CVS -ru rubygems/test/test_remote_installer.rb rubygems.new/test/test_remote_installer.rb --- rubygems/test/test_remote_installer.rb 2004-03-29 01:50:15.000000000 +0200 +++ rubygems.new/test/test_remote_installer.rb 2004-04-04 11:16:24.000000000 +0200 @@ -82,6 +82,7 @@ SAMPLE_SPEC = Gem::Specification.new do |s| s.name = 'foo' s.version = "1.2.3" + s.api_version = "1.0.0" s.platform = Gem::Platform::RUBY s.summary = "This is a cool package" s.files = [] diff -x CVS -ru rubygems/test/test_specification.rb rubygems.new/test/test_specification.rb --- rubygems/test/test_specification.rb 2004-04-03 15:48:56.000000000 +0200 +++ rubygems.new/test/test_specification.rb 2004-04-04 10:52:07.000000000 +0200 @@ -5,6 +5,7 @@ def setup @gem_spec = Gem::Specification.new do |s| s.version = "1.0.0" + s.api_version = "1.0.0" s.name = "boo" s.platform = Gem::Platform::RUBY s.date = Time.now