gembuilder 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,8 @@
1
+ == 1.1.0 / 2007-05-19
2
+
3
+ * Cleanup code for release
4
+
5
+ == 1.0.0 / 2007-05-11
6
+
7
+ * Initial (very sloppy) gemification
8
+
data/Manifest.txt ADDED
@@ -0,0 +1,7 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/gembuilder
6
+ lib/gembuilder.rb
7
+ test/test_gembuilder.rb
data/README.txt ADDED
@@ -0,0 +1,51 @@
1
+ gembuilder
2
+ by Patrick Hurley
3
+ http://rubyforge.org/projects/gembuilder/
4
+
5
+ == DESCRIPTION:
6
+
7
+ Build a binary gem from an existing gem for your platform.
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Would be better if it could gather the gem automatically out of the gem cache.
12
+ * Should also have an option to attempt to cleanup intermediate files (.o/.obj)
13
+
14
+ == SYNOPSIS:
15
+
16
+ Build your gem so that it can be deployed on machines without a build chain
17
+
18
+ == REQUIREMENTS:
19
+
20
+ * GEM and a binary build chain
21
+
22
+ == INSTALL:
23
+
24
+ * Install with gem, then just:
25
+
26
+ gembuilder <gem_file>
27
+
28
+ == LICENSE:
29
+
30
+ (The MIT License)
31
+
32
+ Copyright (c) 2007 Patrick Hurley
33
+
34
+ Permission is hereby granted, free of charge, to any person obtaining
35
+ a copy of this software and associated documentation files (the
36
+ 'Software'), to deal in the Software without restriction, including
37
+ without limitation the rights to use, copy, modify, merge, publish,
38
+ distribute, sublicense, and/or sell copies of the Software, and to
39
+ permit persons to whom the Software is furnished to do so, subject to
40
+ the following conditions:
41
+
42
+ The above copyright notice and this permission notice shall be
43
+ included in all copies or substantial portions of the Software.
44
+
45
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
46
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
47
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
48
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
49
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
50
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
51
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/gembuilder.rb'
6
+
7
+ Hoe.new('gembuilder', GemBuilder::VERSION) do |p|
8
+ p.rubyforge_name = 'gembuilder'
9
+ p.author = 'Patrick Hurley'
10
+ p.email = 'phurley@gmail.com'
11
+
12
+ p.summary = 'Create a binary gem, for the current platform.'
13
+ p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
14
+ p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
15
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
16
+ end
17
+
18
+ # vim: syntax=Ruby
data/bin/gembuilder ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'gembuilder'
5
+ require 'optparse'
6
+
7
+ opts = OptionParser.new
8
+
9
+ conservative = false
10
+
11
+ opts.banner = "Usage: gembuilder [options] gem_file_name"
12
+ opts.on("-d", "--debug", "Enable debug output") { $DEBUG = 1 }
13
+ opts.on("-c", "--conservative", "Do not try and remove intermediate files") { conservative = true }
14
+
15
+ opts.on("-h", "--help", "Show this message") do
16
+ puts opts
17
+ exit
18
+ end
19
+
20
+ argv = opts.parse(ARGV)
21
+
22
+ if argv.empty?
23
+ puts "You must provide the name of a gem on the command line."
24
+ exit 1
25
+ end
26
+
27
+ argv.each do |gem|
28
+ unless File.exists?(gem)
29
+ puts "Skipping #{gem}, file not found."
30
+ next
31
+ end
32
+
33
+ gem_builder = GemBuilder.new(gem)
34
+
35
+ puts "Unpacking #{gem}"
36
+ gem_builder.unpack_gem
37
+
38
+ puts " building extension(s)"
39
+ gem_builder.build_extensions
40
+
41
+ puts " adjusting gemspec"
42
+ gem_builder.fix_gemspec(conservative)
43
+
44
+ puts " building binary gem"
45
+ gem_builder.build_gem
46
+
47
+ puts " cleaning up"
48
+ gem_builder.cleanup
49
+ end
50
+
data/lib/gembuilder.rb ADDED
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rbconfig"
4
+ require "rubygems"
5
+ require "tmpdir"
6
+ require "find"
7
+ require "fileutils"
8
+ Gem.manage_gems
9
+
10
+
11
+ class GemBuilder
12
+ VERSION = '1.1.0'
13
+ OBJEXT = ".#{Config::CONFIG["OBJEXT"]}"
14
+
15
+ # Helper that will do it all
16
+ def self.[](gem,conservative=false)
17
+ gem_builder = GemBuilder.new(gem)
18
+ gem_builder.unpack_gem
19
+ gem_builder.build_extensions
20
+ gem_builder.fix_gemspec(conservative)
21
+ gem_builder.build_gem
22
+ gem_builder.cleanup
23
+ end
24
+
25
+ def initialize(gem)
26
+ @gem_name = gem
27
+ @installer = Gem::Installer.new(@gem_name)
28
+ @format = Gem::Format.from_file_by_path(@gem_name)
29
+ end
30
+
31
+ def tmpdir
32
+ @tmpdir ||= File.join(Dir.tmpdir, "gembuilder")
33
+ end
34
+
35
+ def installer
36
+ @installer ||= Gem::Installer.new(@gem_name)
37
+ end
38
+
39
+ def format
40
+ @format ||= Gem::Format.from_file_by_path(@gem_name)
41
+ end
42
+
43
+ def spec
44
+ @spec ||= format.spec
45
+ end
46
+
47
+ def unpack_gem
48
+ FileUtils.rm_r(tmpdir) rescue nil
49
+ FileUtils.mkdir_p(tmpdir) rescue nil
50
+ installer.unpack(tmpdir)
51
+ end
52
+
53
+ def build_extensions
54
+ installer.build_extensions(tmpdir, format.spec)
55
+ end
56
+
57
+ def platform
58
+ # I used to use this to clean up gem names under
59
+ # darwin, not sure it was a good idea though
60
+ # Config::CONFIG['arch'].sub(/[\.0-9]*$/, '')
61
+ Config::CONFIG['arch']
62
+ end
63
+
64
+ def fix_gemspec(conservative = false)
65
+ files = []
66
+ Find.find(tmpdir) do |fname|
67
+ next if fname == tmpdir
68
+ next if !conservative && File.extname(fname) == OBJEXT
69
+ files << fname.sub(Regexp.quote(tmpdir + "/"), '')
70
+ end
71
+
72
+ spec.extensions = []
73
+ spec.files += (files - format.spec.files)
74
+ spec.platform = platform
75
+ end
76
+
77
+ def build_gem
78
+ start_dir = Dir.pwd
79
+ Dir.chdir(tmpdir) do
80
+ gb = Gem::Builder.new(spec)
81
+ gb.build
82
+ FileUtils.mv Dir.glob("*.gem"), start_dir
83
+ end
84
+ end
85
+
86
+ def cleanup
87
+ FileUtils.rm_rf(tmpdir)
88
+ end
89
+
90
+ end
91
+
@@ -0,0 +1,111 @@
1
+ #
2
+ # Calling all interested testers -- how could I write better tests for this
3
+ # type of code? let me know at phurley@gmail.com -- Thanks!!!
4
+ #
5
+ # Could put all the tests in one methods and test them inline?
6
+ # this is an optimization, so I am holding off, the test time
7
+ # is not too bad now that I use a simple project.
8
+ #
9
+ # Add tests for complex gems (with multiple extensions)
10
+ #
11
+ # Should probably verify that the gem is installable
12
+ # as well, but I am not sure how far to go down that
13
+ # road (probably all the way, but it seems so cludgy
14
+ # already)
15
+ #
16
+ # And thanks to zenspider for ZenTest -- great stuff
17
+ #
18
+ require "test/unit"
19
+ require "gembuilder"
20
+
21
+ class TestGembuilder < Test::Unit::TestCase
22
+ GEMNAME = 'helloc-1.0.0.gem'
23
+
24
+ def setup
25
+ # find our test gem file.
26
+ # Note the nasty reliance on an external file
27
+ # and our eventual use of your file system
28
+ # slowing the tests
29
+ #
30
+ Dir.chdir "test" rescue nil
31
+ @gb = GemBuilder.new(GEMNAME)
32
+ end
33
+
34
+ def teardown
35
+ # how craptacular is this -- I am using the thing I am
36
+ # testing to cleanup -- somebody save me from my own
37
+ # insanity
38
+ @gb.cleanup
39
+ File.rm('helloc-1.0.0-*.gem') rescue nil
40
+ end
41
+
42
+ def assert_file_exists(fname, msg = "The file #{fname} should exist and does not.")
43
+ assert(File.exists?(fname), msg)
44
+ end
45
+
46
+ def assert_file_exists_in_gem(fname, msg = "The file #{fname} should exist and does not.")
47
+ assert_file_exists(File.join(@gb.tmpdir, fname), msg)
48
+ end
49
+
50
+ def assert_files_exist_in_gem(files)
51
+ files.each { |file| assert_file_exists_in_gem(file) }
52
+ end
53
+
54
+ def test_class_doit_all_method
55
+ GemBuilder[GEMNAME]
56
+
57
+ assert_file_exists("helloc-1.0.0-#{Config::CONFIG['arch']}.gem")
58
+ # not sure how to verify that the temp directory is properly cleaned up
59
+ # without adding some odd support for returning the temp directory name
60
+ # that should already be deleted at this point
61
+ end
62
+
63
+ def test_tmpdir_does_not_exist
64
+ assert(!File.exists?(@gb.tmpdir), "Not generating a good temp directory")
65
+ end
66
+
67
+ def test_we_can_unpack_the_gem
68
+ @gb.unpack_gem
69
+ assert(File.exists?(@gb.tmpdir), "Failure message.")
70
+
71
+ assert_files_exist_in_gem ["History.txt", "Manifest.txt", "README.txt",
72
+ "Rakefile", "ext/helloc/extconf.rb", "ext/helloc/helloc.c"]
73
+ end
74
+
75
+ def test_we_can_build_the_extensions
76
+ @gb.unpack_gem
77
+ @gb.build_extensions
78
+ assert_files_exist_in_gem [
79
+ "ext/helloc/helloc.#{Config::CONFIG['OBJEXT']}",
80
+ "lib/helloc.#{Config::CONFIG['DLEXT']}"
81
+ ]
82
+ end
83
+
84
+ def test_gemspec_changes
85
+ @gb.unpack_gem
86
+ @gb.build_extensions
87
+ @gb.fix_gemspec
88
+
89
+ assert(@gb.spec.files.include?("lib/helloc.#{Config::CONFIG['DLEXT']}"), "Shared library not found in gemspec")
90
+ assert(!@gb.spec.files.include?("ext/helloc/helloc.#{Config::CONFIG['OBJEXT']}"), "Intermediate file found in gemspec")
91
+ end
92
+
93
+ def test_build_gem
94
+ @gb.unpack_gem
95
+ @gb.build_extensions
96
+ @gb.fix_gemspec
97
+ @gb.build_gem
98
+
99
+ # talk about self referential -- but how else to I make the
100
+ # tests work on different platforms?
101
+ assert_file_exists("helloc-1.0.0-#{Config::CONFIG['arch']}.gem")
102
+ end
103
+
104
+ def test_cleanup
105
+ @gb.unpack_gem
106
+ @gb.build_extensions
107
+ @gb.cleanup
108
+ assert(!File.exists?(@gb.tmpdir))
109
+ end
110
+
111
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.2
3
+ specification_version: 1
4
+ name: gembuilder
5
+ version: !ruby/object:Gem::Version
6
+ version: 1.1.0
7
+ date: 2007-05-22 00:00:00 -04:00
8
+ summary: Create a binary gem, for the current platform.
9
+ require_paths:
10
+ - lib
11
+ email: phurley@gmail.com
12
+ homepage: " by Patrick Hurley"
13
+ rubyforge_project: gembuilder
14
+ description: "== FEATURES/PROBLEMS: * Would be better if it could gather the gem automatically out of the gem cache. * Should also have an option to attempt to cleanup intermediate files (.o/.obj) == SYNOPSIS: Build your gem so that it can be deployed on machines without a build chain == REQUIREMENTS:"
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Patrick Hurley
31
+ files:
32
+ - History.txt
33
+ - Manifest.txt
34
+ - README.txt
35
+ - Rakefile
36
+ - bin/gembuilder
37
+ - lib/gembuilder.rb
38
+ - test/test_gembuilder.rb
39
+ test_files:
40
+ - test/test_gembuilder.rb
41
+ rdoc_options: []
42
+
43
+ extra_rdoc_files: []
44
+
45
+ executables:
46
+ - gembuilder
47
+ extensions: []
48
+
49
+ requirements: []
50
+
51
+ dependencies:
52
+ - !ruby/object:Gem::Dependency
53
+ name: hoe
54
+ version_requirement:
55
+ version_requirements: !ruby/object:Gem::Version::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 1.2.0
60
+ version: