rubygems-compile 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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