rubygems-compile 0.2.0 → 1.0.0beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gemtest ADDED
File without changes
data/README.rdoc CHANGED
@@ -1,45 +1,59 @@
1
1
  = rubygems-compile
2
2
 
3
- A compile command for `macgem` to install and compile gems using the MacRuby compiler.
3
+ A set of rubygems commands for <tt>macgem</tt> that interface with the
4
+ MacRuby compiler.
4
5
 
5
6
  All you need to do is:
6
7
 
7
- gem install rubygems-compile
8
+ sudo macgem install rubygems-compile
8
9
 
9
- And then you're off to the races! When you install gems using `macgem compile` the gem will also be compiled.
10
+ And then you're off to the races!
10
11
 
11
- == Description
12
+ == Commands
12
13
 
13
- `rubygems-compile` provides two additional commands for `macgem`. The first is `compile`; you can now say `macgem compile nokogiri` and the `nokogiri` gem will be installed and compiled. Then, whenever you use `nokogiri`, the compiled version of the gem files will be loaded instead of the uncompiled version of the gem files.
14
+ [+compile+] Can be used to compile, or re-compile, any gems that are already installed.
14
15
 
15
- `macgem compile` is a superset of the `gem install` command, so you can still use all the options you would normally use. `macgem compile` has one extra option to delete all the original .rb files after the .rbo is generated; use this option with caution.
16
+ sudo macgem compile nokogiri # Compile gems based on names you provide
17
+ sudo macgem compile minitest --version 2.0.2 # Compile a specific version of a gem
18
+ sudo macgem compile --all # Compile all installed gems
19
+ sudo macgem compile rspec --no-ignore-dependencies # Also compile dependencies
16
20
 
17
- Some gems work perfectly when compiled, and some do not (for various reasons), so you should try a gem non-compiled first. If you dove head first into using compiled gems and you need to back-peddle, you will have to uninstall and then reinstall the gem (NOTE: a `macgem decompile` to remove the .rbo files and, if needed, reinstall the gem all in one step is included but only works for normal cases (no dependency decompiling, no custom install directories)).
21
+ [+uncompile+] Can be used to remove the compiled <tt>.rbo</tt> files if a gem does not work well when compiled.
22
+
23
+ sudo macgem uncompile nokogiri # Uncompile gems based on names you provide
24
+ sudo macgem uncompile minitest --version 2.0.2 # Compile a specific version of a gem
25
+ sudo macgem uncompile --all # Uncompile all installed gems
26
+ sudo macgem uncompile rspec --no-ignore-dependencies # Also uncompile dependencies
27
+
28
+ [+auto_compile+] Can be used to enable a post-install hook that will automatically compile gems when you install them. Call it once to turn on, call it a second time to disable it.
29
+
30
+ sudo macgem auto_compile # gems will compiled when you install them
31
+ sudo macgem auto_compile # gems will not be compiled when you install them
18
32
 
19
33
  == Caveats
20
34
 
21
- * Large gems will take a long time to compile, but these are the gems that will benefit the most from being compiled
22
- * This has only been tested on a few gems, but should not break existing gems since we leave the original files around by default
23
- * As of MacRuby 0.9, you cannot get usable backtrace data for compiled ruby files
24
- * This may be fixed for MacRuby 0.10
25
- * The 1-to-1 correlation of .rb files to .rbo files can make gems quite a bit bigger on disk
35
+ * Large gems will take a long time to compile, but these are the gems
36
+ that will benefit the most from being compiled so please be patient
37
+ * This has only been tested on a few gems, but should not break
38
+ existing gems since we leave the original files around
39
+ * At the moment, compiled gems will not provide usable backtraces
40
+ * <tt>.rbo</tt> files take up more disk space than their <tt>.rb</tt> equivalents
26
41
 
27
- == Known Reasons A Compiled Gem Will Not Work
42
+ == Known Issues
28
43
 
