rubygems-compile 1.0.0rc2 → 1.0.0rc3

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/README.markdown CHANGED
@@ -15,7 +15,8 @@ And then you're off to the races!
15
15
 
16
16
  `compile`
17
17
 
18
- Can be used to compile, or re-compile, any gems that are already installed.
18
+ Can be used to compile, or re-compile, any gems that are already
19
+ installed.
19
20
 
20
21
  ```bash
21
22
  sudo macgem compile nokogiri # Compile gems based on names you provide
@@ -26,7 +27,11 @@ sudo macgem compile rspec --no-ignore-dependencies # Also compile dependencies
26
27
 
27
28
  `uncompile`
28
29
 
29
- Can be used to remove the compiled `.rbo` files if a gem does not work well when compiled.
30
+ Can be used to remove the compiled `.rbo` files if a gem does not
31
+ work well when compiled. If you find a gem that does not work when
32
+ compiled, it would be greatly appreciated if you reported it here or
33
+ to the MacRuby project itself so that someone can look into the
34
+ problem.
30
35
 
31
36
  ```bash
32
37
  sudo macgem uncompile nokogiri # Uncompile gems based on names you provide
@@ -35,9 +40,13 @@ sudo macgem uncompile --all # Uncompile all installed
35
40
  sudo macgem uncompile rspec --no-ignore-dependencies # Also uncompile dependencies
36
41
  ```
37
42
 
38
- `auto\_compile`
43
+ `auto_compile`
39
44
 
40
- 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.
45
+ If you don't like the idea of calling `compile` each time you
46
+ install a gem, then you can use `auto_compile` to enable a
47
+ post-install hook that will automatically compile gems when they are
48
+ installed. You can call `auto_compile` a second time to turn off the
49
+ feature.
41
50
 
42
51
  ```bash
43
52
  sudo macgem auto_compile # gems will compiled when you install them
@@ -51,7 +60,7 @@ sudo macgem auto_compile # gems will not be compiled when you install them
51
60
  * This has only been tested on a few gems, but should not break
52
61
  existing gems since we leave the original files around
53
62
  * At the moment, compiled gems will not provide usable backtraces
54
- + If you suspect a bug in the way MacRuby compiled a file, try running with pre-compiled files disabled like so: `VM_DISABLE_RBO=1 ruby my_code.rb`
63
+ + If you suspect a bug in the way MacRuby compiled a file, try running with pre-compiled files disabled like so: `VM_DISABLE_RBO=1 macruby my_code.rb`
55
64
  * `.rbo` files take up more disk space than their `.rb` equivalents
56
65
 
57
66
  ## Known Issues
@@ -59,7 +68,8 @@ sudo macgem auto_compile # gems will not be compiled when you install them
59
68
  * Source files using a non-standard suffix (e.g. `mime-types` has a `.rb.data` file) will not get compiled
60
69
  + This might be addressable in a later release, but is not a big deal
61
70
  * Gems that explicitly require a file with the file suffix (e.g. `require 'nokogiri.rb'`) will never load the compiled version of the file
62
- + Those gems should be updated so that compiled code can be loaded
71
+ + This issue may be addressed in MacRuby itself in the near future
72
+ + Alternatively, those gems should be updated so that compiled code can be loaded
63
73
 
64
74
  ## TODO
65
75
 
data/Rakefile CHANGED
@@ -1,24 +1,21 @@
1
- require 'rake/testtask'
2
- require 'rake/gempackagetask'
3
- require 'rubygems/dependency_installer'
4
-
5
1
  task :default => :gem
6
2
 
7
- Rake::TestTask.new(:test) do |test|
8
- test.libs << 'lib' << 'test'
3
+ require 'rake/testtask'
4
+ Rake::TestTask.new do |test|
5
+ test.libs << 'test'
9
6
  test.pattern = 'test/**/test_*.rb'
10
7
  test.verbose = true
11
8
  test.ruby_opts = ['-rhelper']
12
9
  end
13
10
 
14
- eval IO.read('rubygems-compile.gemspec')
11
+ require 'rubygems'
12
+ spec = Gem::Specification.load('rubygems-compile.gemspec')
15
13
 
16
- Rake::GemPackageTask.new(GEM_SPEC) do |pkg|
17
- pkg.need_zip = false
18
- pkg.need_tar = true
19
- end
14
+ require 'rake/gempackagetask'
15
+ Rake::GemPackageTask.new(spec) { }
20
16
 
17
+ require 'rubygems/dependency_installer'
21
18
  desc 'Build the gem and install it'
22
19
  task :install => :gem do
23
- Gem::Installer.new("pkg/#{GEM_SPEC.file_name}").install
20
+ Gem::Installer.new("pkg/#{spec.file_name}").install
24
21
  end
@@ -0,0 +1,23 @@
1
+ require 'ripper'
2
+
3
+ ##
4
+ # Uses the ripper parser to analyze ruby code contained in gems
5
+ # and raises warnings if the code has potential issues.
6
+
7
+ class Gem::Analyzer < Ripper::SexpBuilder
8
+
9
+ ##
10
+ # Raised in any case that the given code might display bad
11
+ # behaviours that were not intended.
12
+
13
+ class Warning < Exception
14
+ end
15
+
16
+ def on_kw token
17
+ # Related to MacRuby ticket #721
18
+ if token == '__FILE__'
19
+ raise Warning, 'The __FILE__ keyword is used in this file'
20
+ end
21
+ end
22
+
23
+ end
@@ -17,6 +17,7 @@ module Gem
17
17
  end
18
18
 
19
19
  def gems_list
20
+ # @todo Gem.source_index is going away...
20
21
  installed_gems = Gem.source_index.all_gems
21
22
  if options[:all] then
22
23
  installed_gems.map { |_, spec| spec.name }
@@ -19,6 +19,7 @@ class Gem::Compiler
19
19
  gem_files.each do |file|
20
20
  say compile_file_msg(file) if @config.really_verbose
21
21
  absolute_file_path = File.join(@spec.full_gem_path, file)
22
+ next if unsafe?(absolute_file_path)
22
23
  MacRuby::Compiler.new(
23
24
  bundle: true,
24
25
  output: "#{absolute_file_path}o",
@@ -26,9 +27,21 @@ class Gem::Compiler
26
27
  ).run
27
28
  end
28
29
  end
29
-
30
30
  alias_method :compile, :call
31
31
 
32
+ ##
33
+ # Uses the GemAnalyzer class to determine if a given file might have
34
+ # any potential issues when compiled.
35
+
36
+ def unsafe? file
37
+ Gem::Analyzer.new(File.read(file)).parse
38
+ false
39
+ rescue Gem::Analyzer::Warning => e
40
+ say "WARNING: #{e.message}"
41
+ say 'Compilation of this file will be skipped'
42
+ true
43
+ end
44
+
32
45
  def compilation_message
33
46
  slash = @config.really_verbose ? '/' : ''
34
47
  "Compiling #{@spec.full_name}#{slash}"
@@ -15,6 +15,7 @@ else
15
15
  end
16
16
 
17
17
  require 'rubygems-compile/common_methods'
18
+ require 'rubygems-compile/analyzer'
18
19
  require 'rubygems-compile/compiler'
19
20
  require 'rubygems-compile/uncompiler'
20
21
  require 'rubygems-compile/commands'
data/test/helper.rb CHANGED
@@ -2,6 +2,6 @@ require 'rubygems'
2
2
  require 'rubygems/command_manager'
3
3
  require 'rubygems_plugin'
4
4
 
5
- gem 'minitest-macruby-pride', '>= 2.2.0'
5
+ gem 'minitest', '>= 2.6.1'
6
6
  require 'minitest/autorun'
7
7
  require 'minitest/pride'
@@ -0,0 +1,13 @@
1
+ class TestGemAnalyzer < MiniTest::Unit::TestCase
2
+
3
+ def test_finds_usage_of___FILE__
4
+ assert_raises Gem::Analyzer::Warning do
5
+ Gem::Analyzer.new("__FILE__").parse
6
+ end
7
+
8
+ assert_block do
9
+ Gem::Analyzer.new("puts '__FILE__'").parse
10
+ end
11
+ end
12
+
13
+ end
@@ -4,19 +4,19 @@ class TestAutoCompile < MiniTest::Unit::TestCase
4
4
  @command = Gem::Commands::AutoCompileCommand.new
5
5
  end
6
6
 
7
- def test_turn_on
8
- end
7
+ # def test_turn_on
8
+ # end
9
9
 
10
- def test_turn_on_when_already_on
11
- end
10
+ # def test_turn_on_when_already_on
11
+ # end
12
12
 
13
- def test_turn_off
14
- end
13
+ # def test_turn_off
14
+ # end
15
15
 
16
- def test_turn_off_when_already_off
17
- end
16
+ # def test_turn_off_when_already_off
17
+ # end
18
18
 
19
- def test_calls_compile_on_each_gem_after_installation
20
- end
19
+ # def test_calls_compile_on_each_gem_after_installation
20
+ # end
21
21
 
22
22
  end
