bootsnap 1.1.5 → 1.1.6.beta

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: c3e149a8eb8efa3469c157ec2858ccfbe1613a84
4
- data.tar.gz: eb7b1180fc432ffd80b88849b7ffe7df50fd409e
3
+ metadata.gz: 784acf6d2a96507d9de9157b756638da8b7608a0
4
+ data.tar.gz: 512ef099f20aaa5a15c06d4da67f2c4f6db066f2
5
5
  SHA512:
6
- metadata.gz: dc8848fdac6603869affe7f7329bdf3bf691233fd4031d0d4481cee6190623b4d388a6d868bca7d7f49ff9da6bd622f8b98a9056314a344ee980103d2ae2d2dc
7
- data.tar.gz: 91326a624801bd3c24053bd789a1157d497c35e44a7c5993f06c11f51eadebf3fed8305195e57e3d8e907415875763c592e6772842692c6155ff0f60d4f6dbf0
6
+ metadata.gz: cd76edbe3f2f62313dbfe86c3d0b4c661cff63c5e735d43992e59be9b08c86d11e1379f54c1dbc6b87b5355e29201f2e9c5431459fb078ed392778065783f52d
7
+ data.tar.gz: cfab4dfe53c4baffd3e46a939ceb07eff285f4b0a607df521f7f0b20ea9f66284a32eade3732ed12decd10c11c1c561664d32ba4230db8b4ae8d9fb46655f113
@@ -1,5 +1,4 @@
1
- os: osx
2
1
  language: ruby
3
- rvm: ruby-2.4.0
2
+ rvm: ruby-2.4.1
4
3
  before_script: rake
5
4
  script: bin/testunit
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # Bootsnap [![Build Status](https://travis-ci.org/Shopify/bootsnap.svg?branch=master)](https://travis-ci.org/Shopify/bootsnap)
2
2
 