29
- * Using non-standard file suffixes (e.g. `mime-types` has a `.rb.data` file)
30
- * This will be addressed in a later release
31
- * Gems that explicitly require a file with the file suffix (e.g. `require 'nokogiri.rb'`)
32
- * This should be addressable in a future release
44
+ * Source files using a non-standard suffix (e.g. <tt>mime-types</tt> has a <tt>.rb.data</tt> file) will not get compiled
45
+ * This might be addressable in a later release, but is not a big deal
46
+ * Gems that explicitly require a file with the file suffix (e.g. <tt>require 'nokogiri.rb'</tt>) will never load the compiled version of the file
47
+ * Those gems should be updated so that compiled code can be loaded
33
48
 
34
49
  == TODO
35
50
 
36
- * A gem install option would be most natural instead of compile command
37
- * gem install --compile nokogiri
38
- * Code parsing to WARN about gems that will not work when compiled
39
- * Compile multiple .rb files to a single .rbo binary (instead of an .rbo for each .rb)
40
- * A naive implementation will not work for gems that are loaded modularly
41
- * Files in bin/ usually don't include the file extension and are not compiled
51
+ * Support specifying a version for compile/uncompile commands
52
+ * Code parsing to WARN about gems that will have issues when compiled
53
+ * Parallel compilation to speed up compilation of large gems
54
+ * This might require changes in the MacRuby compiler
42
55
 
43
56
  == Copyright
44
57
 
45
58
  Copyright (c) 2011 Mark Rada. See LICENSE.txt for further details.
59
+
data/Rakefile CHANGED
@@ -1,41 +1,24 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
1
  require 'rake/testtask'
2
+ require 'rake/gempackagetask'
3
+ require 'rubygems/dependency_installer'
4
+
5
+ task :default => :gem
6
+
5
7
  Rake::TestTask.new(:test) do |test|
6
- test.libs << 'lib' << 'test'
7
- test.pattern = 'test/**/test_*.rb'
8
- test.verbose = true
8
+ test.libs << 'lib' << 'test'
9
+ test.pattern = 'test/**/test_*.rb'
10
+ test.verbose = true
11
+ test.ruby_opts = ['-rhelper']
9
12
  end
10
13
 
11
- task :default => :'gem:build'
14
+ eval IO.read('rubygems-compile.gemspec')
12
15
 
13
- namespace :macruby do
14
- desc 'AOT compile'
15
- task :compile do
16
- FileList["lib/**/*.rb"].each do |source|
17
- name = File.basename source
18
- puts "#{name} => #{name}o"
19
- `macrubyc --arch x86_64 -C '#{source}' -o '#{source}o'`
20
- end
21
- end
22
-
23
- desc 'Clean MacRuby binaries'
24
- task :clean do
25
- FileList["lib/**/*.rbo"].each do |bin|
26
- rm bin
27
- end
28
- end
16
+ Rake::GemPackageTask.new(GEM_SPEC) do |pkg|
17
+ pkg.need_zip = false
18
+ pkg.need_tar = true
29
19
  end
30
20
 
31
- namespace :gem do
32
- desc 'Build the gem'
33
- task :build do
34
- puts `gem build -v rubygems-compile.gemspec`
35
- end
36
-
37
- desc 'Build the gem and install it'
38
- task :install => :build do
39
- puts `gem install #{Dir.glob('rubygems-compile*.gem').sort.reverse.first}`
40
- end
21
+ desc 'Build the gem and install it'
22
+ task :install => :gem do
23
+ Gem::Installer.new("pkg/#{GEM_SPEC.file_name}").install
41
24
  end
