[Rubygems-developers] Versioning policy input

Mauricio Fernández batsman.geo at yahoo.com
Mon Apr 5 17:50:42 EDT 2004


On Mon, Apr 05, 2004 at 06:31:48AM -0700, David A. Black wrote:
> > Proposal:
> >     Add a separate field "APIVersion" with a version number to the GEM spec,
> >     which specifies API revisioning, and is rigidly formed for that purpose.
> > 
> 
> I like the idea of having something in the gemspec that flags API
> changes.  It takes the burden off the public release numbering, so
> that we wouldn't have to take on the literally impossible task of
> trying to get all authors to agree on how to (publically) number their
> releases.  

Please take a look at the attached patches, which contain a
straightforward implementation of the proposed internal versioning scheme
B (i.e. the complete, x.y.z one).

Note that merging this would cause all existent gemspecs to stop working (1)
since they will be missing the 'api_version' field. I've done some
ad-hoc corrections to gemspecs/*.gemspec *but* api_version should be
set by somebody knowledgeable w/ the API for each lib.

(1): keep in mind that changing this later will be much more difficult ;-)

-- 
Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

The first is to ensure your partner understands that nature has root
privileges - nature doesn't have to make sense.
	-- Telsa Gwynne
-------------- next part --------------
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
-------------- next part --------------
diff -x CVS -ru rubygems/gemspecs/cgikit-1.1.0.gemspec rubygems.new/gemspecs/cgikit-1.1.0.gemspec
--- rubygems/gemspecs/cgikit-1.1.0.gemspec	2004-03-13 23:56:51.000000000 +0100
+++ rubygems.new/gemspecs/cgikit-1.1.0.gemspec	2004-04-04 11:43:13.000000000 +0200
@@ -3,6 +3,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'cgikit'
   s.version = '1.1.0'
+  s.api_version = "1.1.0"
   s.summary = 'CGIKit is a componented-oriented web application framework like Apple Computers WebObjects.  This framework services Model-View-Controller architecture programming by components based on a HTML file, a definition file and a Ruby source.  '
   s.files = ["lib/cgikit", "lib/cgikit.rb", "lib/cgikit/components", "lib/cgikit/components/CKErrorPage", "lib/cgikit/components/CKErrorPage/CKErrorPage.ckd", "lib/cgikit/components/CKErrorPage/CKErrorPage.html", "lib/cgikit/components/CKErrorPage/CKErrorPage.rb", "misc/cgikit-el", "misc/cgikit-el/cgikit-el.en.rd", "misc/cgikit-el/cgikit-el.ja.rd", "misc/cgikit-el/cgikit-help-en.el", "misc/cgikit-el/cgikit-help-ja.el", "misc/cgikit-el/cgikit.el", "misc/cgikit-el/ChangeLog", "misc/cgikit-el/makehelp.rb", "docs/en", "docs/ja", "docs/en/userguide", "docs/en/userguide/architecture.html", "docs/en/userguide/cookie.html", "docs/en/userguide/deployment.html", "docs/en/userguide/elements.html", "docs/en/userguide/images", "docs/en/userguide/index.html", "docs/en/userguide/install.html", "docs/en/userguide/session.html", "docs/en/userguide/standard.css", "docs/en/userguide/images/architecture_mvc.png", "docs/ja/userguide", "docs/ja/userguide/architecture.html", "docs/ja/userguide/cookie.html", "docs/ja/userguide/deployment.html", "docs/ja/userguide/elements.html", "docs/ja/userguide/images", "docs/ja/userguide/index.html", "docs/ja/userguide/install.html", "docs/ja/userguide/session.html", "docs/ja/userguide/standard.css", "docs/ja/userguide/images/architecturea.png", "src/00about.rb", "src/01adapter.rb", "src/02error.rb", "src/03session.rb", "src/04application.rb", "src/05elements1.rb", "src/06elements2.rb", "src/07elements3.rb", "src/08scanner.rb", "src/09parser.rb", "src/10message.rb", "src/11utilities.rb", "src/12resource.rb", "examples/AboutExamples", "examples/AboutExamples.ja", "examples/AddressBook", "examples/CookieCounter", "examples/ErrorScreen", "examples/Examples", "examples/FileUpload", "examples/HelloWorld", "examples/HelloWorldModRuby", "examples/RequestShower", "examples/SessionTest", "examples/AddressBook/AddressBook.cgi", "examples/AddressBook/addresses.txt", "examples/AddressBook/lib", "examples/AddressBook/MainPage", "examples/AddressBook/lib/address.rb", "examples/AddressBook/MainPage/MainPage.ckd", "examples/AddressBook/MainPage/MainPage.html", "examples/AddressBook/MainPage/MainPage.rb", "examples/CookieCounter/CookieCounter.cgi", "examples/CookieCounter/MainPage", "examples/CookieCounter/MainPage/MainPage.ckd", "examples/CookieCounter/MainPage/MainPage.html", "examples/CookieCounter/MainPage/MainPage.rb", "examples/ErrorScreen/ErrorScreen.cgi", "examples/ErrorScreen/log.txt", "examples/ErrorScreen/MainPage", "examples/ErrorScreen/MainPage/MainPage.ckd", "examples/ErrorScreen/MainPage/MainPage.html", "examples/ErrorScreen/MainPage/MainPage.rb", "examples/Examples/CheckboxPage", "examples/Examples/ConditionalPage", "examples/Examples/Examples.cgi", "examples/Examples/GenericHTMLElementsPage", "examples/Examples/HeaderFooterParts", "examples/Examples/HyperlinkPage", "examples/Examples/ImagePage", "examples/Examples/IndexPage", "examples/Examples/IntroductionPage", "examples/Examples/MainPage", "examples/Examples/MultiLocalePage", "examples/Examples/MultipleSubmitButtonsPage", "examples/Examples/PopUpButtonPage", "examples/Examples/RadioButtonPage", "examples/Examples/RepetitionPage", "examples/Examples/RepetitionTablePage", "examples/Examples/resources", "examples/Examples/SourcePage", "examples/Examples/StringPage", "examples/Examples/TextAreaPage", "examples/Examples/TextFieldPage", "examples/Examples/CheckboxPage/CheckboxPage.ckd", "examples/Examples/CheckboxPage/CheckboxPage.html", "examples/Examples/CheckboxPage/CheckboxPage.rb", "examples/Examples/CheckboxPage/CheckboxPage_ja.html", "examples/Examples/ConditionalPage/ConditionalPage.ckd", "examples/Examples/ConditionalPage/ConditionalPage.html", "examples/Examples/ConditionalPage/ConditionalPage.rb", "examples/Examples/ConditionalPage/ConditionalPage_ja.html", "examples/Examples/GenericHTMLElementsPage/GenericHTMLElementsPage.ckd", "examples/Examples/GenericHTMLElementsPage/GenericHTMLElementsPage.html", "examples/Examples/GenericHTMLElementsPage/GenericHTMLElementsPage.rb", "examples/Examples/GenericHTMLElementsPage/GenericHTMLElementsPage_ja.html", "examples/Examples/HeaderFooterParts/HeaderFooterParts.ckd", "examples/Examples/HeaderFooterParts/HeaderFooterParts.html", "examples/Examples/HeaderFooterParts/HeaderFooterParts.rb", "examples/Examples/HeaderFooterParts/HeaderFooterParts_ja.html", "examples/Examples/HyperlinkPage/HyperlinkPage.ckd", "examples/Examples/HyperlinkPage/HyperlinkPage.html", "examples/Examples/HyperlinkPage/HyperlinkPage.rb", "examples/Examples/HyperlinkPage/HyperlinkPage_ja.html", "examples/Examples/ImagePage/ImagePage.ckd", "examples/Examples/ImagePage/ImagePage.html", "examples/Examples/ImagePage/ImagePage.rb", "examples/Examples/ImagePage/ImagePage_ja.html", "examples/Examples/IndexPage/IndexPage.ckd", "examples/Examples/IndexPage/IndexPage.html", "examples/Examples/IndexPage/IndexPage.rb", "examples/Examples/IntroductionPage/IntroductionPage.ckd", "examples/Examples/IntroductionPage/IntroductionPage.html", "examples/Examples/IntroductionPage/IntroductionPage.rb", "examples/Examples/IntroductionPage/IntroductionPage_ja.html", "examples/Examples/MainPage/MainPage.ckd", "examples/Examples/MainPage/MainPage.html", "examples/Examples/MainPage/MainPage.rb", "examples/Examples/MultiLocalePage/MultiLocalePage.ckd", "examples/Examples/MultiLocalePage/MultiLocalePage.html", "examples/Examples/MultiLocalePage/MultiLocalePage.rb", "examples/Examples/MultiLocalePage/MultiLocalePage_ja.html", "examples/Examples/MultipleSubmitButtonsPage/MultipleSubmitButtonsPage.ckd", "examples/Examples/MultipleSubmitButtonsPage/MultipleSubmitButtonsPage.html", "examples/Examples/MultipleSubmitButtonsPage/MultipleSubmitButtonsPage.rb", "examples/Examples/MultipleSubmitButtonsPage/MultipleSubmitButtonsPage_ja.html", "examples/Examples/PopUpButtonPage/PopUpButtonPage.ckd", "examples/Examples/PopUpButtonPage/PopUpButtonPage.html", "examples/Examples/PopUpButtonPage/PopUpButtonPage.rb", "examples/Examples/PopUpButtonPage/PopUpButtonPage_ja.html", "examples/Examples/RadioButtonPage/RadioButtonPage.ckd", "examples/Examples/RadioButtonPage/RadioButtonPage.html", "examples/Examples/RadioButtonPage/RadioButtonPage.rb", "examples/Examples/RadioButtonPage/RadioButtonPage_ja.html", "examples/Examples/RepetitionPage/RepetitionPage.ckd", "examples/Examples/RepetitionPage/RepetitionPage.html", "examples/Examples/RepetitionPage/RepetitionPage.rb", "examples/Examples/RepetitionPage/RepetitionPage_ja.html", "examples/Examples/RepetitionTablePage/RepetitionTablePage.ckd", "examples/Examples/RepetitionTablePage/RepetitionTablePage.html", "examples/Examples/RepetitionTablePage/RepetitionTablePage.rb", "examples/Examples/RepetitionTablePage/RepetitionTablePage_ja.html", "examples/Examples/resources/cgikit.png", "examples/Examples/SourcePage/SourcePage.ckd", "examples/Examples/SourcePage/SourcePage.html", "examples/Examples/SourcePage/SourcePage.rb", "examples/Examples/SourcePage/SourcePage_ja.html", "examples/Examples/StringPage/StringPage.ckd", "examples/Examples/StringPage/StringPage.html", "examples/Examples/StringPage/StringPage.rb", "examples/Examples/StringPage/StringPage_ja.html", "examples/Examples/TextAreaPage/TextAreaPage.ckd", "examples/Examples/TextAreaPage/TextAreaPage.html", "examples/Examples/TextAreaPage/TextAreaPage.rb", "examples/Examples/TextAreaPage/TextAreaPage_ja.html", "examples/Examples/TextFieldPage/TextFieldPage.ckd", "examples/Examples/TextFieldPage/TextFieldPage.html", "examples/Examples/TextFieldPage/TextFieldPage.rb", "examples/Examples/TextFieldPage/TextFieldPage_ja.html", "examples/FileUpload/FileUpload.cgi", "examples/FileUpload/MainPage", "examples/FileUpload/MainPage/MainPage.ckd", "examples/FileUpload/MainPage/MainPage.html", "examples/FileUpload/MainPage/MainPage.rb", "examples/HelloWorld/HelloWorld.cgi", "examples/HelloWorld/MainPage", "examples/HelloWorld/MainPage/MainPage.ckd", "examples/HelloWorld/MainPage/MainPage.html", "examples/HelloWorld/MainPage/MainPage.rb", "examples/HelloWorldModRuby/helloworldmodruby.rb", "examples/HelloWorldModRuby/HelloWorldModRuby.rbx", "examples/HelloWorldModRuby/MainPage", "examples/HelloWorldModRuby/MainPage/MainPage.ckd", "examples/HelloWorldModRuby/MainPage/MainPage.html", "examples/HelloWorldModRuby/MainPage/MainPage.rb", "examples/RequestShower/MainPage", "examples/RequestShower/RequestShower.cgi", "examples/RequestShower/MainPage/MainPage.ckd", "examples/RequestShower/MainPage/MainPage.html", "examples/RequestShower/MainPage/MainPage.rb", "examples/SessionTest/MainPage", "examples/SessionTest/SessionErrorPage", "examples/SessionTest/SessionTest.cgi", "examples/SessionTest/MainPage/MainPage.ckd", "examples/SessionTest/MainPage/MainPage.html", "examples/SessionTest/MainPage/MainPage.rb", "examples/SessionTest/SessionErrorPage/SessionErrorPage.ckd", "examples/SessionTest/SessionErrorPage/SessionErrorPage.html", "examples/SessionTest/SessionErrorPage/SessionErrorPage.rb", "README", "README.ja", "CHANGES", "CHANGES.ja"]
   s.require_paths = ["lib"]
diff -x CVS -ru rubygems/gemspecs/jabber4r.gemspec rubygems.new/gemspecs/jabber4r.gemspec
--- rubygems/gemspecs/jabber4r.gemspec	2004-03-14 21:01:46.000000000 +0100
+++ rubygems.new/gemspecs/jabber4r.gemspec	2004-04-04 11:43:48.000000000 +0200
@@ -4,6 +4,7 @@
 
   s.name = 'jabber4r'
   s.version = "0.7.0"
+  s.api_version = "0.7.0"
   s.platform = Gem::Platform::RUBY
   s.summary = "Jabber4r is a pure-Ruby Jabber client library"
   s.requirements << 'Jabber server'
diff -x CVS -ru rubygems/gemspecs/linguistics.gemspec rubygems.new/gemspecs/linguistics.gemspec
--- rubygems/gemspecs/linguistics.gemspec	2004-03-13 23:56:51.000000000 +0100
+++ rubygems.new/gemspecs/linguistics.gemspec	2004-04-04 11:44:19.000000000 +0200
@@ -4,6 +4,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'Linguistics'
   s.version = "1.0.2"
+  s.api_version = "1.0.2"
   s.author = "Michael Granger, Martin Chase"
   s.email = "ged at FaerieMUD.org, stillflame at FaerieMUD.org" 
   s.homepage = "http://www.deveiate.org/code/linguistics.html"
diff -x CVS -ru rubygems/gemspecs/ook.gemspec rubygems.new/gemspecs/ook.gemspec
--- rubygems/gemspecs/ook.gemspec	2004-03-13 23:56:51.000000000 +0100
+++ rubygems.new/gemspecs/ook.gemspec	2004-04-04 11:44:27.000000000 +0200
@@ -4,6 +4,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'Ook'
   s.version = "1.0.2"
+  s.api_version = "1.0.2"
   s.author = "Chad Fowler"
   s.email = "chad at chadfowler.com"
   s.homepage = "http://www.chadfowler.com/ruby/rubyook"
diff -x CVS -ru rubygems/gemspecs/progressbar.gemspec rubygems.new/gemspecs/progressbar.gemspec
--- rubygems/gemspecs/progressbar.gemspec	2004-03-13 23:56:51.000000000 +0100
+++ rubygems.new/gemspecs/progressbar.gemspec	2004-04-04 11:44:37.000000000 +0200
@@ -4,6 +4,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'progressbar'
   s.version = "0.0.3"
+  s.api_version = "0.0.3"
   s.author = "Satoru Takabayashi"
   s.email = "satoru at namazu.org"
   s.homepage = "http://namazu.org/~satoru/ruby-progressbar/"
diff -x CVS -ru rubygems/gemspecs/redcloth.gemspec rubygems.new/gemspecs/redcloth.gemspec
--- rubygems/gemspecs/redcloth.gemspec	2004-03-13 23:56:51.000000000 +0100
+++ rubygems.new/gemspecs/redcloth.gemspec	2004-04-04 11:44:58.000000000 +0200
@@ -4,6 +4,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'RedCloth'
   s.version = "2.0.2"
+  s.api_version = "2.0.2"
   s.author = "Why the Lucky Stiff"
   s.email = "why at ruby-lang.org"
   s.homepage = "http://www.whytheluckystiff.net/ruby/redcloth/"
diff -x CVS -ru rubygems/gemspecs/rublog.gemspec rubygems.new/gemspecs/rublog.gemspec
--- rubygems/gemspecs/rublog.gemspec	2004-04-03 15:06:11.000000000 +0200
+++ rubygems.new/gemspecs/rublog.gemspec	2004-04-04 11:45:08.000000000 +0200
@@ -4,6 +4,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'rublog'
   s.version = "0.8.0"
+  s.api_version = "0.8.0"
   s.author = "Dave Thomas"
   s.email = "dave at pragprog.com"
   s.homepage = "http://www.pragprog.com/pragdave/Tech/Blog"
diff -x CVS -ru rubygems/gemspecs/ruby-doom.gemspec rubygems.new/gemspecs/ruby-doom.gemspec
--- rubygems/gemspecs/ruby-doom.gemspec	2004-03-13 23:56:51.000000000 +0100
+++ rubygems.new/gemspecs/ruby-doom.gemspec	2004-04-04 11:45:16.000000000 +0200
@@ -4,6 +4,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'ruby-doom'
   s.version = "0.0.7"
+  s.api_version = "0.0.7"
   s.author = "Tom Copeland"
   s.email = "tom at infoether.com"
   s.homepage = "http://ruby-doom.rubyforge.org/"
diff -x CVS -ru rubygems/gemspecs/rubyjdwp.gemspec rubygems.new/gemspecs/rubyjdwp.gemspec
--- rubygems/gemspecs/rubyjdwp.gemspec	2004-03-13 23:56:51.000000000 +0100
+++ rubygems.new/gemspecs/rubyjdwp.gemspec	2004-04-04 11:45:26.000000000 +0200
@@ -4,6 +4,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'RubyJDWP'
   s.version = "0.0.1"
+  s.api_version = "0.0.1"
   s.author = "Rich Kilmer, Chad Fowler"
   s.email = "rich at infoether.com, chad at chadfowler.com"
   s.homepage = "http://rubyforge.org/projects/rubyjdwp"
diff -x CVS -ru rubygems/gemspecs/statistics.gemspec rubygems.new/gemspecs/statistics.gemspec
--- rubygems/gemspecs/statistics.gemspec	2004-03-13 23:56:51.000000000 +0100
+++ rubygems.new/gemspecs/statistics.gemspec	2004-04-04 11:45:41.000000000 +0200
@@ -4,6 +4,7 @@
 spec = Gem::Specification.new do |s|
   s.name = 'statistics'
   s.version = "2001.2.28"
+  s.api_version = "1.0.0"
   s.author = "Gotoken"
   s.email = "gotoken at notwork.org"
   s.homepage = "http://www.notwork.org/~gotoken/ruby/p/statistics/"


More information about the Rubygems-developers mailing list