gem2rpm 0.11.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,60 @@
1
+ require 'gem2rpm/rpm_dependency'
2
+
3
+ module Gem2Rpm
4
+ class RpmDependencyList
5
+ include Enumerable
6
+
7
+ def initialize(dependencies)
8
+ @items = dependencies.map { |r| RpmDependency.new(r) }
9
+ end
10
+
11
+ # Calls the given block once for each element in self, passing that
12
+ # element as a parameter. Returns the array itself.
13
+ # If no block is given, an Enumerator is returned.
14
+ def each
15
+ # Return Enumerator when called withoug block.
16
+ return to_enum(__callee__) unless block_given?
17
+
18
+ @items.each { |item| yield item }
19
+ end
20
+
21
+ # Returns a new array containing the items in self for which the given
22
+ # block is not true. The ordering of non-rejected elements is maintained.
23
+ # If no block is given, an Enumerator is returned instead.
24
+ def reject
25
+ # Return Enumerator when called withoug block.
26
+ return to_enum(__callee__) unless block_given?
27
+
28
+ self.class.new(@items.reject { |item| yield item })
29
+ end
30
+
31
+ # Convert to rubygem() virtual provide dependencies.
32
+ def virtualize
33
+ dep_list = self.map(&:virtualize)
34
+
35
+ self.class.new dep_list
36
+ end
37
+
38
+ # Output dependencies with RPM requires tag.
39
+ def with_requires
40
+ dep_list = self.map(&:with_requires)
41
+
42
+ self.class.new dep_list
43
+ end
44
+
45
+ # Comment out the dependency.
46
+ def comment_out
47
+ dep_list = self.map(&:comment_out)
48
+
49
+ self.class.new dep_list
50
+ end
51
+
52
+ # Returns string with all dependencies from the list converted into entries
53
+ # suitable for RPM .spec file. Thise entries should include all necessary
54
+ # macros depending on file categorization.
55
+ def to_rpm
56
+ s = entries.map(&:to_rpm).join("\n")
57
+ s += "\n" unless s.empty?
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,51 @@
1
+ require 'pathname'
2
+ require 'gem2rpm/helpers'
3
+
4
+ module Gem2Rpm
5
+ class RpmFile < String
6
+ # Returns string with entry suitable for RPM .spec file. This typically
7
+ # includes all necessary macros depending on file categorization.
8
+ def to_rpm
9
+ config = Gem2Rpm::Configuration.instance
10
+
11
+ case
12
+ when license?
13
+ "#{config.macro_for(:license)} #{config.macro_for(:instdir)}/#{self}".strip
14
+ when doc?
15
+ "#{config.macro_for(:doc)} #{config.macro_for(:instdir)}/#{self}".strip
16
+ when ignore?
17
+ "#{config.macro_for(:ignore)} #{config.macro_for(:instdir)}/#{self}".strip
18
+ # /lib should have its own macro
19
+ when self == 'lib'
20
+ "#{config.macro_for(:libdir)}"
21
+ else
22
+ "#{config.macro_for(:instdir)}/#{self}"
23
+ end
24
+ end
25
+
26
+ # Returs true for documentation files.
27
+ def doc?
28
+ Helpers.check_str_on_conditions(self, Gem2Rpm::Configuration.instance.rule_for(:doc))
29
+ end
30
+
31
+ # Returns true for license files.
32
+ def license?
33
+ Helpers.check_str_on_conditions(self, Gem2Rpm::Configuration.instance.rule_for(:license))
34
+ end
35
+
36
+ # Returns true for files which should be ommited from the package.
37
+ def ignore?
38
+ Helpers.check_str_on_conditions(self, Gem2Rpm::Configuration.instance.rule_for(:ignore))
39
+ end
40
+
41
+ # Returns true for files which are part of package test suite.
42
+ def test?
43
+ Helpers.check_str_on_conditions(self, Gem2Rpm::Configuration.instance.rule_for(:test))
44
+ end
45
+
46
+ # Returns true for other known miscellaneous files.
47
+ def misc?
48
+ Helpers.check_str_on_conditions(self, Gem2Rpm::Configuration.instance.rule_for(:misc))
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,55 @@
1
+ require 'gem2rpm/rpm_file'
2
+
3
+ module Gem2Rpm
4
+ class RpmFileList
5
+ include Enumerable
6
+
7
+ # Returns a new file list created from the array of files (e.g.
8
+ # Gem2Rpm::Specification.files).
9
+ def initialize(files)
10
+ @items = files.map { |f| RpmFile.new(f) }
11
+ end
12
+
13
+ # Calls the given block once for each element in self, passing that
14
+ # element as a parameter. Returns the array itself.
15
+ # If no block is given, an Enumerator is returned.
16
+ def each
17
+ # Return Enumerator when called withoug block.
18
+ return to_enum(__callee__) unless block_given?
19
+
20
+ @items.each { |item| yield item }
21
+ end
22
+
23
+ # Returns a new array containing the items in self for which the given
24
+ # block is not true. The ordering of non-rejected elements is maintained.
25
+ # If no block is given, an Enumerator is returned instead.
26
+ def reject
27
+ # Return Enumerator when called withoug block.
28
+ return to_enum(__callee__) unless block_given?
29
+
30
+ self.class.new(@items.reject { |item| yield item })
31
+ end
32
+
33
+ # Returns a list of top level directories and files, omit all subdirectories.
34
+ def top_level_entries
35
+ self.class.new(entries.map { |f| f.gsub!(/([^\/]*).*/, '\1') }.uniq)
36
+ end
37
+
38
+ # Returns new list of files suitable for main.
39
+ def main_entries
40
+ self.class.new(entries.delete_if { |f| (f.doc? && !f.license?) || f.misc? || f.test? })
41
+ end
42
+
43
+ # Returns new list of files suitable for -doc subpackage.
44
+ def doc_entries
45
+ self.class.new(entries.delete_if { |f| !((f.doc? && !f.license?) || f.misc? || f.test?) })
46
+ end
47
+
48
+ # Returns string with all files from the list converted into entries
49
+ # suitable for RPM .spec file. Thise entries should include all necessary
50
+ # macros depending on file categorization.
51
+ def to_rpm
52
+ entries.map(&:to_rpm).join("\n")
53
+ end
54
+ end
55
+ end
@@ -25,18 +25,19 @@ module Gem2Rpm
25
25
  # when looking for vagrant templates for example.