@@ -0,0 +1,11 @@
1
+ require 'ripper'
2
+
3
+ class GemAnalyzer < Ripper::SexpBuilder
4
+
5
+ def on_command command, args
6
+ puts args.class
7
+ puts command.class
8
+ super.tap { |x| puts x.inspect }
9
+ end
10
+
11
+ end
@@ -0,0 +1,27 @@
1
+ class Gem::Commands::AutoCompileCommand < Gem::Command
2
+ include Gem::UserInteraction
3
+
4
+ def initialize
5
+ super 'auto_compile', 'Enable gem compilation at install time'
6
+ end
7
+
8
+ def description # :nodoc:
9
+ 'Toggle a setting that enables compiling gems at install time.'
10
+ end
11
+
12
+ def usage
13
+ "#{progname}"
14
+ end
15
+
16
+ def execute
17
+ Gem.configuration[:compile] = if Gem.configuration[:compile]
18
+ say 'Disabling automatic compilation'
19
+ false
20
+ else
21
+ say 'Enabling automatic compilation'
22
+ true
23
+ end
24
+ Gem.configuration.write
25
+ end
26
+
27
+ end
@@ -0,0 +1,50 @@
1
+ require 'rubygems/dependency_list'
2
+
3
+ ##
4
+ # Use the MacRuby compiler to compile installed gems.
5
+
6
+ class Gem::Commands::CompileCommand < Gem::Command
7
+ include Gem::VersionOption
8
+ include Gem::CompileMethods
9
+
10
+ def initialize
11
+ super 'compile', 'Compile (or recompile) installed gems',
12
+ ignore: true, all: false
13
+
14
+ add_version_option
15
+ add_option(
16
+ '-a', '--all', 'Compile all installed gem'
17
+ ) do |all,opts| opts[:all] = all end
18
+ add_option(
19
+ '-I', '--[no-]ignore-dependencies', 'Also compile dependencies'
20
+ ) do |value, options| options[:ignore] = value end
21
+ end
22
+
23
+ def arguments # :nodoc:
24
+ 'GEMNAME name of the gem to compile'
25
+ end
26
+
27
+ def defaults_str # :nodoc:
28
+ super + '--ignore-dependencies'
29
+ end
30
+
31
+ def usage # :nodoc:
32
+ "#{program_name} GEMNAME [GEMNAME ...]"
33
+ end
34
+
35
+ ##
36
+ # Determine which gems need to be compiled, then create and run a compiler
37
+ # object for each of them.
38
+
39
+ def execute
40
+ gems = execution_list
41
+
42
+ if gems.count >= 10
43
+ alert 'This could take a while; you might want to take a coffee break'
44
+ end
45
+
46
+ compiler = Gem::Compiler.new
47
+ gems.each { |gem| compiler.compile(gem) }
48
+ end
49
+
50
+ end
@@ -0,0 +1,39 @@
1
+ class Gem::Commands::UncompileCommand < Gem::Command
2
+ include Gem::VersionOption
3
+ include Gem::CompileMethods
4
+
5
+ def initialize
6
+ super 'uncompile', 'Uncompile installed gems',
7
+ ignore: true, all: false
8
+
9
+ add_version_option
10
+ add_option(
11
+ '-a', '--all', 'Uncompile all installed gem'
12
+ ) do |all,opts| opts[:all] = all end
13
+ add_option(
14
+ '-I', '--[no-]ignore-dependencies', 'Also uncompile dependencies'
15
+ ) do |value, options| options[:ignore] = value end
16
+ end
17
+
18
+ def arguments # :nodoc:
19
+ 'GEMNAME name of the gem to uncompile'
20
+ end
21
+
22
+ def defaults_str # :nodoc:
23
+ super + '--ignore-dependencies'
24
+ end
25
+
26
+ def usage # :nodoc:
27
+ "#{program_name} GEMNAME [GEMNAME ...]"
28
+ end
29
+
30
+ ##
31
+ # Determine which gems need to be uncompiled, then create and run
32
+ # an uncompiler object for each of them.
33
+
34
+ def execute
35
+ uncompiler = Gem::Uncompiler.new
36
+ execution_list.each { |gem| uncompiler.uncompile(gem) }
37
+ end
38
+
39
+ end
@@ -0,0 +1,8 @@
1
+ require 'rubygems-compile/commands/compile_command'
2
+ Gem::CommandManager.instance.register_command :compile
3
+
4
+ require 'rubygems-compile/commands/uncompile_command'
5
+ Gem::CommandManager.instance.register_command :uncompile
6
+
7
+ require 'rubygems-compile/commands/autocompile_command'
8
+ Gem::CommandManager.instance.register_command :auto_compile
@@ -1,22 +1,39 @@
1
1
  module Gem
2
- module Compile
3
- module Methods
4
2
 
5
- MACRUBYC = File.join(RbConfig::CONFIG['bindir'], 'macrubyc')
3
+ module CompileMethods
6
4
 
