[DRE-commits] [SCM] gem2deb.git branch, master, updated. 460e84be1f7bd8d430c5ddae46d62fd657ac5fa3

Antonio Terceiro terceiro at softwarelivre.org
Fri Mar 18 14:53:32 UTC 2011


The following commit has been merged in the master branch:
commit 403a3279a737141038c33272d57a3c21f43f5a87
Author: Antonio Terceiro <terceiro at softwarelivre.org>
Date:   Thu Mar 17 20:43:47 2011 -0300

    Modularize logic for handling native extensions
    
      * Added a new sample package with a native extension in the root
        directory (instead of under ext/)
      * Extracted native extension detection logic from Gem2Deb::DhMakeRuby,
        Gem2Deb::DhRuby, and Gem2Deb::ExtensionBuilder to Gem2Deb::Metadata.
      * Added support for packages with native extensions in the root
        directory to dh-make-ruby and dh_ruby.

diff --git a/lib/gem2deb/dh_make_ruby.rb b/lib/gem2deb/dh_make_ruby.rb
index f0e0834..d8b60da 100644
--- a/lib/gem2deb/dh_make_ruby.rb
+++ b/lib/gem2deb/dh_make_ruby.rb
@@ -14,6 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 require 'gem2deb'
+require 'gem2deb/metadata'
 require 'rubygems'
 require 'yaml'
 require 'fileutils'
@@ -31,7 +32,7 @@ module Gem2Deb
 
     attr_accessor :gem_version
 
-    attr_accessor :gemspec
+    attr_accessor :metadata
 
     attr_reader :source_package_name
 
@@ -81,15 +82,15 @@ module Gem2Deb
     end
 
     def homepage
-      gemspec && gemspec.homepage
+      metadata.homepage
     end
 
     def short_description
-      gemspec && gemspec.summary
+      metadata.short_description
     end
 
     def long_description
-      gemspec && gemspec.description
+      metadata.long_description
     end
 
     def build
@@ -106,29 +107,24 @@ module Gem2Deb
     end
     
     def read_upstream_source_info
-      read_gemspec
+      read_metadata
       detect_needed_binary_packages
     end
 
-    def read_gemspec
-      metadata_file = 'metadata.yml'
-      if File.exists?(metadata_file)
-        self.gemspec = YAML::load_file(metadata_file)
-      end
+    def read_metadata
+      self.metadata = Gem2Deb::Metadata.new('.')
     end
 
     def detect_needed_binary_packages
       binary_packages << Package.new(source_package_name)
-      if File.directory?('ext')
+      if metadata.has_native_extensions?
         binary_packages << Package.new(source_package_name.sub('ruby-', 'ruby1.8-'))
         binary_packages << Package.new(source_package_name.sub('ruby-', 'ruby1.9.1-'))
       end
 
-      if gemspec
-	binary_packages.each do |package|
-	  gemspec.dependencies.each do |dependency|
-	    package.gem_dependencies << dependency
-	  end
+      binary_packages.each do |package|
+	metadata.dependencies.each do |dependency|
+	  package.gem_dependencies << dependency
 	end
       end
 
@@ -256,9 +252,9 @@ module Gem2Deb
     end
 
     def test_suite
-      if gemspec && !gemspec.test_files.empty?
+      if !metadata.test_files.empty?
         File::open("debian/ruby-test-files.yaml", 'w') do |f|
-          YAML::dump(gemspec.test_files, f)
+          YAML::dump(metadata.test_files, f)
         end
       else
         if File::directory?("test") or File::directory?("spec")
diff --git a/lib/gem2deb/dh_ruby.rb b/lib/gem2deb/dh_ruby.rb
index ab54b30..0153009 100644
--- a/lib/gem2deb/dh_ruby.rb
+++ b/lib/gem2deb/dh_ruby.rb
@@ -32,6 +32,7 @@
 # dh_ruby could generate rdoc (not sure if we want this)
 
 require 'gem2deb'
+require 'gem2deb/metadata'
 require 'find'
 
 module Gem2Deb
@@ -51,23 +52,17 @@ module Gem2Deb
 
     attr_accessor :verbose
 
+    attr_reader :metadata
+
     def initialize
       @verbose = true
       @bindir = '/usr/bin'
+      @metadata = Gem2Deb::Metadata.new('.')
     end
     
     def clean
       puts "Entering dh_ruby --clean" if @verbose
-      if File::directory?('ext')
-        Find::find('ext') do |f|
-          if File::basename(f) == 'Makefile'
-            puts "Running 'make clean' in #{File::dirname(f)}..."
-            Dir::chdir(File::dirname(f)) do
-              system("make clean")
-            end
-          end
-        end
-      end
+      run_make_clean_on_extensions
     end
 
     def configure
@@ -106,7 +101,7 @@ module Gem2Deb
             end
           end
         else
-          if File::directory?('ext')
+          if metadata.has_native_extensions?
             if not SUPPORTED_RUBY_VERSIONS.has_key?(rubyver)
               puts "Unknown Ruby version: #{rubyver}"
               exit(1)
@@ -351,5 +346,19 @@ module Gem2Deb
       end
     end
 
+    def run_make_clean_on_extensions
+      if metadata.has_native_extensions?
+        metadata.native_extensions.each do |extension|
+          extension_dir = File.dirname(extension)
+          if File.exists?(File.join(extension_dir, 'Makefile'))
+            puts "Running 'make clean' in #{extension_dir}..."
+            Dir.chdir(extension_dir) do
+              run 'make clean'
+            end
+          end
+        end
+      end
+    end
+
   end
 end
diff --git a/lib/gem2deb/extension_builder.rb b/lib/gem2deb/extension_builder.rb
index c89c5d5..bd09e6b 100644
--- a/lib/gem2deb/extension_builder.rb
+++ b/lib/gem2deb/extension_builder.rb
@@ -17,6 +17,7 @@ require 'gem2deb'
 require 'yaml'
 require 'rubygems/ext'
 require 'yaml'
+require 'gem2deb/metadata'
 
 module Gem2Deb
   class ExtensionBuilder
@@ -76,11 +77,8 @@ module Gem2Deb
     end
 
     def self.all_extensions
-      if File.exists?('metadata.yml')
-        YAML.load_file('metadata.yml').extensions
-      else
-        Dir.glob('ext/**/{extconf.rb,configure,Rakefile}')
-      end
+      @metadata ||= Gem2Deb::Metadata.new('.')
+      @metadata.native_extensions
     end
   end
 end
diff --git a/lib/gem2deb/metadata.rb b/lib/gem2deb/metadata.rb
new file mode 100644
index 0000000..527a12a
--- /dev/null
+++ b/lib/gem2deb/metadata.rb
@@ -0,0 +1,72 @@
+require 'rubygems'
+require 'rubygems/specification'
+
+module Gem2Deb
+  class Metadata
+
+    attr_reader :gemspec
+
+    attr_reader :native_extensions
+
+    def initialize(directory)
+      Dir.chdir(directory) do
+        load_gemspec
+        if gemspec
+          initialize_from_gemspec
+        else
+          initialize_without_gemspec
+        end
+      end
+    end
+
+    def has_native_extensions?
+      native_extensions.size > 0
+    end
+
+    def homepage
+      gemspec && gemspec.homepage
+    end
+
+    def short_description
+      gemspec && gemspec.summary
+    end
+
+    def long_description
+      gemspec && gemspec.description
+    end
+
+    def dependencies
+      gemspec ? gemspec.dependencies : []
+    end
+
+    def test_files
+      gemspec ? gemspec.test_files : []
+    end
+
+    protected
+
+    def load_gemspec
+      if File.exists?('metadata.yml')
+        @gemspec = YAML.load_file('metadata.yml')
+      else
+        gemspec_files = Dir.glob('*.gemspec')
+        if gemspec_files.size == 1
+          @gemspec = Gem::Specification.load(gemspec_files.first)
+        else
+          unless gemspec_files.empty?
+            raise "More than one .gemspec file in this directory: #{gemspec_files.join(', ')}"
+          end
+        end
+      end
+    end
+
+    def initialize_from_gemspec
+      @native_extensions = gemspec.extensions
+    end
+
+    def initialize_without_gemspec
+      @native_extensions = Dir.glob('**/extconf.rb') + Dir.glob('ext/**/{configure,Rakefile}')
+    end
+
+  end
+end
diff --git a/test/helper/samples.rb b/test/helper/samples.rb
index 1e14b9b..2cb3427 100644
--- a/test/helper/samples.rb
+++ b/test/helper/samples.rb
@@ -15,6 +15,10 @@ class Gem2DebTestCase
     SIMPLE_EXTENSION_DIRNAME  = SIMPLE_EXTENSION_NAME + '-1.2.3'
     SIMPLE_EXTENSION          = File.join(SAMPLE_DIR, "#{SIMPLE_EXTENSION_NAME}/pkg/#{SIMPLE_EXTENSION_DIRNAME}.gem")
 
+    SIMPLE_ROOT_EXTENSION_NAME    = 'simpleextension_in_root'
+    SIMPLE_ROOT_EXTENSION_DIRNAME = SIMPLE_ROOT_EXTENSION_NAME.gsub('_', '-') + '-1.2.3'
+    SIMPLE_ROOT_EXTENSION         = File.join(SAMPLE_DIR, SIMPLE_ROOT_EXTENSION_NAME, 'pkg', "#{SIMPLE_ROOT_EXTENSION_NAME}-1.2.3.gem")
+
     SIMPLE_TGZ_NAME       = 'simpletgz'
     SIMPLE_TGZ_DIRNAME    = SIMPLE_TGZ_NAME + '-0.0.1'
     SIMPLE_TGZ            = File.join(SAMPLE_DIR, "#{SIMPLE_TGZ_NAME}/pkg/#{SIMPLE_TGZ_DIRNAME}.tgz")
diff --git a/test/sample/simpleextension_in_root/Rakefile b/test/sample/simpleextension_in_root/Rakefile
new file mode 100644
index 0000000..ef1b287
--- /dev/null
+++ b/test/sample/simpleextension_in_root/Rakefile
@@ -0,0 +1,24 @@
+require 'rubygems'
+require 'rake/gempackagetask'
+
+spec = Gem::Specification.new do |s|
+  s.platform = Gem::Platform::RUBY
+  s.summary = "Simple native extension with extconf.rb in root directory used to test dh_ruby"
+  s.name = 'simpleextension_in_root'
+  s.version = '1.2.3'
+  s.requirements << 'none'
+  s.require_path = '.'
+  s.extensions << 'extconf.rb'
+  #s.autorequire = 'rake'
+  s.files = ['extconf.rb', 'simpleextension_in_root.c']
+  s.description = <<EOF
+simpleextension_in_root is a simple native extension that is used to test
+dh_ruby. It contains a Ruby native extension in the root of the source
+directory, instead of inside ext/ subdirectory.
+EOF
+end
+
+Rake::GemPackageTask.new(spec) do |pkg|
+  pkg.need_zip = false
+  pkg.need_tar = false
+end
diff --git a/test/sample/simpleextension_in_root/extconf.rb b/test/sample/simpleextension_in_root/extconf.rb
new file mode 100644
index 0000000..fc28331
--- /dev/null
+++ b/test/sample/simpleextension_in_root/extconf.rb
@@ -0,0 +1,2 @@
+require 'mkmf'
+create_makefile('simpleextension_in_root')
diff --git a/test/sample/simplemixed/pkg/simplemixed-1.2.3.gem b/test/sample/simpleextension_in_root/pkg/simpleextension_in_root-1.2.3.gem
similarity index 57%
copy from test/sample/simplemixed/pkg/simplemixed-1.2.3.gem
copy to test/sample/simpleextension_in_root/pkg/simpleextension_in_root-1.2.3.gem
index f030677..e7b5139 100644
Binary files a/test/sample/simplemixed/pkg/simplemixed-1.2.3.gem and b/test/sample/simpleextension_in_root/pkg/simpleextension_in_root-1.2.3.gem differ
diff --git a/test/sample/simpleextension_in_root/simpleextension_in_root.c b/test/sample/simpleextension_in_root/simpleextension_in_root.c
new file mode 100644
index 0000000..260f600
--- /dev/null
+++ b/test/sample/simpleextension_in_root/simpleextension_in_root.c
@@ -0,0 +1,5 @@
+#include "ruby.h"
+
+void Init_simpleextension_in_root() {
+  rb_define_module("SimpleExtensionInRoot");
+}
diff --git a/test/unit/dh_make_ruby_test.rb b/test/unit/dh_make_ruby_test.rb
index f7cdd5a..df6df2b 100644
--- a/test/unit/dh_make_ruby_test.rb
+++ b/test/unit/dh_make_ruby_test.rb
@@ -70,6 +70,26 @@ class DhMakeRubyTest < Gem2DebTestCase
     end
   end
 