26
26
  def self.find(name = nil, options = {})
27
27
  if name.nil?
28
- case options[:gem_file]
28
+ gem_file = File.basename(options[:gem_file]) if options[:gem_file]
29
+ case gem_file
29
30
  when /^vagrant(-|_).*/
30
- Gem2Rpm::VAGRANT_PLUGIN_TEMPLATE
31
+ Gem2Rpm.vagrant_plugin_template
31
32
  else
32
- Gem2Rpm::RUBYGEM_TEMPLATE
33
+ Gem2Rpm.rubygem_template
33
34
  end
34
35
  else
35
36
  begin
36
- if File.exists?(name)
37
+ if File.exist?(name)
37
38
  Gem2Rpm::Template.new(name)
38
39
  else
39
- Gem2Rpm::Template.new(File.join(Gem2Rpm::Template::default_location, name + '.spec.erb'))
40
+ Gem2Rpm::Template.new(File.join(Gem2Rpm::Template.default_location, name + '.spec.erb'))
40
41
  end
41
42
  rescue TemplateError
42
43
  raise TemplateError, "Could not locate template #{name}"
@@ -47,17 +48,17 @@ module Gem2Rpm
47
48
  # Create instance of Template class of specified template filename.
48
49
  # TemplateError is raised when the template file does not exists.
49
50
  def initialize(filename)
50
- if File.exists? filename
51
+ if File.exist? filename
51
52
  @filename = filename
52
53
  else
53
- raise TemplateError, "Could not locate template #{filename}"
54
+ fail TemplateError, "Could not locate template #{filename}"
54
55
  end
55
56
  end
56
57
 
57
58
  # Read the content of the template file.
58
59
  def read
59
60
  @content ||= begin
60
- File.open(@filename, OPEN_MODE) {|f| f.read }
61
+ File.open(@filename, OPEN_MODE, &:read)
61
62
  end
62
63
  end
63
64
  end
@@ -1,23 +1,24 @@
1
+ require 'gem2rpm/rpm_file_list'
2
+ require 'gem2rpm/rpm_dependency'
3
+
1
4
  module Gem2Rpm
2
5
  module TemplateHelpers
3
6
  # File list block for the main package
4
7
  def main_file_entries(spec)
5
- entries = Helpers.top_level_from_file_list(spec.files)
6
- entries.delete_if{ |f| Helpers.doc_file?(f) || Helpers.misc_file?(f) }
7
- Helpers.file_entries_to_rpm(entries)
8
+ entries = RpmFileList.new(spec.files).top_level_entries.main_entries
9
+ entries.to_rpm
8
10
  end
9
11
 
10
12
  # File list block for the doc sub-package
11
13
  def doc_file_entries(spec)
