RubyInline 3.2.1 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,6 +1,13 @@
1
+ *** 3.3.0 / 2005-04-22
2
+
3
+ + 2 minor enhancement
4
+ + Added inline_package, which helps you package inlined code into gems.
5
+ + inline_package also generates a Rakefile for you if you need it.
6
+ + inline.rb now (only) loads packaged code when present.
7
+
1
8
  *** 3.2.1 / 2005-04-19
2
9
 
3
- + 2 minor enhancements
10
+ + 2 bug fixes
4
11
  + Added double to typemap. Thanks Phil Tomson!
5
12
  + Added a minor hack to get cygwin to work right--lemme know pls.
6
13
 
data/Manifest.txt CHANGED
@@ -6,7 +6,7 @@ example.rb
6
6
  example2.rb
7
7
  inline.gemspec
8
8
  inline.rb
9
- inline-compat.rb
9
+ inline_package
10
10
  test_inline.rb
11
11
  tutorial/example1.rb
12
12
  tutorial/example2.rb
data/inline.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/local/bin/ruby -w
2
2
 
3
+ ##
3
4
  # Ruby Inline is a framework for writing ruby extensions in foreign
4
- # languages
5
+ # languages.
5
6
  #
6
7
  # = SYNOPSIS
7
8
  #
@@ -26,6 +27,10 @@
26
27
  # builds it only when necessary. The extensions are then automatically
27
28
  # loaded into the class/module that defines it.
28
29
  #
30
+ # Using the package_inline tool Inline now allows you to package up
31
+ # your inlined object code for distribution to systems without a
32
+ # compiler (read: windows)!
33
+ #
29
34
  # You can even write extra builders that will allow you to write
30
35
  # inlined code in any language. Use Inline::C as a template and look
31
36
  # at Module#inline for the required API.
@@ -38,13 +43,14 @@ $TESTING = false unless defined? $TESTING
38
43
 
39
44
  class CompilationError < RuntimeError; end
40
45
 
46
+ ##
41
47
  # The Inline module is the top-level module used. It is responsible
42
48
  # for instantiating the builder for the right language used,
43
49
  # compilation/linking when needed, and loading the inlined code into
44
50
  # the current namespace.
45
51
 
46
52
  module Inline
47
- VERSION = '3.2.1'
53
+ VERSION = '3.3.0'
48
54
 
49
55
  $stderr.puts "RubyInline v #{VERSION}" if $DEBUG
50
56
 
@@ -227,6 +233,19 @@ module Inline
227
233
 
228
234
  public
229
235
 
236
+ def load_cache
237
+ begin
238
+ file = File.join("inline", File.basename(@so_name))
239
+ if require file then
240
+ dir = Inline.directory
241
+ warn "WARNING: #{dir} exists but is not being used" if test ?d, dir
242
+ return true
243
+ end
244
+ rescue LoadError
245
+ end
246
+ return false
247
+ end
248
+
230
249
  def load
231
250
  require "#{@so_name}" or raise LoadError, "require on #{@so_name} failed"
232
251
  end
@@ -432,8 +451,10 @@ class Module
432
451
  yield builder
433
452
 
434
453
  unless testing then
435
- builder.build
436
- builder.load
454
+ unless builder.load_cache then
455
+ builder.build
456
+ builder.load
457
+ end
437
458
  end
438
459
  end
439
460
  end
