rubygems-compile 1.0.2 → 1.1.0

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.
@@ -6,7 +6,7 @@ MacRuby compiler. This gem requires MacRuby 0.11 or newer.
6
6
  All you need to do is:
7
7
 
8
8
  ```bash
9
- sudo macgem install rubygems-compile --pre
9
+ sudo macgem install rubygems-compile
10
10
  ```
11
11
 
12
12
  And then you're off to the races!
@@ -73,11 +73,10 @@ sudo macgem auto_compile # gems will not be compiled when you install them
73
73
 
74
74
  ## TODO
75
75
 
76
- * Code parsing to WARN about gems that will have issues when compiled
77
76
  * Parallel compilation to speed up compilation of large gems
78
77
  + This might require changes in the MacRuby compiler
79
78
 
80
79
  ## Copyright
81
80
 
82
- Copyright (c) 2011 Mark Rada. See LICENSE.txt for further details.
81
+ Copyright (c) 2011-2012 Mark Rada. See LICENSE.txt for further details.
83
82
 
@@ -7,16 +7,29 @@ require 'ripper'
7
7
  class Gem::Analyzer < Ripper::SexpBuilder
8
8
 
9
9
  ##
10
- # Raised in any case that the given code might display bad
11
- # behaviours that were not intended.
10
+ # Cache of issues found for the current session.
12
11
 
13
- class Warning < Exception
12
+ attr_reader :warnings
13
+
14
+ ##
15
+ # Check the given string of code for potential issues when compiled.
16
+ # Returns the analyzer instance afterwards.
17
+
18
+ def self.check code
19
+ @parser ||= Gem::Analyzer.new(code)
20
+ @parser.parse
21
+ @parser
22
+ end
23
+
24
+ def parse
25
+ @warnings = []
26
+ super
14
27
  end
15
28
 
16
29
  def on_kw token
17
30
  # Related to MacRuby ticket #721
18
31
  if token == '__FILE__'
19
- raise Warning, '__FILE__ keyword is used (MacRuby ticket #721)'
32
+ @warnings << '__FILE__ keyword is used (MacRuby ticket #721)'
20
33
  end
21
34
  end
22
35
 
@@ -1,6 +1,6 @@
1
1
  require 'rubygems/dependency_list'
2
2
  require 'rubygems/version_option'
3
- require 'rubygems-compile/common_methods'
3
+ require 'rubygems-compile/compile_methods'
4
4
 
5
5
 
6
6
  ##
@@ -41,15 +41,12 @@ class Gem::Commands::CompileCommand < Gem::Command
41
41
 
42
42
  def execute
43
43
  gems = execution_list
44
- gems.delete_if { |spec| spec.name == 'rubygems-compile' }
45
-
46
44
  if gems.count >= 10
47
- alert 'This could take a while; you might want to take a coffee break'
45
+ alert 'This could take a while...'
48
46
  end
49
47
 
50
48
  require 'rubygems-compile/compiler'
51
- compiler = Gem::Compiler.new
52
- gems.each { |gem| compiler.compile(gem) }
49
+ gems.each { |gem| Gem::Compiler.compile gem }
53
50
  end
54
51
 
55
52
  end
@@ -1,5 +1,5 @@
1
1
  require 'rubygems/version_option'
2
- require 'rubygems-compile/common_methods'
2
+ require 'rubygems-compile/compile_methods'
3
3
 
4
4
  class Gem::Commands::UncompileCommand < Gem::Command
5
5
  include Gem::VersionOption
@@ -36,8 +36,7 @@ class Gem::Commands::UncompileCommand < Gem::Command
36
36
 
37
37
  def execute
38
38
  require 'rubygems-compile/uncompiler'
39
- uncompiler = Gem::Uncompiler.new
40
- execution_list.each { |gem| uncompiler.uncompile(gem) }
39
+ execution_list.each { |gem| Gem::Uncompiler.uncompile(gem) }
41
40
  end
42
41
 
43
42
  end