12
- entries = Helpers.top_level_from_file_list(spec.files)
13
- entries.delete_if{ |f| !(Helpers.doc_file?(f) || Helpers.misc_file?(f)) }
14
- Helpers.file_entries_to_rpm(entries)
14
+ entries = RpmFileList.new(spec.files).top_level_entries.doc_entries
15
+ entries.to_rpm
15
16
  end
16
17
 
17
18
  # Provides well formatted requirement with version.
18
19
  def requirement(name, version = nil)
19
20
  version = nil if version && version.to_s.empty?
20
- [name, version].compact.join(' ')
21
+ RpmDependency.new(Gem::Dependency.new(name, version)).to_rpm
21
22
  end
22
23
  end
23
24
  end
@@ -0,0 +1,46 @@
1
+ require 'gem2rpm/rpm_file_list'
2
+
3
+ module Gem2Rpm
4
+ class TestSuite
5
+ include Enumerable
6
+
7
+ TestFramework = Struct.new :name, :command
8
+
9
+ TEST_FRAMEWORKS = [
10
+ TestFramework.new('cucumber', %|cucumber|),
11
+ TestFramework.new('minitest', %|ruby -e 'Dir.glob "./test/**/*_test.rb", &method(:require)'|),
12
+ TestFramework.new('rspec', %|rspec spec|),
13
+ TestFramework.new('shindo', %|shindont|),
14
+ TestFramework.new('test-unit', %|ruby -e 'Dir.glob "./test/**/*_test.rb", &method(:require)'|),
15
+ TestFramework.new('bacon', %|bacon -a|),
16
+ ].freeze
17
+
18
+ # Returns new test suite list detected from Gem::Specification.
19
+ def initialize(spec)
20
+ @items = detect_test_frameworks(spec)
21
+ end
22
+
23
+ # Calls the given block once for each element in self, passing that
24
+ # element as a parameter. Returns the array itself.
25
+ # If no block is given, an Enumerator is returned.
26
+ def each
27
+ # Return Enumerator when called withoug block.
28
+ return to_enum(__callee__) unless block_given?
29
+
30
+ @items.each { |item| yield item }
31
+ end
32
+
33
+ private
34
+
35
+ def detect_test_frameworks(spec)
36
+ from_development_dependencies(spec)
37
+ # TODO: Try to guess the test framework from spec.files. This could
38
+ # improve the test execution command a bit, but might not be reliable.
39
+ end
40
+
41
+ def from_development_dependencies(spec)
42
+ deps = spec.development_dependencies.map(&:name)
43
+ TEST_FRAMEWORKS.select { |tf| deps.include?(tf.name) }.map(&:dup)
44
+ end
45
+ end
46
+ end
@@ -14,9 +14,6 @@ Source0: <%= download_path %>%{vagrant_plugin_name}-%{version}.gem
14
14
  Requires(posttrans): vagrant
15
15
  Requires(preun): vagrant
16
16
  Requires: vagrant
17
- BuildRequires: ruby(release)
18
- BuildRequires: rubygems-devel
19
- BuildRequires: ruby
20
17
  BuildRequires: vagrant
21
18
  <% if spec.extensions.empty? -%>
22
19
  BuildArch: noarch