data/inline_package ADDED
@@ -0,0 +1,128 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ require 'rbconfig'
4
+ require 'fileutils'
5
+ require 'inline'
6
+
7
+ $TESTING ||= false
8
+
9
+ class Packager
10
+
11
+ RAKEFILE_TEMPLATE = <<'EOF'
12
+ %[require 'rake'
13
+ require 'rake/gempackagetask'
14
+
15
+ summary = #{summary.inspect}
16
+
17
+ if summary.empty? then
18
+ STDERR.puts "*************************************"
19
+ STDERR.puts "*** Summary not filled in, SHAME! ***"
20
+ STDERR.puts "*************************************"
21
+ end
22
+
23
+ spec = Gem::Specification.new do |s|
24
+ s.name = #{name.inspect}
25
+ s.version = #{version.inspect}
26
+ s.summary = summary
27
+
28
+ s.has_rdoc = false
29
+ s.files = #{gem_libs.inspect}
30
+ s.add_dependency 'RubyInline', '>= 3.3.0'
31
+ s.require_path = 'lib'
32
+ end
33
+
34
+ desc "Builds a gem with #{name} in it"
35
+ Rake::GemPackageTask.new spec do |pkg|
36
+ pkg.need_zip = false
37
+ pkg.need_tar = false
38
+ end
39
+ ]
40
+ EOF
41
+
42
+ attr_accessor :name, :version, :summary
43
+
44
+ def initialize(name, version, summary = '')
45
+ @name = name
46
+ @version = version
47
+ @summary = summary
48
+
49
+ @libs_copied = false
50
+ end
51
+
52
+ def package
53
+ copy_libs
54
+ generate_rakefile
55
+ build_gem
56
+ end
57
+
58
+ def copy_libs
59
+ FileUtils.mkdir_p inline_dir
60
+ FileUtils.cp built_libs, inline_dir
61
+ @libs_copied = true
62
+ end
63
+
64
+ def generate_rakefile
65
+ if File.exists? 'Rakefile' then
66
+ unless $TESTING then
67
+ STDERR.puts "Hrm, you already have a Rakefile, so I didn't touch it."
68
+ STDERR.puts "You might have to add the following files to your gemspec's files list:"
69
+ STDERR.puts "\t#{gem_libs.join "\n\t"}"
70
+ end
71
+ return
72
+ end
73
+
74
+ rakefile = eval RAKEFILE_TEMPLATE
75
+
76
+ STDERR.puts "==> Generating Rakefile" unless $TESTING
77
+ File.open 'Rakefile', 'w' do |fp|
78
+ fp.puts rakefile
79
+ end
80
+ end
81
+
82
+ def build_gem
83
+ STDERR.puts "==> Running rake" unless $TESTING
84
+
85
+ cmd = "rake package"
86
+ cmd += "> /dev/null 2> /dev/null" if $TESTING
87
+ system cmd
88
+
89
+ STDERR.puts unless $TESTING
90
+ STDERR.puts "Ok, you now have a gem in ./pkg, enjoy!" unless $TESTING
91
+ end
92
+
93
+ def inline_dir
94
+ @inline_dir ||= File.join "lib", "inline" # TODO put libs in platform dir
95
+ end
96
+
97
+ def built_libs
98
+ Dir.glob File.join(Inline.directory, "*.#{Config::CONFIG['DLEXT']}")
99
+ end
100
+
101
+ def gem_libs
102
+ copy_libs unless @libs_copied
103
+ unless defined? @gem_libs then
104
+ @gem_libs = Dir.glob File.join(inline_dir, "*.#{Config::CONFIG['DLEXT']}")
105
+ files = Dir.glob(File.join('lib', '*')).select { |f| test ?f, f }
106
+
107
+ @gem_libs.push(*files)
108
+ @gem_libs.sort!
109
+ end
110
+ @gem_libs
111
+ end
112
+
113
+ end
114
+
115
+ if __FILE__ == $0 then
116
+ name = ARGV.shift
117
+ version = ARGV.shift
118
+ summary = ARGV.shift || ""
119
+
120
+ if version.nil? then # TODO better usage
121
+ STDERR.puts "Usage: packager NAME VERSION SUMMARY"
122
+ exit 1
123
+ end
124
+
125
+ packager = Packager.new name, version, summary
126
+ packager.package
127
+ end
128
+
data/test_inline.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  $TESTING = true
4
4
 
5
5
  require 'inline'
6
+ load 'inline_package'
6
7
  require 'tempfile'
7
8
  require 'test/unit'
8
9
 
@@ -475,8 +476,6 @@ puts(s); return rb_str_new2(s)}"
475
476
  begin
476
477
  Kernel.module_eval { require rb_file }
477
478
  yield if block_given?
478
- rescue Exception => err
479
- raise err
480
479
  ensure
481
480
  File.unlink rb_file
482
481
  end
@@ -584,3 +583,119 @@ class TestModule < Test::Unit::TestCase
584
583
  end
585
584
 
586
585
  end