@@ -0,0 +1,74 @@
1
+ module Gem::CompileMethods
2
+ if Gem::VERSION.to_f < 1.8
3
+
4
+ def execution_list
5
+ return all_gemspecs if options[:all]
6
+
7
+ specs = get_all_gem_names.map do |gem|
8
+ candidates = Gem.source_index.find_name(gem, options[:version])
9
+
10
+ if candidates.empty?
11
+ alert_error "#{gem} is not installed. Skipping."
12
+ next
13
+ end
14
+
15
+ candidates << dependencies_for(candidates) unless options[:ignore]
16
+ candidates
17
+ end
18
+ specs.flatten!
19
+ specs.uniq!
20
+ specs.delete_if { |spec| spec.name == 'rubygems-compile' }
21
+ specs
22
+ end
23
+
24
+
25
+ private
26
+
27
+ def all_gemspecs
28
+ specs = Gem.source_index.all_gems.map(&:last)
29
+ specs.select { |spec| spec.name != 'rubygems-compile' }
30
+ end
31
+
32
+ def dependencies_for specs
33
+ specs.map { |spec|
34
+ spec.runtime_dependencies.map { |dep|
35
+ deps = Gem.source_index.find_name(dep.name, dep.requirement)
36
+ deps + dependencies_for(deps)
37
+ }
38
+ }
39
+ end
40
+
41
+ else
42
+
43
+ def execution_list
44
+ return all_gemspecs if options[:all]
45
+
46
+ specs = get_all_gem_names.map { |gem|
47
+ gems = Gem::Specification.find_all_by_name(gem, options[:version])
48
+ gems << dependencies_for(gems) unless options[:ignore]
49
+ gems
50
+ }
51
+ specs.flatten!
52
+ specs.uniq!
53
+ specs.delete_if { |spec| spec.name == 'rubygems_compile' }
54
+ specs
55
+ end
56
+
57
+
58
+ private
59
+
60
+ def all_gemspecs
61
+ Gem::Specification.select { |spec| spec.name != 'rubygems-compile' }
62
+ end
63
+
64
+ def dependencies_for specs
65
+ specs.map { |spec|
66
+ spec.runtime_dependencies.map { |dep|
67
+ deps = Gem::Specification.find_all_by_name(dep.name, dep.requirement)
68
+ deps + dependencies_for(deps)
69
+ }
70
+ }
71
+ end
72
+
73
+ end
74
+ end
@@ -1,6 +1,14 @@
1
1
  class Gem::Compiler
2
2
  include Gem::UserInteraction
3
3
 
4
+ class << self
5
+ def compile gem
6
+ @instance ||= Gem::Compiler.new
7
+ @instance.compile gem
8
+ end
9
+ alias_method :call, :compile
10
+ end
11
+
4
12
  def initialize
5
13
  require 'rbconfig'
6
14
  unless MacRuby.const_defined?(:Compiler)
@@ -12,45 +20,34 @@ class Gem::Compiler
12
20
  @config = Gem.configuration
13
21
  end
14
22
 
15
- def call gem
23
+ def compile gem
16
24
  @spec = gem.is_a?(Gem::Specification) ? gem : gem.spec
17
25
 
18
- if @spec.name == 'rubygems-compile'
19
- alert_info 'You cannot compile rubygems-compile' if really_verbose
20
- return
21
- end
22
-
23
- say compilation_message if verbose
26
+ return if trying_to_compile_self?
27
+ say gem_compilation_message if verbose
24
28
 
25
29
  gem_files.each do |file|
26
- message = compile_file_msg(file)
27
- absolute_file_path = File.join(@spec.full_gem_path, file)
28
- if warning = unsafe?(absolute_file_path)
29
- message << "\t\t\tSKIPPED: #{warning.message}"
30
+ message = compile_file_message(file)
31
+ full_path = File.join(@spec.full_gem_path, file)
32
+ if unsafe? full_path
33
+ message << "\t\t\tSKIPPED: #{@parser.warnings.join(', ')}"
30
34
  else
31
- MacRuby::Compiler.new(
32
- bundle: true,
33
- output: "#{absolute_file_path}o",
34
- files: [absolute_file_path]
35
- ).run
35
+ MacRuby::Compiler.compile_file full_path
36
36
  end
37
37
  say message if really_verbose
38
38
  end
39
39
  end
40
- alias_method :compile, :call
41
40
 
42
41
  ##
43
42
  # Uses the GemAnalyzer class to determine if a given file might have
44
43
  # any potential issues when compiled.
45
44
 
46
45
  def unsafe? file
47
- Gem::Analyzer.new(File.read(file)).parse
48
- false
49
- rescue Gem::Analyzer::Warning => e
50
- e
46
+ @parser = Gem::Analyzer.check File.read(file)
47
+ !@parser.warnings.empty?
51
48
  end
52
49
 
53
- def compilation_message
50
+ def gem_compilation_message
54
51
  slash = really_verbose ? '/' : ''
55
52
  "Compiling #{@spec.full_name}#{slash}"
56
53
  end
@@ -67,14 +64,19 @@ class Gem::Compiler
67
64
  # level or test directory.
68
65
  #
69
66
 