+  DEBIANIZED_SIMPLE_ROOT_EXTENSION = File.join(tmpdir, 'ruby-' + SIMPLE_ROOT_EXTENSION_DIRNAME.gsub('_', '-'))
+  SIMPLE_ROOT_EXTENSION_UPSTREAM_TARBALL = DEBIANIZED_SIMPLE_ROOT_EXTENSION + '.tar.gz'
+  one_time_setup do
+   Gem2Deb::Gem2Tgz.convert!(SIMPLE_ROOT_EXTENSION, SIMPLE_ROOT_EXTENSION_UPSTREAM_TARBALL)
+   Gem2Deb::DhMakeRuby.new(SIMPLE_ROOT_EXTENSION_UPSTREAM_TARBALL).build
+  end
+
+  context 'native extension with extconf.rb in the sources root' do
+    should 'generate one package for ruby1.8' do
+      Dir.chdir(DEBIANIZED_SIMPLE_ROOT_EXTENSION) do
+        assert(packages.include?('ruby1.8-simpleextension-in-root'), "Package ruby1.8-simpleextension-in-root not created")
+      end
+    end
+    should 'generate one package for ruby1.9.1' do
+      Dir.chdir(DEBIANIZED_SIMPLE_ROOT_EXTENSION) do
+        assert(packages.include?('ruby1.9.1-simpleextension-in-root'), "Package ruby1.9.1-simpleextension-in-root not created")
+      end
+    end
+  end
+
   DEBIANIZED_SIMPLE_PROGRAM       = File.join(tmpdir, SIMPLE_PROGRAM_DIRNAME)
   SIMPLE_PROGRAM_UPSTREAM_TARBALL = DEBIANIZED_SIMPLE_PROGRAM + '.tar.gz'
   one_time_setup do
diff --git a/test/unit/dh_ruby_test.rb b/test/unit/dh_ruby_test.rb
index 8532b5d..0310898 100644
--- a/test/unit/dh_ruby_test.rb
+++ b/test/unit/dh_ruby_test.rb
@@ -11,6 +11,7 @@ class DhRubyTest < Gem2DebTestCase
     build(SIMPLE_PROGRAM, SIMPLE_PROGRAM_DIRNAME)
     build(SIMPLE_EXTENSION, SIMPLE_EXTENSION_DIRNAME)
     build(SIMPLE_MIXED, SIMPLE_MIXED_DIRNAME)
+    build(SIMPLE_ROOT_EXTENSION, SIMPLE_ROOT_EXTENSION_DIRNAME)
   end
 
   context 'installing simplegem' do