7
- def get_specs_for_gems gem_names # :nodoc:
8
- gem_names.flatten.map { |gem|
9
- Gem.source_index.find_name gem
10
- }.flatten.compact
11
- end
5
+ def execution_list
6
+ gems_list.map do |gem|
7
+ candidates = Gem.source_index.find_name(gem, options[:version])
8
+
9
+ if candidates.empty?
10
+ alert_error "#{gem} is not installed. Skipping."
11
+ next
12
+ end
13
+
14
+ candidates << dependencies_for(*candidates) unless options[:ignore]
15
+ candidates
16
+ end.flatten.uniq
17
+ end
18
+
19
+ def gems_list
20
+ installed_gems = Gem.source_index.all_gems
21
+ if options[:all] then
22
+ installed_gems.map { |_, spec| spec.name }
23
+ else
24
+ get_all_gem_names
25
+ end
26
+ end
27
+
28
+ def dependencies_for *specs
29
+ specs.map { |spec|
30
+ spec.runtime_dependencies.map { |dep|
31
+ deps = Gem.source_index.find_name(dep.name,dep.requirement)
32
+ deps + dependencies_for(*deps)
33
+ }
34
+ }
35
+ end
12
36
 
13
- def find_files_to_compile gem # :nodoc:
14
- files = gem.files - gem.test_files - gem.extra_rdoc_files
15
- files = files.reject do |file| file.match /^(?:test|spec)/ end
16
- # this cuts out the .rb.data file in the mime-types gem
17
- files.select do |file| file.match /\.rb$/ end
18
37
  end
19
38
 
20
39
  end
21
- end
22
- end
@@ -0,0 +1,61 @@
1
+ class Gem::Compiler
2
+ include Gem::UserInteraction
3
+
4
+ def initialize
5
+ @current_directory = []
6
+ @config = Gem.configuration
7
+ end
8
+
9
+ def call gem
10
+ @spec = gem.is_a?(Gem::Specification) ? gem : gem.spec
11
+
12
+ if @spec.name == 'rubygems-compile'
13
+ alert 'You cannot compile rubygems-compile'
14
+ return
15
+ end
16
+
17
+ say compilation_message if @config.verbose
18
+
19
+ gem_files.each do |file|
20
+ say compile_file_msg(file) if @config.really_verbose
21
+ absolute_file_path = File.join(@spec.full_gem_path, file)
22
+ ::Compiler.new(
23
+ bundle: true,
24
+ files: [absolute_file_path],
25
+ output: "#{absolute_file_path}o"
26
+ ).run
27
+ end
28
+ end
29
+
30
+ alias_method :compile, :call
31
+
32
+ def compilation_message
33
+ slash = @config.really_verbose ? '/' : ''
34
+ "Compiling #{@spec.full_name}#{slash}"
35
+ end
36
+
37
+ # @todo get better at deciding which files to compile;
38
+ # right now we ignore the .rb.data file in the mime-types gem
39
+ # and probably some other silly edge cases that are similar
40
+ def gem_files
41
+ files = @spec.files - @spec.test_files - @spec.extra_rdoc_files
42
+ files.reject { |file| file.match /^(?:test|spec)/ }
43
+ .select { |file| file.match /\.rb$/ }
44
+ end
45
+
46
+ def compile_file_msg file
47
+ name = File.basename(file)
48
+ dirs = file.chomp(name).split(File::SEPARATOR)
49
+ tabs = "\t" * dirs.count
50
+
51
+ dirs.each_with_index do |dir, index|
52
+ unless @current_directory[index] == dir
53
+ @current_directory[index] = dir
54
+ say( "\t" * (index + 1) + dir + File::SEPARATOR)
55
+ end
56
+ end
57
+
58
+ "#{tabs}#{name} => #{name}o"
59
+ end
60
+
61
+ end
@@ -0,0 +1,9 @@
1
+ ##
2
+ # The setting that we look for here is toggled using the +autocompile+
3
+ # command.
4
+
5
+ if Gem.configuration[:compile]
6
+ module Gem
7
+ @post_install_hooks << ::Gem::Compiler.new
8
+ end
9
+ end
@@ -0,0 +1,31 @@
1
+ class Gem::Uncompiler
2
+ include Gem::UserInteraction
3
+
4
+ def initialize
5
+ @config = Gem.configuration
6
+ end
7
+
8
+ def uncompile gem
9
+ @spec = gem.is_a?(Gem::Specification) ? gem : gem.spec
10
+
11
+ say uncompilation_message if @config.verbose
12
+
13
+ gem_files.each do |file|
14
+ say "\tAsploded #{file}" if @config.really_verbose
15
+ absolute_file_path = File.join(@spec.full_gem_path, file)
16
+ FileUtils.rm absolute_file_path
17
+ end
18
+ end
19
+
20
+ def uncompilation_message
21
+ slash = @config.really_verbose ? '/' : ''
22
+ "Uncompiling #{@spec.full_name}#{slash}"
23
+ end
24
+
25
+ def gem_files
26
+ Dir.glob(File.join(@spec.full_gem_path, '**','*.rbo')).map do |file|
27
+ file.sub /#{@spec.full_gem_path}\//, ''
28
+ end
29
+ end
30
+
31
+ end
@@ -1,3 +1,23 @@
1
- require 'rubygems-compile/monkey_patches'
2
- require 'rubygems-compile/compile'
3
- require 'rubygems-compile/decompile'
1
+ if RUBY_VERSION.to_f < 0.11
2
+
3
+ ui = Gem::UserInteraction.new
4
+ ui.alert_warning 'rubygems-compile requires MacRuby 0.11 or newer'
5
+ ui.alert_warning 'rubygems-compile will not be loaded'
6
+
7
+ else
8
+
9
+ require 'rbconfig'
10
+ require 'fileutils'
11
+ require 'rubygems/version_option'
12
+
13
+ unless Kernel.const_defined?(:Compiler)
14
+ load File.join(RbConfig::CONFIG['bindir'], 'macrubyc')
15
+ end
16
+
17
+ require 'rubygems-compile/common_methods'
18
+ require 'rubygems-compile/compiler'
19
+ require 'rubygems-compile/uncompiler'
20
+ require 'rubygems-compile/commands'
21
+ require 'rubygems-compile/post_install_hook'
22
+
23
+ end
data/test/helper.rb CHANGED
@@ -1,16 +1,7 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
-
4
1
  require 'rubygems'