70
- def gem_files
71
- @spec.lib_files.select { |file| File.extname(file) == '.rb' }
72
- # files = @spec.files - @spec.test_files - @spec.extra_rdoc_files
73
- # files.reject { |file| file.match /^(?:test|spec)/ }
74
- # .select { |file| file.match /\.rb$/ }
67
+ if Gem::VERSION.to_f < 1.8
68
+ def gem_files
69
+ @spec.lib_files.select { |file| File.extname(file) == '.rb' }
70
+ end
71
+ else
72
+ def gem_files
73
+ Dir.glob("#{@spec.lib_dirs_glob}/**/*.rb").map { |file|
74
+ file.sub(Regexp.new(Regexp.escape(@spec.full_gem_path)), '')
75
+ }
76
+ end
75
77
  end
76
78
 
77
- def compile_file_msg file
79
+ def compile_file_message file
78
80
  name = File.basename(file)
79
81
  dirs = file.chomp(name).split(File::SEPARATOR)
80
82
  tabs = "\t" * dirs.count
@@ -97,4 +99,11 @@ class Gem::Compiler
97
99
  @config.really_verbose
98
100
  end
99
101
 
102
+ def trying_to_compile_self?
103
+ if @spec.name == 'rubygems-compile'
104
+ alert 'You cannot compile rubygems-compile' if really_verbose
105
+ true
106
+ end
107
+ end
108
+
100
109
  end
@@ -5,6 +5,6 @@
5
5
  if Gem.configuration[:compile]
6
6
  require 'rubygems-compile/compiler'
7
7
  module Gem
8
- @post_install_hooks << ::Gem::Compiler.new
8
+ @post_install_hooks << ::Gem::Compiler
9
9
  end
10
10
  end
@@ -1,7 +1,13 @@
1
1
  class Gem::Uncompiler
2
2
  include Gem::UserInteraction
3
3
 
4
+ def self.uncompile gem
5
+ @instance ||= Gem::Uncompiler.new
6
+ @instance.uncompile gem
7
+ end
8
+
4
9
  def initialize
10
+ require 'fileutils'
5
11
  @config = Gem.configuration
6
12
  end
7
13
 
@@ -11,9 +17,9 @@ class Gem::Uncompiler
11
17
  say uncompilation_message if @config.verbose
12
18
 
13
19
  gem_files.each do |file|
14
- say "\tAsploded #{file}" if @config.really_verbose
15
20
  absolute_file_path = File.join(@spec.full_gem_path, file)
16
21
  FileUtils.rm absolute_file_path
22
+ say "\tAsploded #{file}" if @config.really_verbose
17
23
  end
18
24
  end
19
25
 
metadata CHANGED
@@ -2,15 +2,14 @@
2
2
  name: rubygems-compile
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.0.2
5
+ version: 1.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Mark Rada
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-02 00:00:00 -05:00
13
- default_executable:
12
+ date: 2012-02-12 00:00:00 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: minitest
@@ -42,7 +41,7 @@ files:
42
41
  - lib/rubygems-compile/commands/autocompile_command.rb
43
42
  - lib/rubygems-compile/commands/compile_command.rb
44
43
  - lib/rubygems-compile/commands/uncompile_command.rb
45
- - lib/rubygems-compile/common_methods.rb
44
+ - lib/rubygems-compile/compile_methods.rb
46
45
  - lib/rubygems-compile/compiler.rb
47
46
  - lib/rubygems-compile/post_install_hook.rb
48
47
  - lib/rubygems-compile/uncompiler.rb
@@ -57,7 +56,6 @@ files:
57
56
  - .gemtest
58
57
  - LICENSE.txt
59
58
  - README.markdown
60
- has_rdoc: true
61
59
  homepage: http://github.com/ferrous26/rubygems-compile
62
60
  licenses:
63
61
  - MIT
@@ -83,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
81
  version: "0"
84
82
  requirements: []
85
83
  rubyforge_project:
86
- rubygems_version: 1.4.2
84
+ rubygems_version: 1.8.15
87
85
  signing_key:
88
86
  specification_version: 3
89
87
  summary: A trio of rubygems commands that interface with the MacRuby compiler
@@ -1,40 +0,0 @@
1
- module Gem
2
-
3
- module CompileMethods
4
-
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
- # @todo Gem.source_index is going away...
21
- installed_gems = Gem.source_index.all_gems
22
- if options[:all] then
23
- installed_gems.map { |_, spec| spec.name }
24
- else
25
- get_all_gem_names
26
- end
27
- end
28
-
29
- def dependencies_for *specs
30
- specs.map { |spec|
31
- spec.runtime_dependencies.map { |dep|
32
- deps = Gem.source_index.find_name(dep.name,dep.requirement)
33
- deps + dependencies_for(*deps)
34
- }
35
- }
36
- end
37
-
38
- end
39
-
40
- end