@@ -48,6 +49,20 @@ class DhRubyTest < Gem2DebTestCase
     end
   end
 
+  context 'installing native extension with extconf.rb in the sources root' do
+    arch = RbConfig::CONFIG['arch']
+    {
+      '1.8'   => 'ruby1.8',
+      '1.9.1' => 'ruby1.9.1',
+    }.each do |version_number, version_name|
+      target_so = "/usr/lib/ruby/vendor_ruby/#{version_number}/#{arch}/simpleextension_in_root.so"
+      should "install native extension for #{version_name}" do
+        assert_installed SIMPLE_ROOT_EXTENSION_DIRNAME, "#{version_name}-simpleextension-in-root", target_so
+      end
+    end
+
+  end
+
   context 'determining ruby version for package' do
     {
       'foo' => 'ruby',
diff --git a/test/unit/metadata_test.rb b/test/unit/metadata_test.rb
new file mode 100644
index 0000000..9f629bc
--- /dev/null
+++ b/test/unit/metadata_test.rb
@@ -0,0 +1,81 @@
+require 'test_helper'
+require 'gem2deb/metadata'
+require 'yaml'
+
+class MetaDataTest < Gem2DebTestCase
+
+  {
+    'simpleextension'         => true,
+    'simpleextension_in_root' => true,
+    'simplegem'               => false,
+    'simplemixed'             => true,
+    'simpleprogram'           => false,
+    'simpletgz'               => false,
+  }.each do |source_package, has_extensions|
+    should "correctly detect native extensions for #{source_package}" do
+      assert_equal has_extensions, Gem2Deb::Metadata.new(File.join('test/sample', source_package)).has_native_extensions?
+    end
+  end
+
+  def setup
+    FileUtils.mkdir_p('test/tmp')
+    @metadata = Gem2Deb::Metadata.new('test/tmp')
+  end
+
+  def teardown
+    FileUtils.rmdir('test/tmp')
+  end
+
+  context 'without gemspec' do
+    should 'have no homepage' do
+      assert_nil @metadata.homepage
+    end
+    should 'have no short description' do
+      assert_nil @metadata.short_description
+    end
+    should 'have no long description' do
+      assert_nil @metadata.long_description
+    end
+    should 'have no dependencies' do
+      assert_equal [], @metadata.dependencies
+    end
+    should 'have no test files' do
+      assert_equal [], @metadata.test_files
+    end
+  end
+
+  context 'with gemspec' do
+    setup do
+      @gemspec = mock
+      @metadata.stubs(:gemspec).returns(@gemspec)
+    end
+
+    should 'obtain homepage from gemspec' do
+      @gemspec.stubs(:homepage).returns('http://www.debian.org/')
+      assert_equal 'http://www.debian.org/', @metadata.homepage
+    end
+
+    should 'obtain short description from gemspec' do
+      @gemspec.stubs(:summary).returns('This library does stuff')
+      assert_equal 'This library does stuff', @metadata.short_description
+    end
+
+    should 'obtain long detect from gemspec' do
+      @gemspec.stubs(:description).returns('This is the long description, bla bla bla')
+      assert_equal 'This is the long description, bla bla bla', @metadata.long_description
+    end
+
+    should 'obtain dependencies list from gemspec' do
+      @gemspec.stubs(:dependencies).returns(['gem1', 'gem2'])
+      assert_equal ['gem1', 'gem2'], @metadata.dependencies
+    end
+
+    should 'obtain test files list from gemspec' do
+      @gemspec.stubs(:test_files).returns(['test/class1_test.rb', 'test/class2_test.rb'])
+      assert_equal ['test/class1_test.rb', 'test/class2_test.rb'], @metadata.test_files
+    end
+
+  end
+
+end
+

-- 
gem2deb.git



More information about the Pkg-ruby-extras-commits mailing list