5
2
  require 'rubygems/command_manager'
6
3
  require 'rubygems_plugin'
7
4
 
8
- gem 'minitest', '>= 2.0.2'
9
- require 'minitest/pride'
5
+ gem 'minitest-macruby-pride', '>= 2.2.0'
10
6
  require 'minitest/autorun'
11
-
12
- class MiniTest::Unit::TestCase
13
- def setup
14
- @command = Gem::Commands::CompileCommand.new
15
- end
16
- end
7
+ require 'minitest/pride'
@@ -0,0 +1,22 @@
1
+ class TestAutoCompile < MiniTest::Unit::TestCase
2
+
3
+ def setup
4
+ @command = Gem::Commands::AutoCompileCommand.new
5
+ end
6
+
7
+ def test_turn_on
8
+ end
9
+
10
+ def test_turn_on_when_already_on
11
+ end
12
+
13
+ def test_turn_off
14
+ end
15
+
16
+ def test_turn_off_when_already_off
17
+ end
18
+
19
+ def test_calls_compile_on_each_gem_after_installation
20
+ end
21
+
22
+ end
@@ -0,0 +1,36 @@
1
+ class TestCompileCommand < MiniTest::Unit::TestCase
2
+ def setup
3
+ @command = Gem::Commands::CompileCommand.new
4
+ end
5
+ end
6
+
7
+ class Test < TestCompileCommand
8
+ def test_finds_all_files
9
+ # gets into all require dirs
10
+ # does not compile test files
11
+ end
12
+ def test_recompiles_rbos_if_they_already_exist
13
+ # to support use on nightly builds
14
+ end
15
+ end
16
+
17
+ class TestCompileInterface < TestCompileCommand
18
+ def test_has_an_option_to_compile_all_installed_gems
19
+ # by extension, this is also needed to support nightly build users
20
+ end
21
+ end
22
+
23
+ class TestCompileSpecialCases < TestCompileCommand
24
+ def test_refuses_to_compile_itself
25
+ # obvious
26
+ end
27
+
28
+ def test_loads_rubyc_without_warning
29
+ # this might not be doable without upstream load guarding; minor issue
30
+ end
31
+
32
+ # important to test so we don't break rubygems
33
+ def test_skips_loading_on_older_macruby_versions
34
+ # and prints a message
35
+ end
36
+ end
@@ -0,0 +1,16 @@
1
+ class TestUncompileCommand < MiniTest::Unit::TestCase
2
+
3
+ def setup
4
+ @command = Gem::Commands::UncompileCommand.new
5
+ end
6
+
7
+ def test_removes_rbo_files
8
+ end
9
+
10
+ def test_leaves_rb_files
11
+ end
12
+
13
+ def test_can_uncompile_multiple_gems_at_once
14
+ end
15
+
16
+ end
metadata CHANGED
@@ -1,81 +1,70 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubygems-compile
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.2.0
4
+ prerelease: 5
5
+ version: 1.0.0beta2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Mark Rada
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-03-06 00:00:00 -05:00
12
+ date: 2011-05-14 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: minitest
16
+ name: minitest-macruby-pride
17
17
  prerelease: false
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - '>='
22
22
  - !ruby/object:Gem::Version
