rubygems-precompiled 1.0.0 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0e5cac9e19549ede238139f4fda54ccc3fd8d1c
4
- data.tar.gz: 0fc7264556763bd4bc0499324356b26e116abb24
3
+ metadata.gz: 718a7b49fe7f73247987a88ae55bbfddf0efee7e
4
+ data.tar.gz: 7b0c230d2c75810b6c936b2d83a5fb46641f3bac
5
5
  SHA512:
6
- metadata.gz: a38e2d35832ad3bcbf2a8a09985aa2f26b137b4ec7e83c902c8c2cbe1740623455e317b9ed43a5a21e83f5587b5710c0683ffa6d69b902fc065f6983cf35de7b
7
- data.tar.gz: a67172765f91f0cc7f2a93603e62e1130cb36b2847254e8a33b95bdd64e2680b6f9b090d6b3b1c6fe0ef30365ea27b4a06ed2cb304bd0b8d7d22cf5ff8c06609
6
+ metadata.gz: b9f67856cba175412a497ce3a67b17ac26cf3fd56062cfb6b55614ca297b2f31bfd1bca00af96231274886e708fe231901c9a93d8216c30027bb7892531a3a11
7
+ data.tar.gz: e5c35c515a6cfc1598e30a15aaf37b94c70cb073c22080e3b0763cdb58d2305e36592f1ec61dc05bb192ce16f09011dc1ce761e94d841c27a3b51a6c958e9ea9
@@ -3,8 +3,6 @@ Feature: Installing using a compiled-cache
3
3
  Background:
4
4
  Given I have wiped the folder "/tmp/precompiled-workroot"
5
5
 
6
- # Scenario: Installing a compiled gem without the cache
7
-
8
6
  Scenario: Installing a compiled gem with a cache miss
9
7
  Given I use the gem configuration option
10
8
  """
@@ -16,14 +14,14 @@ Feature: Installing using a compiled-cache
16
14
  Then I should see "Building native extensions"
17
15
  Then I should not see "Loading native extension from cache"
18
16
 
19
- When I execute
17
+ When I run ruby
20
18
  """
21
- echo "puts CompiledClass.new.test_method" | ruby -I/tmp/precompiled-workroot/installroot/gems/compiled-gem-0.0.1/lib -rtest_ext/test_ext
19
+ require "test_ext/test_ext"
20
+ puts CompiledClass.new.test_method
22
21
  """
23
22
 
24
23
  Then I should see "Hello, world!"
25
24
 
26
- # this works in reality but the test is dodgy on ruby 2. Needs investment in time to fix
27
25
  Scenario: Installing a compiled gem with a cache hit
28
26
  Given I use the gem configuration option
29
27
  """
@@ -38,9 +36,10 @@ Feature: Installing using a compiled-cache
38
36
  Then I should not see "Building native extensions"
39
37
  Then I should see "Loading native extension from cache"
40
38
 
41
- When I execute
39
+ When I run ruby
42
40
  """
43
- echo "puts CompiledClass.new.test_method" | ruby -I/tmp/precompiled-workroot/installroot/gems/compiled-gem-0.0.1/lib -rtest_ext/test_ext
41
+ require "test_ext/test_ext"
42
+ puts CompiledClass.new.test_method
44
43
  """
45
44
 
46
45
  Then I should see "Hello, world!"
@@ -28,6 +28,7 @@ Feature: Pre-compiling gems
28
28
  And the command should return a success status code
29
29
 
30
30
  Scenario: Pre-compiling a single compiled gem with --build-config
31
+ Given this version of rubygems supports build options
31
32
  When I run the command "gem precompile --verbose --build-config='--foo --bar' compiled-gem.gem"
32
33
 
33
34
  Then I should see "build-args --foo --bar"
@@ -35,14 +35,29 @@ def execute(command)
35
35
  puts @last_stderr
36
36
  end
37
37
 
38
- When /^I (?:run the command|execute) "(.*?)"( ignoring the exit code)?$/ do |command,ignore_exit_code|
38
+ When /^I (?:run ruby)$/ do |command|
39
+ installroot = "/tmp/precompiled-workroot/installroot"
40
+ extension_path = if Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.0.0")
41
+ "#{installroot}/gems/compiled-gem-0.0.1/lib"
42
+ else
43
+ "#{installroot}/extensions/#{Gem::Platform.local}/#{RbConfig::CONFIG["ruby_version"]}-static/compiled-gem-0.0.1"
44
+ end
45
+
46
+ cmd = %{cat <<RUBY | ruby -I "#{extension_path}"
47
+ #{command}
48
+ RUBY}
49
+ execute(cmd)
50
+ raise RuntimeError, "Command '#{command}' exited with non-zero exit status" unless @last_status == 0
51
+ end
52
+
53
+ When /^I (?:run the command|execute) "(.*?)"( ignoring the exit code)?$/ do |command, ignore_exit_code|
39
54
  execute(command)