586
+
587
+ class TestPackager < Test::Unit::TestCase
588
+
589
+ def setup
590
+ @name = "Packager Test"
591
+ @version = "1.0.0"
592
+ @summary = "This is a Packager test gem"
593
+ @packager = Packager.new @name, @version, @summary
594
+
595
+ @inline_dir = "/tmp/#{$$}_inline"
596
+ @package_dir = "/tmp/#{$$}_package"
597
+
598
+ ENV['INLINEDIR'] = @inline_dir
599
+
600
+ Dir.mkdir @inline_dir, 0700
601
+ Dir.mkdir @package_dir, 0700
602
+ @orig_dir = Dir.pwd
603
+ Dir.chdir @package_dir
604
+
605
+ @ext = Config::CONFIG['DLEXT']
606
+ end
607
+
608
+ def teardown
609
+ Dir.chdir @orig_dir
610
+ return if $DEBUG
611
+ `rm -rf #{@inline_dir}`
612
+ `rm -rf #{@package_dir}`
613
+ end
614
+
615
+ def util_generate_rakefile
616
+ summary = @summary
617
+ name = @name
618
+ version = @version
619
+ gem_libs = []
620
+
621
+ eval Packager::RAKEFILE_TEMPLATE
622
+ end
623
+
624
+ def test_package
625
+ assert_nothing_raised do
626
+ @packager.package
627
+ end
628
+ end
629
+
630
+ def test_copy_libs
631
+ assert_equal false, @packager.instance_variable_get("@libs_copied")
632
+
633
+ built_lib = "Inline_Test.#{@ext}"
634
+ dir = "#{@inline_dir}/.ruby_inline"
635
+
636
+ Dir.mkdir dir, 0700
637
+ Dir.chdir dir do
638
+ FileUtils.touch built_lib
639
+ end
640
+
641
+ @packager.copy_libs
642
+
643
+ assert_equal true, File.directory?("#{@package_dir}/lib/inline")
644
+ assert_equal true, File.exists?("#{@package_dir}/lib/inline/#{built_lib}")
645
+
646
+ assert_equal true, @packager.instance_variable_get("@libs_copied")
647
+ end
648
+
649
+ def test_generate_rakefile_has_rakefile
650
+ FileUtils.touch 'Rakefile'
651
+
652
+ @packager.generate_rakefile
653
+
654
+ assert_equal "", File.read('Rakefile')
655
+ end
656
+
657
+ def test_generate_rakefile_no_rakefile
658
+ @packager.generate_rakefile
659
+
660
+ assert_equal util_generate_rakefile, File.read('Rakefile')
661
+ end
662
+
663
+ def test_build_gem
664
+ File.open 'Rakefile', 'w' do |fp|
665
+ fp.puts util_generate_rakefile
666
+ end
667
+
668
+ @packager.build_gem
669
+ package_name = "pkg/#{@name}-#{@version}.gem"
670
+ assert_equal true, File.exists?(package_name)
671
+ assert_equal true, system("gem check #{package_name}")
672
+ end
673
+
674
+ def test_inline_dir
675
+ assert_equal "lib/inline", @packager.inline_dir
676
+ end
677
+
678
+ def test_built_libs
679
+ expected = ["Inline_Test.#{@ext}"]
680
+
681
+ dir = "#{@inline_dir}/.ruby_inline"
682
+ Dir.mkdir dir, 0700
683
+ Dir.chdir dir
684
+
685
+ FileUtils.touch(expected)
686
+
687
+ assert_equal expected.map { |f| "#{dir}/#{f}"}, @packager.built_libs
688
+ end
689
+
690
+ def test_gem_libs
691
+ @packager.instance_variable_set "@libs_copied", true
692
+ expected = ["lib/blah.rb", "lib/inline/Inline_Test.#{@ext}"]
693
+
694
+ FileUtils.mkdir_p "lib/inline"
695
+ FileUtils.touch(expected)
696
+
697
+ assert_equal expected, @packager.gem_libs
698
+ end
699
+
700
+ end
701
+
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: RubyInline
5
5
  version: !ruby/object:Gem::Version
6
- version: 3.2.1
7
- date: 2005-04-19
6
+ version: 3.3.0
7
+ date: 2005-04-22
8
8
  summary: Multi-language extension coding within ruby.
9
9
  require_paths:
10
10
  - "."
@@ -38,7 +38,7 @@ files:
38
38
  - example2.rb
39
39
  - inline.gemspec
40
40
  - inline.rb
41
- - inline-compat.rb
41
+ - inline_package
42
42
  - test_inline.rb
43
43
  - tutorial/example1.rb
44
44
  - tutorial/example2.rb
data/inline-compat.rb DELETED
@@ -1,44 +0,0 @@
1
- #!/usr/local/bin/ruby -w
2
-
3
- require "inline"
4
-
5
- ############################################################
6
- # DEPRECATED: Remove by version 3.1 or 2003-03-01
7
- #
8
- # This file is only provided for those who require backwards compatibility with version 2.x.
9
- # If you don't need it, don't use it. If you do, please heed the deprecation warnings and
10
- # migrate to the new system as fast as you can. Thanks...
11
-
12
- module Inline
13
- class C
14
-
15
- $INLINE_FLAGS = nil
16
- $INLINE_LIBS = nil
17
-
18
- trace_var(:$INLINE_FLAGS) do |val|
19
- $stderr.puts "WARNING: $INLINE_FLAGS is deprecated. Use #add_link_flags. Called from #{caller[1]}."
20
- end
21
-
22
- trace_var(:$INLINE_LIBS) do |val|
23
- $stderr.puts "WARNING: $INLINE_LIBS is deprecated. Use #add_compile_flags. Called from #{caller[1]}."
24
- end
25
- end
26
- end
27
-
28
- class Module
29
- public
30
-
31
- def inline_c(src)
32
- $stderr.puts "WARNING: inline_c is deprecated. Switch to Inline module"
33
- inline(:C) do | builder |
34
- builder.c src
35
- end
36
- end
37
-
38
- def inline_c_raw(src)
39
- $stderr.puts "WARNING: inline_c_raw is deprecated. Switch to Inline module"
40
- inline(:C) do | builder |
41
- builder.c_raw src
42
- end
43
- end
44
- end