23
- version: 2.0.2
23
+ version: 2.2.0
24
24
  type: :development
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  none: false
27
27
  requirements:
28
28
  - - '>='
29
29
  - !ruby/object:Gem::Version
30
- version: 2.0.2
31
- description: 'A rubygems post-install hook to compile gems using the MacRuby compiler.
30
+ version: 2.2.0
31
+ description: 'A set of rubygems commands that interface with the MacRuby compiler
32
32
 
33
33
  '
34
34
  email: mrada@marketcircle.com
35
35
  executables: []
36
36
  extensions: []
37
37
  extra_rdoc_files:
38
- - Rakefile
39
38
  - LICENSE.txt
40
39
  - README.rdoc
41
40
  files:
41
+ - lib/rubygems-compile/analysis.rb
42
+ - lib/rubygems-compile/commands/autocompile_command.rb
43
+ - lib/rubygems-compile/commands/compile_command.rb
44
+ - lib/rubygems-compile/commands/uncompile_command.rb
45
+ - lib/rubygems-compile/commands.rb
42
46
  - lib/rubygems-compile/common_methods.rb
43
- - lib/rubygems-compile/compile.rb
44
- - lib/rubygems-compile/decompile.rb
45
- - lib/rubygems-compile/monkey_patches.rb
47
+ - lib/rubygems-compile/compiler.rb
48
+ - lib/rubygems-compile/post_install_hook.rb
49
+ - lib/rubygems-compile/uncompiler.rb
46
50
  - lib/rubygems_plugin.rb
51
+ - test/helper.rb
52
+ - test/test_autocompile_command.rb
53
+ - test/test_compile_command.rb
54
+ - test/test_uncompile_command.rb
47
55
  - Rakefile
56
+ - .gemtest
48
57
  - LICENSE.txt
49
58
  - README.rdoc
50
- - test/test_find_files_to_compile.rb
51
- - test/test_get_specs_for_gems.rb
52
- - test/helper.rb
53
59
  has_rdoc: true
54
60
  homepage: http://github.com/ferrous26/rubygems-compile
55
61
  licenses:
56
62
  - MIT
57
- post_install_message: '
58
-
59
- ***********************************************************
60
-
61
-
62
- Please uninstall previous versions of this gem, or else
63
-
64
- rubygems will try to load each version of the gem.
65
-
66
-
67
- The functionality of this gem has changed since the 0.0.x
68
-
69
- series. It now operates as its own command, see the README.
70
-
71
-
72
- https://github.com/ferrous26/rubygems-compile
73
-
74
-
75
- ***********************************************************
76
-
77
-
78
- '
63
+ post_install_message: "\n***********************************************************\n\nPlease
64
+ uninstall previous versions of this gem, or else\nrubygems will try to load each
65
+ version of the gem.\n\nThis version of rubygems-compile requires MacRuby 0.11 or\nnewer;
66
+ the functionality has changed significantly since\npre-1.0 releases, see the README:\n\n
67
+ \ https://github.com/ferrous26/rubygems-compile\n\n***********************************************************\n\n"
79
68
  rdoc_options: []