@@ -0,0 +1,112 @@
1
+ # Generated from <%= spec.file_name %> by gem2rpm -*- rpm-spec -*-
2
+ %global vagrant_plugin_name <%= spec.name %>
3
+
4
+ Name: %{vagrant_plugin_name}
5
+ Version: <%= spec.version %>
6
+ Release: 1%{?dist}
7
+ Summary: <%= spec.summary.gsub(/\.$/, "") %>
8
+ License: <%= spec.licenses.join(" and ") %>
9
+ <% if spec.homepage -%>
10
+ URL: <%= spec.homepage %>
11
+ <% end -%>
12
+ Source0: <%= download_path %>%{vagrant_plugin_name}-%{version}.gem
13
+ Requires: vagrant
14
+ BuildRequires: vagrant
15
+ <% if spec.extensions.empty? -%>
16
+ BuildArch: noarch
17
+ <% end -%>
18
+ Provides: vagrant(%{vagrant_plugin_name}) = %{version}
19
+
20
+ %description
21
+ <%= spec.description %>
22
+
23
+ <% if doc_subpackage -%>
24
+ %package doc
25
+ Summary: Documentation for %{name}
26
+ Requires: %{name} = %{version}-%{release}
27
+ BuildArch: noarch
28
+
29
+ %description doc
30
+ Documentation for %{name}.
31
+ <% end # if doc_subpackage -%>
32
+
33
+ %prep
34
+ gem unpack %{SOURCE0}
35
+
36
+ %setup -q -D -T -n %{vagrant_plugin_name}-%{version}
37
+
38
+ gem spec %{SOURCE0} -l --ruby > %{vagrant_plugin_name}.gemspec
39
+
40
+ %build
41
+ # Create the gem as gem install only works on a gem file
42
+ gem build %{vagrant_plugin_name}.gemspec
43
+
44
+ # %%vagrant_plugin_install compiles any C extensions and installs the gem into ./%%gem_dir
45
+ # by default, so that we can move it into the buildroot in %%install
46
+ %vagrant_plugin_install
47
+
48
+ %install
49
+ mkdir -p %{buildroot}%{vagrant_plugin_dir}
50
+ cp -a .%{vagrant_plugin_dir}/* \
51
+ %{buildroot}%{vagrant_plugin_dir}/
52
+
53
+ <% unless spec.extensions.empty? -%>
54
+ mkdir -p %{buildroot}%{vagrant_plugin_extdir_mri}
55
+ cp -a .%{vagrant_plugin_extdir_mri}/{gem.build_complete,*.so} %{buildroot}%{vagrant_plugin_extdir_mri}/
56
+
57
+ <% for ext in spec.extensions -%>
58
+ # Prevent dangling symlink in -debuginfo (rhbz#878863).
59
+ rm -rf %{buildroot}%{vagrant_plugin_instdir}/<%= ext.split(File::SEPARATOR).first %>/
60
+ <% end -%>
61
+ <% end -%>
62
+
63
+ <% unless spec.executables.empty? -%>
64
+ mkdir -p %{buildroot}%{_bindir}
65
+ cp -a .%{_bindir}/* \
66
+ %{buildroot}%{_bindir}/
67
+
68
+ find %{buildroot}%{vagrant_plugin_instdir}/<%= spec.bindir %> -type f | xargs chmod a+x
69
+ <% end -%>
70
+
71
+ %check
72
+ pushd .%{gem_instdir}
73
+ <% if tests.entries.empty? -%>
74
+ # Run the test suite.
75
+ <% end -%>
76
+ <% for t in tests -%>
77
+ # <%= t.command %>
78
+ <% end -%>
79
+ popd
80
+
81
+ <%
82
+ # Change macros for Vagrant packaging
83
+ config.macros[:instdir] = '%{vagrant_plugin_instdir}'
84
+ config.macros[:libdir] = '%{vagrant_plugin_libdir}'
85
+ -%>
86
+ %files
87
+ %dir %{vagrant_plugin_instdir}
88
+ <% for f in spec.executables -%>
89
+ %{_bindir}/<%= f %>
90
+ <% end -%>
91
+ <% unless spec.extensions.empty? -%>
92
+ %{vagrant_plugin_extdir_mri}
93
+ <% end -%>
94
+ <%= main_files.reject do |item|
95
+ spec.extensions.detect { |extension| item =~ /^#{extension.split(File::SEPARATOR).first}$/}
96
+ end.to_rpm %>
97
+ <% unless doc_subpackage -%>
98
+ %doc %{vagrant_plugin_docdir}
99
+ <%= doc_files.to_rpm %>
100
+ <% end -%>
101
+ %exclude %{vagrant_plugin_cache}
102
+ %{vagrant_plugin_spec}
103
+
104
+ <% if doc_subpackage -%>
105
+ %files doc
106
+ %doc %{vagrant_plugin_docdir}
107
+ <%= files.top_level_entries.doc_entries.to_rpm %>
108
+ <% end # if doc_subpackage -%>
109
+
110
+ %changelog
111
+ * <%= Time.now.strftime("%a %b %d %Y") %> <%= packager %> - <%= spec.version %>-1
112
+ - Initial package
@@ -0,0 +1,119 @@
1
+ # Generated from <%= spec.file_name %> by gem2rpm -*- rpm-spec -*-
2
+ %global gem_name <%= spec.name %>
3
+
4
+ Name: rubygem-%{gem_name}
5
+ Version: <%= spec.version %>
6
+ Release: 1%{?dist}
7
+ Summary: <%= spec.summary.gsub(/\.$/, "") %>
8
+ License: <%= spec.licenses.join(" and ") %>
9
+ <% if spec.homepage -%>
10
+ URL: <%= spec.homepage %>
11
+ <% end -%>
12
+ Source0: <%= download_path %>%{gem_name}-%{version}.gem
13
+ BuildRequires: ruby(release)
14
+ <% for req in spec.required_rubygems_version -%>
15
+ BuildRequires: <%= requirement 'rubygems-devel', req %>
16
+ <% end -%>
17
+ <% for req in spec.required_ruby_version -%>
18
+ BuildRequires: <%= requirement "ruby#{'-devel' unless spec.extensions.empty?}", req %>
19
+ <% end -%>
20
+ <% unless spec.extensions.empty? -%>
21
+ # Compiler is required for build of gem binary extension.
22
+ # https://fedoraproject.org/wiki/Packaging:C_and_C++#BuildRequires_and_Requires
23
+ BuildRequires: gcc
24
+ <% end -%>
25
+ <%= development_dependencies.reject do |d|
26
+ ["rdoc", "rake", "bundler"].include? d.name
27
+ end.virtualize.with_requires.comment_out.to_rpm -%>
28
+ <% if spec.extensions.empty? -%>
29
+ BuildArch: noarch
30
+ <% end -%>
31
+
32
+ %description
33
+ <%= spec.description %>
34
+
35
+ <% if doc_subpackage -%>
36
+ %package doc
37
+ Summary: Documentation for %{name}
38
+ Requires: %{name} = %{version}-%{release}
39
+ BuildArch: noarch
40
+
41
+ %description doc
42
+ Documentation for %{name}.
43
+ <% end # if doc_subpackage -%>
44
+
45
+ %prep
46
+ gem unpack %{SOURCE0}
47
+
48
+ %setup -q -D -T -n %{gem_name}-%{version}
49
+
50
+ gem spec %{SOURCE0} -l --ruby > %{gem_name}.gemspec
51
+
52
+ %build
53
+ # Create the gem as gem install only works on a gem file
54
+ gem build %{gem_name}.gemspec
55
+
56
+ # %%gem_install compiles any C extensions and installs the gem into ./%%gem_dir
57
+ # by default, so that we can move it into the buildroot in %%install
58
+ %gem_install
59
+
60
+ %install
61
+ mkdir -p %{buildroot}%{gem_dir}
62
+ cp -a .%{gem_dir}/* \
63
+ %{buildroot}%{gem_dir}/
64
+
65
+ <% unless spec.extensions.empty? -%>
66
+ mkdir -p %{buildroot}%{gem_extdir_mri}
67
+ cp -a .%{gem_extdir_mri}/{gem.build_complete,*.so} %{buildroot}%{gem_extdir_mri}/
68
+
69
+ <% for ext in spec.extensions -%>
70
+ # Prevent dangling symlink in -debuginfo (rhbz#878863).
71
+ rm -rf %{buildroot}%{gem_instdir}/<%= ext.split(File::SEPARATOR).first %>/
72
+ <% end -%>
73
+ <% end -%>
74
+
75
+ <% unless spec.executables.empty? -%>
76
+ mkdir -p %{buildroot}%{_bindir}
77
+ cp -a .%{_bindir}/* \
78
+ %{buildroot}%{_bindir}/
79
+
80
+ find %{buildroot}%{gem_instdir}/<%= spec.bindir %> -type f | xargs chmod a+x
81
+ <% end -%>
82
+
83
+ %check
84
+ pushd .%{gem_instdir}
85
+ <% if tests.entries.empty? -%>
86
+ # Run the test suite.
87
+ <% end -%>
88
+ <% for t in tests -%>
89
+ # <%= t.command %>
90
+ <% end -%>
91
+ popd
92
+
93
+ %files
94
+ %dir %{gem_instdir}
95
+ <% for f in spec.executables -%>
96
+ %{_bindir}/<%= f %>
97
+ <% end -%>
98
+ <% unless spec.extensions.empty? -%>
99
+ %{gem_extdir_mri}
100
+ <% end -%>
101
+ <%= main_files.reject do |item|
102
+ spec.extensions.detect { |extension| item =~ /^#{extension.split(File::SEPARATOR).first}$/}
103
+ end.to_rpm %>
104
+ <% unless doc_subpackage -%>
105
+ %doc %{gem_docdir}
106
+ <%= doc_files.to_rpm %>
107
+ <% end -%>
108
+ %exclude %{gem_cache}
109
+ %{gem_spec}
110
+
111
+ <% if doc_subpackage -%>
112
+ %files doc
113
+ %doc %{gem_docdir}
114
+ <%= doc_files.to_rpm %>
115
+ <% end # if doc_subpackage -%>
116
+
117
+ %changelog
118
+ * <%= Time.now.strftime("%a %b %d %Y") %> <%= packager %> - <%= spec.version %>-1
119
+ - Initial package