@@ -0,0 +1,39 @@
1
+ # class CommonMethodsTester
2
+ # include Gem::CompileMethods
3
+
4
+ # class Gem
5
+ # class << self
6
+ # def source_index
7
+ # GemList.new
8
+ # end
9
+ # end
10
+ # end
11
+
12
+ # end
13
+
14
+ # class GemList
15
+ # def all_gems
16
+ # ['the', 'answer', 'to', 'life', 'the', 'universe', 'and', 'everything']
17
+ # end
18
+ # end
19
+
20
+ # class TestCommonMethods < MiniTest::Unit::TestCase
21
+
22
+ # def modul
23
+ # @@modul ||= CommonMethodsTester.new
24
+ # end
25
+
26
+ # def test_execution_list
27
+ # end
28
+
29
+ # def test_gems_list
30
+ # def modul.options
31
+ # { all: true }
32
+ # end
33
+ # assert_equal GemList.new.all_gems, modul.gems_list
34
+ # end
35
+
36
+ # def test_dependencies_for
37
+ # end
38
+
39
+ # end
@@ -1,36 +1,32 @@
1
1
  class TestCompileCommand < MiniTest::Unit::TestCase
2
+
2
3
  def setup
3
4
  @command = Gem::Commands::CompileCommand.new
4
5
  end
5
- end
6
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
7
+ # def test_finds_all_files
8
+ # # gets into all require dirs
9
+ # # does not compile test files
10
+ # end
11
+ # def test_recompiles_rbos_if_they_already_exist
12
+ # # to support use on nightly builds
13
+ # end
16
14
 
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
15
+ # def test_has_an_option_to_compile_all_installed_gems
16
+ # # by extension, this is also needed to support nightly build users
17
+ # end
22
18
 
23
- class TestCompileSpecialCases < TestCompileCommand
24
- def test_refuses_to_compile_itself
25
- # obvious
26
- end
19
+ # def test_refuses_to_compile_itself
20
+ # # obvious
21
+ # end
27
22
 
28
- def test_loads_rubyc_without_warning
29
- # this might not be doable without upstream load guarding; minor issue
30
- end
23
+ # def test_loads_rubyc_without_warning
24
+ # # this might not be doable without upstream load guarding; minor issue
25
+ # end
26
+
27
+ # # important to test so we don't break rubygems
28
+ # def test_skips_loading_on_older_macruby_versions
29
+ # # and prints a message
30
+ # end
31
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
32
  end
@@ -4,13 +4,13 @@ class TestUncompileCommand < MiniTest::Unit::TestCase
4
4
  @command = Gem::Commands::UncompileCommand.new
5
5
  end
6
6
 
7
- def test_removes_rbo_files
8
- end
7
+ # def test_removes_rbo_files
8
+ # end
9
9
 
10
- def test_leaves_rb_files
11
- end
10
+ # def test_leaves_rb_files
11
+ # end
12
12
 
13
- def test_can_uncompile_multiple_gems_at_once
14
- end
13
+ # def test_can_uncompile_multiple_gems_at_once
14
+ # end
15
15
 
16
16
  end
metadata CHANGED
@@ -2,33 +2,33 @@
2
2
  name: rubygems-compile
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 5
5
- version: 1.0.0rc2
5
+ version: 1.0.0rc3
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-06-28 00:00:00 -04:00
12
+ date: 2011-10-15 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: minitest-macruby-pride
16
+ name: minitest
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.2.0
23
+ version: 2.6.1
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.2.0
31
- description: 'A set of rubygems commands that interface with the MacRuby compiler.
30
+ version: 2.6.1
31
+ description: 'A trio of rubygems commands that interface with the MacRuby compiler.
32
32
 
33
33
  '
34
34
  email: mrada@marketcircle.com
@@ -38,7 +38,7 @@ extra_rdoc_files:
38
38
  - LICENSE.txt
39
39
  - README.markdown
40
40
  files:
41
- - lib/rubygems-compile/analysis.rb
41
+ - lib/rubygems-compile/analyzer.rb
42
42
  - lib/rubygems-compile/commands/autocompile_command.rb
43
43
  - lib/rubygems-compile/commands/compile_command.rb
44
44
  - lib/rubygems-compile/commands/uncompile_command.rb
@@ -49,7 +49,9 @@ files:
49
49
  - lib/rubygems-compile/uncompiler.rb
50
50
  - lib/rubygems_plugin.rb
51
51
  - test/helper.rb
52
+ - test/test_analyzer.rb
52
53
  - test/test_autocompile_command.rb
54
+ - test/test_common_methods.rb
53
55
  - test/test_compile_command.rb
54
56
  - test/test_uncompile_command.rb
55
57
  - Rakefile
@@ -85,10 +87,12 @@ rubyforge_project:
85
87
  rubygems_version: 1.4.2
86
88
  signing_key:
87
89
  specification_version: 3
88
- summary: A set of rubygems commands that interface with the MacRuby compiler
90
+ summary: A trio of rubygems commands that interface with the MacRuby compiler
89
91
  test_files:
90
92
  - test/helper.rb
93
+ - test/test_analyzer.rb
91
94
  - test/test_autocompile_command.rb
95
+ - test/test_common_methods.rb
92
96
  - test/test_compile_command.rb
93
97
  - test/test_uncompile_command.rb
94
98
  - Rakefile
@@ -1,11 +0,0 @@
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