80
69
  require_paths:
81
70
  - lib
@@ -88,16 +77,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
77
  required_rubygems_version: !ruby/object:Gem::Requirement
89
78
  none: false
90
79
  requirements:
91
- - - '>='
80
+ - - '>'
92
81
  - !ruby/object:Gem::Version
93
- version: 1.4.2
82
+ version: 1.3.1
94
83
  requirements: []
95
84
  rubyforge_project:
96
85
  rubygems_version: 1.4.2
97
86
  signing_key:
98
87
  specification_version: 3
99
- summary: A rubygems post-install hook using the MacRuby compiler to compile gems
88
+ summary: A set of rubygems commands that interface with the MacRuby compiler
100
89
  test_files:
101
- - test/test_find_files_to_compile.rb
102
- - test/test_get_specs_for_gems.rb
103
90
  - test/helper.rb
91
+ - test/test_autocompile_command.rb
92
+ - test/test_compile_command.rb
93
+ - test/test_uncompile_command.rb
94
+ - Rakefile
95
+ - .gemtest
@@ -1,70 +0,0 @@
1
- require 'rbconfig'
2
- require 'fileutils'
3
- require 'rubygems/command'
4
- require 'rubygems/commands/install_command'
5
- require 'rubygems-compile/common_methods'
6
-
7
- ##
8
- # Use the MacRuby compiler to compile gems at install time. This
9
- # includes the option to remove the original *.rb files leaving
10
- # only the compiled *.rbo files.
11
-
12
- class Gem::Commands::CompileCommand < Gem::Commands::InstallCommand
13
- include Gem::Compile::Methods
14
-
15
- def initialize
16
- super # so that InstallCommand options are registered
17
- @command = 'compile' # now we override certain attributes
18
- @summary = 'Install and compile gems using the MacRuby compiler'
19
- @program_name = 'gem compile'
20
-
21
- defaults[:'remove-original-files'] = false
22
- add_option( '-r', '--[no-]remove-original-files',
23
- 'Delete the original *.rb source files after compiling',
24
- ) do |value, options|
25
- options[:'remove-original-files'] = value
26
- end
27
- end
28
-
29
- def defaults_str # :nodoc:
30
- super + "\n--no-remove-original-files"
31
- end
32
-
33
- ##
34
- # Lookup the gems and their listed files. It will only compile files
35
- # that are located in the `require_path` for a gem.
36
-
37
- def execute
38
-
39
- verbose = Gem.configuration.verbose
40
- slash = verbose.is_a?(Fixnum) ? '/' : ''
41
- post_compile = Proc.new do |_,_| end
42
-
43
- if options[:'remove-original-files']
44
- post_compile = Proc.new do |file, full_path|
45
- say "\tRemoving #{file}" if verbose.is_a? Fixnum
46
- FileUtils.rm full_path
47
- end
48
- end
49
-
50
- Gem.post_install do |gem|
51
- spec = gem.spec
52
- say "Compiling #{spec.name}-#{spec.version}#{slash}" if verbose
53
-
54
- path = spec.full_gem_path
55
- files = find_files_to_compile spec
56
-
57
- files.each { |file|
58
- say "\t#{file} => #{file}o" if verbose.is_a? Fixnum
59
- full_path = path + '/' + file
60
- `#{MACRUBYC} -C '#{full_path}' -o '#{full_path}o'`
61
- post_compile.call file, full_path
62
- }
63
- end
64
-
65
- super
66
- end
67
-
68
- end
69
-
70
- Gem::CommandManager.instance.register_command :compile
@@ -1,52 +0,0 @@
1
- require 'fileutils'
2
- require 'rubygems/command'
3
- require 'rubygems/commands/install_command'
4
- require 'rubygems-compile/common_methods'
5
-
6
- ##
7
- # @todo need to look at dependencies too? use --include-dependencies option?
8
- #
9
- # Remove the compiled files for a gem. This is sometimes necessary for
10
- # gems that do not work after being compiled.
11
-
12
- class Gem::Commands::DecompileCommand < Gem::Commands::InstallCommand
13
- include Gem::Compile::Methods
14
-
15
- def initialize
16
- super
17
- @command = 'decompile'
18
- @summary = 'Remove compiled *.rbo files for gems, possibily reinstalling'
19
- @program_name = 'gem decompilecompile'
20
- end
21
-
22
- ##
23
- # Try to only remove *.rbo files, but in the case that the original *.rb files
24
- # are gone, we will also have to reinstall the gem.
25
-
26
- def execute
27
-
28
- verbose = Gem.configuration.verbose
29
- slash = verbose.is_a?(Fixnum) ? '/' : ''
30
-
31
- get_specs_for_gems(get_all_gem_names).each { |gem|
32
- say "Decompiling #{gem.name}-#{gem.version}#{slash}" if verbose
33
-
34
- path = gem.full_gem_path
35
- files = find_files_to_compile gem
36
- reinstall = false
37
-
38
- files.each { |file|
39
- say "\tRemoving #{file}o" if verbose.is_a? Fixnum
40
- full_path = "#{path}/#{file}"
41
- FileUtils.rm( full_path + 'o' )
42
- reinstall = true unless File.exists? full_path
43
- }
44
-
45
- super if reinstall
46
- }
47
-
48
- end
49
-
50
- end
51
-
52
- Gem::CommandManager.instance.register_command :decompile
@@ -1,11 +0,0 @@
1
- unless Gem.suffixes.include? '.rbo'
2
- module Gem
3
- class << self
4
- # To get around how rubygems-1.4.2 set's suffixes
5
- alias_method :rubygems_compile_suffixes, :suffixes
6
- def suffixes
7
- ['.rbo'] + rubygems_compile_suffixes
8
- end
9
- end
10
- end
11
- end
@@ -1,44 +0,0 @@
1
- require 'helper'
2
-
3
- class TestFindFilesToCompile < MiniTest::Unit::TestCase
4
-
5
- def setup
6
- super
7
- @test_gem = MiniTest::Mock.new
8
- end
9
-
10
- def test_strips_test_files
11
- @test_gem.expect :files, [
12
- 'test/file1', 'test/file2', 'spec/file1', 'spec/file2', 'setup.rb'
13
- ]
14
- @test_gem.expect :test_files, [ 'test/file1', 'spec/file1' ]
15
- @test_gem.expect :extra_rdoc_files, []
16
-
17
- assert_equal [ 'setup.rb' ], @command.find_files_to_compile(@test_gem)
18
- end
19
-
20
- def test_strips_non_ruby_source_files
21
- @test_gem.expect :files, [
22
- 'README.rdoc', 'LICENSE.txt', 'Gemfile', 'setup.rb'
23
- ]
24
- @test_gem.expect :test_files, []
25
- @test_gem.expect :extra_rdoc_files, [
26
- 'README.rdoc', 'LICENSE.txt', 'Gemfile'
27
- ]
28
- assert_equal [ 'setup.rb' ], @command.find_files_to_compile(@test_gem)
29
- end
30
-
31
- def test_returns_array_of_files
32
- source_files = [
33
- 'lib/gem.rb', 'lib/gem/helper.rb', 'ext/help/extconf.rb', 'setup.rb'
34
- ]
35
- @test_gem.expect :files, source_files
36
- @test_gem.expect :test_files, []
37
- @test_gem.expect :extra_rdoc_files, []
38
-
39
- ret = @command.find_files_to_compile @test_gem
40
- assert_instance_of Array, ret
41
- assert_equal source_files, ret
42
- end
43
-
44
- end
@@ -1,19 +0,0 @@
1
- require 'helper'
2
-
3
- class TestGetSpecsForGems < MiniTest::Unit::TestCase
4
-
5
- def test_doesnt_explode_with_bad_gem_names
6
- assert_empty @command.get_specs_for_gems ['not_a_real_gem']
7
- end
8
-
9
- def test_takes_an_array
10
- assert @command.get_specs_for_gems ['minitest', 'not_a_real_gem']
11
- end
12
-
13
- def test_returns_gemspecs
14
- ret = @command.get_specs_for_gems ['minitest']
15
- assert_instance_of Array, ret
16
- assert_instance_of Gem::Specification, ret.first
17
- end
18
-
19
- end