40
55
  raise RuntimeError, "Command '#{command}' exited with non-zero exit status" unless ignore_exit_code or @last_status == 0
41
-
42
56
  end
57
+
43
58
  When /^I (?:run the command|execute)$/ do |command|
44
- execute(command)
45
- raise RuntimeError, "Command '#{command}' exited with non-zero exit status" unless @last_status == 0
59
+ execute(command)
60
+ raise RuntimeError, "Command '#{command}' exited with non-zero exit status" unless @last_status == 0
46
61
  end
47
62
 
48
63
  Then /^I should( not)? see "(.*?)"( on (stdout|stderr))?$/ do |invert, expect, any, channel|
@@ -65,7 +80,7 @@ Then /^the command should leave behind temporary directories/ do
65
80
  data = @last_stdout + @last_stderr
66
81
  data.each_line do |l|
67
82
  if m = l.match(/Leaving (.*) in place/)
68
- expect(Dir.exists?(m[1])).to be_true
83
+ expect(Dir.exists?(m[1])).to be true
69
84
  end
70
85
  end
71
86
  end
@@ -21,11 +21,12 @@ Given /^I have changed to a temporary directory(?: containing "(.*?)")?$/ do |gl
21
21
  FileUtils.chdir(directory)
22
22
  end
23
23
  After do
24
+ FileUtils.chdir(OriginalWorkingDirectory)
24
25
  cleanup.each { |dir| FileUtils.rm_rf(dir) }
25
26
  end
26
27
 
27
28
  Then /^the folder "(.*?)" should exist$/ do |folder|
28
- File.directory?(folder).should be_true
29
+ expect(File.directory?(folder)).to be true
29
30
  end
30
31
 
31
32
  Then /^the file "(.*?)" should (not )?exist$/ do |file, invert|
@@ -0,0 +1,6 @@
1
+ Given /this version of rubygems supports build options/ do
2
+ require "rubygems/installer"
3
+ unless Gem::Installer.method_defined?(:write_build_info_file)
4
+ pending "This test will not pass on this version of rubygems."
5
+ end
6
+ end
@@ -1,4 +1,7 @@
1
1
  require 'rubygems/precompiled/version'
2
+ require "rubygems/precompiled/file_cache"
3
+ require "rubygems/precompiled/http_cache"
4
+
2
5
  require 'rubygems/installer'
3
6
  require 'rubygems/ext/builder'
4
7
  require 'rubygems/package/tar_reader'
@@ -9,66 +12,6 @@ require 'uri'
9
12
  require 'tempfile'
10
13
 
11
14
  module Precompiled