3
- **Beta-quality. See [the last section of this README](#trustworthiness).**
4
-
5
3
  Bootsnap is a library that plugs into Ruby, with optional support for `ActiveSupport` and `YAML`,
6
4
  to optimize and cache expensive computations. See [How Does This Work](#how-does-this-work).
7
5
 
@@ -48,6 +46,11 @@ Bootsnap.setup(
48
46
  'bootsnap')` using [this trick](https://github.com/Shopify/bootsnap/wiki/Bootlib::Require). This
49
47
  will help optimize boot time further if you have an extremely large `$LOAD_PATH`.
50
48
 
49
+ Note: Bootsnap and [Spring](https://github.com/rails/spring) are orthogonal tools. While Bootsnap
50
+ speeds up the loading of individual source files, Spring keeps a copy of a pre-booted Rails process
51
+ on hand to completely skip parts of the boot process the next time it's needed. The two tools work
52
+ well together, and are both included in a newly-generated Rails applications by default.
53
+
51
54
  ## How does this work?
52
55
 
53
56
  Bootsnap optimizes methods to cache results of expensive computations, and can be grouped
@@ -264,21 +267,3 @@ open /c/nope.bundle -> -1
264
267
  ```
265
268
  # (nothing!)
266
269
  ```
267
-
268
- ## Trustworthiness
269
-
270
- We use the `*_path_cache` features in production and haven't experienced any issues in a long time.
271
-
272
- The `compile_cache_*` features work well for us in development on macOS. It should work on Linux,
273
- and we intend to deploy it in production, but we haven't yet.
274
-
275
- `disable_trace` should be completely safe, but we don't really use it because some people like to
276
- use tools that make use of `trace` instructions.
277
-
278
- | feature | where we're using it |
279
- |-|-|
280
- | `load_path_cache` | everywhere |
281
- | `autoload_path_cache` | everywhere |
282
- | `disable_trace` | nowhere, but it's safe unless you need tracing |
283
- | `compile_cache_iseq` | development, but probably safe to use everywhere |
284
- | `compile_cache_yaml` | development, but probably safe to use everywhere |
@@ -513,24 +513,24 @@ bs_read_contents(int fd, size_t size, char ** contents)
513
513
  * Bootsnap::CompileCache::Native.fetch.
514
514
  *
515
515
  * There are three "formats" in use here:
516
- * 1. "input" fomat, which is what we load from the source file;
516
+ * 1. "input" format, which is what we load from the source file;
517
517
  * 2. "storage" format, which we write to the cache;
518
518
  * 3. "output" format, which is what we return.
519
519
  *
520
520
  * E.g., For ISeq compilation:
521
- * input: ruby source, as text
521
+ * input: ruby source, as text
522
522
  * storage: binary string (RubyVM::InstructionSequence#to_binary)
523
- * output: Instance of RubyVM::InstructionSequence
523
+ * output: Instance of RubyVM::InstructionSequence
524
524
  *
525
525
  * And for YAML:
526
- * input: yaml as text
526
+ * input: yaml as text
527
527
  * storage: MessagePack or Marshal text
528
- * output: ruby object, loaded from yaml/messagepack/marshal
528
+ * output: ruby object, loaded from yaml/messagepack/marshal
529
529
  *
530
- * The handler passed in must support three messages:
531
- * * storage_to_output(s) -> o
532
- * * input_to_output(i) -> o
533
- * * input_to_storage(i) -> s
530
+ * A handler<I,S,O> passed in must support three messages:
531
+ * * storage_to_output(S) -> O
532
+ * * input_to_output(I) -> O
533
+ * * input_to_storage(I) -> S
534
534
  * (input_to_storage may raise Bootsnap::CompileCache::Uncompilable, which
535
535
  * will prevent caching and cause output to be generated with
536
536
  * input_to_output)
@@ -655,7 +655,17 @@ invalid_type_storage_data:
655
655
  /********************* Handler Wrappers **************************************/
656
656
  /*****************************************************************************
657
657
  * Everything after this point in the file is just wrappers to deal with ruby's
658
- * clunky method of handling exceptions from ruby methods invoked from C.
658
+ * clunky method of handling exceptions from ruby methods invoked from C:
659
+ *
660
+ * In order to call a ruby method from C, while protecting against crashing in
661
+ * the event of an exception, we must call the method with rb_protect().
662
+ *
663
+ * rb_protect takes a C function and precisely one argument; however, we want
664
+ * to pass multiple arguments, so we must create structs to wrap them up.
665
+ *
666
+ * These functions return an exception_tag, which, if non-zero, indicates an
667
+ * exception that should be jumped to with rb_jump_tag after cleaning up
668
+ * allocated resources.
659
669
  */
660
670
 
661
671
  struct s2o_data {
@@ -1,4 +1,5 @@
1
1
  require_relative 'bootsnap/version'
2
+ require_relative 'bootsnap/bundler'
2
3
  require_relative 'bootsnap/load_path_cache'
3
4
  require_relative 'bootsnap/compile_cache'
4
5
 
@@ -0,0 +1,12 @@
1
+ module Bootsnap
2
+ module_function
3
+
4
+ def bundler?
5
+ # Bundler environment variable
6
+ ['BUNDLE_BIN_PATH', 'BUNDLE_GEMFILE'].each do |current|
7
+ return true if ENV.key?(current)
8
+ end
9
+
10
+ false
11
+ end
12
+ end
@@ -45,6 +45,10 @@ module Bootsnap
45
45
  # NoMethodError is a NameError, but we only want to handle actual
46
46
  # NameError instances.
47
47
  raise unless e.class == NameError
48
+ # We can only confidently handle cases when *this* constant fails
49
+ # to load, not other constants referred to by it.
50
+ raise unless e.name == const_name
51
+ # If the constant was actually loaded, something else went wrong?
48
52
  raise if from_mod.const_defined?(const_name)
49
53
  CoreExt::ActiveSupport.without_bootsnap_cache { super }
50
54
  end
@@ -99,7 +99,7 @@ module Bootsnap
99
99
  @stability ||= begin
100
100
  if Gem.path.detect { |p| expanded_path.start_with?(p.to_s) }
101
101
  STABLE
102
- elsif expanded_path.start_with?(Bundler.bundle_path.to_s)
102
+ elsif Bootsnap.bundler? && expanded_path.start_with?(Bundler.bundle_path.to_s)
103
103
  STABLE
104
104
  elsif expanded_path.start_with?(RUBY_LIBDIR) && !expanded_path.start_with?(RUBY_SITEDIR)
105
105
  STABLE
@@ -15,7 +15,8 @@ module Bootsnap
15
15
  REQUIRABLES_AND_DIRS = "/{,*/**/}*{#{DOT_RB},#{DL_EXTENSIONS.join(',')},/}"
16
16
  NORMALIZE_NATIVE_EXTENSIONS = !DL_EXTENSIONS.include?(LoadPathCache::DOT_SO)
17
17
  ALTERNATIVE_NATIVE_EXTENSIONS_PATTERN = /\.(o|bundle|dylib)\z/
18
- BUNDLE_PATH = (Bundler.bundle_path.cleanpath.to_s << LoadPathCache::SLASH).freeze
18
+ BUNDLE_PATH = Bootsnap.bundler? ?
19
+ (Bundler.bundle_path.cleanpath.to_s << LoadPathCache::SLASH).freeze : ''.freeze
19
20
 
20
21
  def self.call(path)
21
22
  path = path.to_s
@@ -4,16 +4,10 @@ env = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || ENV['ENV']
4
4
  development_mode = ['', nil, 'development'].include?(env)
5
5
 
6
6
  # only enable on 'ruby' (MRI), POSIX (darin, linux, *bsd), and >= 2.3.0
7
- enable_cc = \
8
- RUBY_ENGINE == 'ruby' && \
9
- RUBY_PLATFORM =~ /darwin|linux|bsd/ && \
10
- RUBY_VERSION # "1.9.3"
11
- .split('.') # ["1", "9", "3"]
12
- .map(&:to_i) # [1, 9, 3]
13
- .zip([2, 3, -1]) # [[1, 2], [9, 3], [3, -1]]
14
- .map { |a, b| a <=> b } # [-1, 1, 1]
15
- .detect { |e| !e.zero? } # -1
16
- .==(1) # false
7
+ enable_cc =
8
+ RUBY_ENGINE == 'ruby' &&
9
+ RUBY_PLATFORM =~ /darwin|linux|bsd/ &&
10
+ Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.3.0")
17
11
 
18
12
  cache_dir = ENV['BOOTSNAP_CACHE_DIR']
19
13
  unless cache_dir
@@ -1,3 +1,3 @@
1
1
  module Bootsnap
2
- VERSION = "1.1.5"
2
+ VERSION = "1.1.6.beta"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootsnap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.1.6.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Burke Libbey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-06 00:00:00.000000000 Z
11
+ date: 2017-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -121,6 +121,7 @@ files:
121
121
  - ext/bootsnap/bootsnap.h
122
122
  - ext/bootsnap/extconf.rb
123
123
  - lib/bootsnap.rb
124
+ - lib/bootsnap/bundler.rb
124
125
  - lib/bootsnap/compile_cache.rb
125
126
  - lib/bootsnap/compile_cache/iseq.rb
126
127
  - lib/bootsnap/compile_cache/yaml.rb
@@ -150,12 +151,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
151
  version: 2.0.0
151
152
  required_rubygems_version: !ruby/object:Gem::Requirement
152
153
  requirements:
153
- - - ">="
154
+ - - ">"
154
155
  - !ruby/object:Gem::Version
155
- version: '0'
156
+ version: 1.3.1
156
157
  requirements: []
157
158
  rubyforge_project:
158
- rubygems_version: 2.6.13
159
+ rubygems_version: 2.6.14
159
160
  signing_key:
160
161
  specification_version: 4
161
162
  summary: Boot large ruby/rails apps faster