12
-
13
- def self.included(base)
14
- base.send(:alias_method, :build_extensions_without_cache, :build_extensions)
15
- base.send(:alias_method, :build_extensions, :build_extensions_with_cache)
16
- end
17
-
18
- class BaseCache
19
- def initialize(root_uri)
20
- @root_uri = root_uri
21
- end
22
-
23
- def retrieve(spec)
24
- raise "Must be overriden!"
25
- end
26
- def contains?(spec)
27
- false
28
- end
29
- def cache_key(spec)
30
- "/ruby-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}/#{Gem::Platform.local.to_s}/#{spec.name}-#{spec.version}.tar.gz"
31
- end
32
- end
33
-
34
- class FileCache < BaseCache
35
- def path_for(spec)
36
- File.join(@root_uri.path, cache_key(spec))
37
- end
38
- def contains?(spec)
39
- File.exists?(path_for(spec))
40
- end
41
-
42
- def retrieve(spec)
43
- yield path_for(spec)
44
- end
45
- end
46
-
47
- class HttpCache < BaseCache
48
- def uri_to_spec(spec)
49
- URI.join(@root_uri, File.join(@root_uri.path, cache_key(spec)))
50
- end
51
- def contains?(spec)
52
- uri = uri_to_spec(spec)
53
- http = Net::HTTP.start(uri.host, uri.port)
54
- http.head(uri.path).code == "200"
55
- end
56
- def retrieve(spec)
57
- tempfile = Tempfile.new('cache-hit')
58
- uri = uri_to_spec(spec)
59
- http = Net::HTTP.start(uri.host, uri.port)
60
- http.request_get(uri.path) do |resp|
61
- resp.read_body do |segment|
62
- tempfile.write(segment)
63
- end
64
- tempfile.close
65
- end
66
-
67
- yield tempfile
68
- tempfile.delete
69
- end
70
- end
71
-
72
15
  GemCache = {
73
16
  'file' => FileCache,
74
17
  'http' => HttpCache
@@ -84,43 +27,50 @@ module Precompiled
84
27
  end
85
28
  end
86
29
 
87
- def build_extensions_with_cache
88
- cache = Precompiled.precompiled_caches.find { |cache| cache.contains?(@spec) }
30
+ module InstallerExtension
31
+ def self.included(base)
32
+ base.send(:alias_method, :build_extensions_without_cache, :build_extensions)
33
+ base.send(:alias_method, :build_extensions, :build_extensions_with_cache)
34
+ end
35
+
89
36
 
90
- if cache
91
- $stderr.puts "Loading native extension from cache"
92
- cache.retrieve(@spec) do |path|
93
- if @spec.respond_to?(:extension_dir)
94
- overlay_tarball(path, @spec.extension_dir)
95
- else
96
- overlay_tarball(path, @gem_dir)
37
+ def build_extensions_with_cache
38
+ cache = Precompiled.precompiled_caches.find { |cache| cache.contains?(spec) }
39
+
40
+ if cache
41
+ $stderr.puts "Loading native extension from cache"
42
+ cache.retrieve(spec) do |path|
43
+ if spec.respond_to?(:extension_dir)
44
+ precompile_overlay_tarball(path, spec.extension_dir)
45
+ else
46
+ precompile_overlay_tarball(path, @gem_dir)
47
+ end
97
48
  end
49
+ else
50
+ build_extensions_without_cache
98
51
  end
99
- else
100
- build_extensions_without_cache
101
52
  end
102
- end
103
53
 
104
- # Private: Extracts a .tar.gz file on-top of the gem's installation directory
105
- def overlay_tarball(tarball, target_root)
106
- Zlib::GzipReader.open(tarball) do |gzip_io|
107
- Gem::Package::TarReader.new(gzip_io) do |tar|
108
- tar.each do |entry|
109
- target_path = File.join(target_root, entry.full_name)
110
- if entry.directory?
111
- FileUtils.mkdir_p(target_path)
112
- elsif entry.file?
113
- FileUtils.mkdir_p(File.dirname(target_path))
114
- File.open(target_path, "w") do |f|
115
- f.write entry.read(1024*1024) until entry.eof?
54
+ # Private: Extracts a .tar.gz file on-top of the gem's installation directory
55
+ def precompile_overlay_tarball(tarball, target_root)
56
+ Zlib::GzipReader.open(tarball) do |gzip_io|
57
+ Gem::Package::TarReader.new(gzip_io) do |tar|
58
+ tar.each do |entry|
59
+ target_path = File.join(target_root, entry.full_name)
60
+ if entry.directory?
61
+ FileUtils.mkdir_p(target_path)
62
+ elsif entry.file?
63
+ FileUtils.mkdir_p(File.dirname(target_path))
64
+ File.open(target_path, "w") do |f|
65
+ f.write entry.read(1024*1024) until entry.eof?
66
+ end
116
67
  end
68
+ entry.close
117
69
  end
118
- entry.close
119
- end
120
- end
70
+ end
71
+ end
121
72
  end
122
73
  end
123
-
124
74
  end
125
75
 
126
- Gem::Installer.send(:include, Precompiled)
76
+ Gem::Installer.send(:include, Precompiled::InstallerExtension)
@@ -0,0 +1,19 @@
1
+ module Precompiled
2
+ class BaseCache
3
+ def initialize(root_uri)
4
+ @root_uri = root_uri
5
+ end
6
+
7
+ def retrieve(spec)
8
+ raise "Must be overriden!"
9
+ end
10
+
11
+ def contains?(spec)
12
+ false
13
+ end
14
+
15
+ def cache_key(spec)
16
+ "/ruby-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}/#{Gem::Platform.local.to_s}/#{spec.name}-#{spec.version}.tar.gz"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ require "rubygems/precompiled/base_cache"
2
+
3
+ module Precompiled
4
+ class FileCache < BaseCache
5
+ def path_for(spec)
6
+ File.join(@root_uri.path, cache_key(spec))
7
+ end
8
+
9
+ def contains?(spec)
10
+ File.exists?(path_for(spec))
11
+ end
12
+
13
+ def retrieve(spec)
14
+ yield path_for(spec)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ require "rubygems/precompiled/base_cache"
2
+
3
+ module Precompiled
4
+ class HttpCache < BaseCache
5
+ def uri_to_spec(spec)
6
+ URI.join(@root_uri, File.join(@root_uri.path, cache_key(spec)))
7
+ end
8
+
9
+ def contains?(spec)
10
+ uri = uri_to_spec(spec)
11
+ http = Net::HTTP.start(uri.host, uri.port)
12
+ http.head(uri.path).code == "200"
13
+ end
14
+
15
+ def retrieve(spec)
16
+ tempfile = Tempfile.new('cache-hit')
17
+ uri = uri_to_spec(spec)
18
+ http = Net::HTTP.start(uri.host, uri.port)
19
+ http.request_get(uri.path) do |resp|
20
+ resp.read_body do |segment|
21
+ tempfile.write(segment)
22
+ end
23
+ tempfile.close
24
+ end
25
+
26
+ yield tempfile
27
+ tempfile.delete
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  module Rubygems
2
2
  module Precompiled
3
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0"
4
4
  end
5
5
  end
@@ -34,34 +34,34 @@ class Gem::Precompiler
34
34
  end
35
35
  end
36
36
 
37
- # Private: Extracts the gem files into the specified path
37
+ # Private: Extracts the gem files into the specified path
38
38
  #
39
39
  def extract_files_into(dir)
40
40
  @installer.unpack(dir)
41
41
  end
42
42
 
43
- # Public: Returns the name of the gem
43
+ # Public: Returns the name of the gem
44
44
  #
45
45
  # Returns a string
46
46
  def gem_name
47
47
  @spec.name
48
48
  end
49
49
 
50
- # Public: Returns the version string of the gem
50
+ # Public: Returns the version string of the gem
51
51
  #
52
- # Returns a Gem::Version
52
+ # Returns a Gem::Version
53
53
  def gem_version
54
54
  @spec.version
55
55
  end
56
56
 
57
- # Public: Returns the relative require-paths specified by the gem
57
+ # Public: Returns the relative require-paths specified by the gem
58
58
  #
59
59
  # Returns an array of strings
60
60
  def gem_require_paths
61
61
  @spec.require_paths
62
62
  end
63
63
 
64
- # Public: Does the gem actually have any compiled extensions?
64
+ # Public: Does the gem actually have any compiled extensions?
65
65
  #
66
66
  # Returns boolean - true if the gem has a c-extension that needs building
67
67
  def has_extension?
@@ -96,7 +96,7 @@ class Gem::Precompiler
96
96
  File.join(*[@target_dir, "#{gem_name}-#{gem_version.to_s}.tar.gz"].compact)
97
97
  end
98
98
 
99
- # Private: Calls the code necessary to build all the extensions
99
+ # Private: Calls the code necessary to build all the extensions
100
100
  # into a specified install root
101
101
  #
102
102
  # Returns a list of files beneath that root making up the build
@@ -171,7 +171,7 @@ class Gem::Precompiler
171
171
  FileUtils.mv(temp_output.path, output_path)
172
172
  end
173
173
 
174
- # Private: Yield a reference to a TarWriter that writes to
174
+ # Private: Yield a reference to a TarWriter that writes to
175
175
  # the specified .tar.gz file
176
176
  #
177
177
  def targz_file(path, &block)
@@ -20,6 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency "rspec", "~> 3.4"
24
24
  spec.add_development_dependency "cucumber"
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubygems-precompiled
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Haggett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-28 00:00:00.000000000 Z
11
+ date: 2016-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '3.4'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '3.4'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: cucumber
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -87,6 +87,9 @@ files:
87
87
  - features/steps/rubygem_steps.rb
88
88
  - lib/rubygems/commands/precompile_command.rb
89
89
  - lib/rubygems/precompiled.rb
90
+ - lib/rubygems/precompiled/base_cache.rb
91
+ - lib/rubygems/precompiled/file_cache.rb
92
+ - lib/rubygems/precompiled/http_cache.rb
90
93
  - lib/rubygems/precompiled/version.rb
91
94
  - lib/rubygems/precompiler.rb
92
95
  - lib/rubygems_plugin.rb