bootsnap 1.18.6 → 1.19.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 +4 -4
- data/CHANGELOG.md +13 -7
- data/LICENSE.txt +2 -1
- data/README.md +18 -5
- data/ext/bootsnap/bootsnap.c +1 -1
- data/ext/bootsnap/extconf.rb +1 -1
- data/lib/bootsnap/cli/worker_pool.rb +1 -1
- data/lib/bootsnap/cli.rb +3 -31
- data/lib/bootsnap/compile_cache.rb +5 -10
- data/lib/bootsnap/version.rb +1 -1
- data/lib/bootsnap.rb +5 -3
- metadata +6 -7
- data/lib/bootsnap/compile_cache/json.rb +0 -89
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 71cd833fdf912a81069349b4de87a96cf15997710494eebb4535245aeeb02305
|
|
4
|
+
data.tar.gz: e502571bd2d4863d5f548ce50dcd6502cc18a51dcbf00a101ad1b65f47510534
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d5af0fb8cabbb09d026c8a73043c24d0669004a10edbf0ee3f5baaf8597ac99b7022c0bcaef1c25948dcd055cdd4dbac2ed614d9b2a5d6e58f1e94b6cc32f127
|
|
7
|
+
data.tar.gz: db4c64829ebc8177ed9a83bda8cf801e570f6d48db3e27ddd4522dbd48043a0d619615ba583be4a9ff1a24049785e5dfeed362f36ef1b9115662e9c3b612973d
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Unreleased
|
|
2
2
|
|
|
3
|
+
# 1.19.0
|
|
4
|
+
|
|
5
|
+
* Remove JSON parsing cache. Recent versions of the `json` gem are as fast as `msgpack` if not faster.
|
|
6
|
+
|
|
7
|
+
# 1.18.6
|
|
8
|
+
|
|
3
9
|
* Fix cgroup CPU limits detection in CLI.
|
|
4
10
|
|
|
5
11
|
# 1.18.5
|
|
@@ -103,7 +109,7 @@
|
|
|
103
109
|
|
|
104
110
|
* Get rid of the `Kernel.require_relative` decorator by resolving `$LOAD_PATH` members to their real path.
|
|
105
111
|
This way we handle symlinks in `$LOAD_PATH` much more efficiently. See #402 for the detailed explanation.
|
|
106
|
-
|
|
112
|
+
|
|
107
113
|
* Drop support for Ruby 2.3 (to allow getting rid of the `Kernel.require_relative` decorator).
|
|
108
114
|
|
|
109
115
|
# 1.10.3
|
|
@@ -229,7 +235,7 @@
|
|
|
229
235
|
* Adds an instrumentation API to monitor cache misses.
|
|
230
236
|
* Allow to control the behavior of `require 'bootsnap/setup'` using environment variables.
|
|
231
237
|
* Deprecate the `disable_trace` option.
|
|
232
|
-
* Deprecate the `ActiveSupport::Dependencies` (AKA Classic autoloader) integration. (#344)
|
|
238
|
+
* Deprecate the `ActiveSupport::Dependencies` (AKA Classic autoloader) integration. (#344)
|
|
233
239
|
|
|
234
240
|
# 1.6.0
|
|
235
241
|
|
|
@@ -249,12 +255,12 @@
|
|
|
249
255
|
|
|
250
256
|
# 1.4.9
|
|
251
257
|
|
|
252
|
-
* [Windows support](https://github.com/
|
|
253
|
-
* [Fix potential crash](https://github.com/
|
|
258
|
+
* [Windows support](https://github.com/rails/bootsnap/pull/319)
|
|
259
|
+
* [Fix potential crash](https://github.com/rails/bootsnap/pull/322)
|
|
254
260
|
|
|
255
261
|
# 1.4.8
|
|
256
262
|
|
|
257
|
-
* [Prevent FallbackScan from polluting exception cause](https://github.com/
|
|
263
|
+
* [Prevent FallbackScan from polluting exception cause](https://github.com/rails/bootsnap/pull/314)
|
|
258
264
|
|
|
259
265
|
# 1.4.7
|
|
260
266
|
|
|
@@ -267,7 +273,7 @@
|
|
|
267
273
|
required if a different file with the same name was already being required
|
|
268
274
|
|
|
269
275
|
Example:
|
|
270
|
-
|
|
276
|
+
|
|
271
277
|
require 'foo'
|
|
272
278
|
require 'foo.en'
|
|
273
279
|
|
|
@@ -321,7 +327,7 @@
|
|
|
321
327
|
|
|
322
328
|
# 1.3.0
|
|
323
329
|
|
|
324
|
-
* Handle cases where load path entries are symlinked (https://github.com/
|
|
330
|
+
* Handle cases where load path entries are symlinked (https://github.com/rails/bootsnap/pull/136)
|
|
325
331
|
|
|
326
332
|
# 1.2.1
|
|
327
333
|
|
data/LICENSE.txt
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2017-
|
|
3
|
+
Copyright (c) 2017-2025 Shopify, Inc.
|
|
4
|
+
Copyright (c) 2025-present Rails Foundation
|
|
4
5
|
|
|
5
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
7
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Bootsnap [](https://github.com/rails/bootsnap/actions)
|
|
2
2
|
|
|
3
3
|
Bootsnap is a library that plugs into Ruby, with optional support for `YAML` and `JSON`,
|
|
4
4
|
to optimize and cache expensive computations. See [How Does This Work](#how-does-this-work).
|
|
@@ -41,7 +41,7 @@ getting progressively slower, this is almost certainly the cause.**
|
|
|
41
41
|
It's technically possible to simply specify `gem 'bootsnap', require: 'bootsnap/setup'`, but it's
|
|
42
42
|
important to load Bootsnap as early as possible to get maximum performance improvement.
|
|
43
43
|
|
|
44
|
-
You can see how this require works [here](https://github.com/
|
|
44
|
+
You can see how this require works [here](https://github.com/rails/bootsnap/blob/main/lib/bootsnap/setup.rb).
|
|
45
45
|
|
|
46
46
|
If you are not using Rails, or if you are but want more control over things, add this to your
|
|
47
47
|
application setup immediately after `require 'bundler/setup'` (i.e. as early as possible: the sooner
|
|
@@ -57,13 +57,12 @@ Bootsnap.setup(
|
|
|
57
57
|
load_path_cache: true, # Optimize the LOAD_PATH with a cache
|
|
58
58
|
compile_cache_iseq: true, # Compile Ruby code into ISeq cache, breaks coverage reporting.
|
|
59
59
|
compile_cache_yaml: true, # Compile YAML into a cache
|
|
60
|
-
compile_cache_json: true, # Compile JSON into a cache
|
|
61
60
|
readonly: true, # Use the caches but don't update them on miss or stale entries.
|
|
62
61
|
)
|
|
63
62
|
```
|
|
64
63
|
|
|
65
64
|
**Protip:** You can replace `require 'bootsnap'` with `BootLib::Require.from_gem('bootsnap',
|
|
66
|
-
'bootsnap')` using [this trick](https://github.com/
|
|
65
|
+
'bootsnap')` using [this trick](https://github.com/rails/bootsnap/wiki/Bootlib::Require). This
|
|
67
66
|
will help optimize boot time further if you have an extremely large `$LOAD_PATH`.
|
|
68
67
|
|
|
69
68
|
Note: Bootsnap and [Spring](https://github.com/rails/spring) are orthogonal tools. While Bootsnap
|
|
@@ -170,7 +169,7 @@ The only directories considered "stable" are things under the Ruby install prefi
|
|
|
170
169
|
"volatile".
|
|
171
170
|
|
|
172
171
|
In addition to the [`Bootsnap::LoadPathCache::Cache`
|
|
173
|
-
source](https://github.com/
|
|
172
|
+
source](https://github.com/rails/bootsnap/blob/main/lib/bootsnap/load_path_cache/cache.rb),
|
|
174
173
|
this diagram may help clarify how entry resolution works:
|
|
175
174
|
|
|
176
175
|

|
|
@@ -334,6 +333,20 @@ Example:
|
|
|
334
333
|
$ bundle exec bootsnap precompile --gemfile app/ lib/ config/
|
|
335
334
|
```
|
|
336
335
|
|
|
336
|
+
## Known issues
|
|
337
|
+
|
|
338
|
+
### QEMU environments
|
|
339
|
+
|
|
340
|
+
When building cross-platform Docker images, QEMU is often used for emulation and can be the source of a limitation that causes forked processes to hang. While Bootsnap includes automatic detection for this issue (as of [PR #501](https://github.com/rails/bootsnap/pull/501)), the detection may not always be sufficient.
|
|
341
|
+
|
|
342
|
+
If you encounter hangs during precompilation in QEMU-based environments (such as when using Docker buildx for cross-platform builds), you can work around this by disabling parallelization with the `-j 0` option:
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
$ bundle exec bootsnap precompile -j 0 --gemfile app/ lib/ config/
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
See [Issue #495](https://github.com/rails/bootsnap/issues/495) for more details about this QEMU-related issue.
|
|
349
|
+
|
|
337
350
|
## When not to use Bootsnap
|
|
338
351
|
|
|
339
352
|
*Alternative engines*: Bootsnap is pretty reliant on MRI features, and parts are disabled entirely on alternative ruby
|
data/ext/bootsnap/bootsnap.c
CHANGED
data/ext/bootsnap/extconf.rb
CHANGED
|
@@ -12,7 +12,7 @@ if %w[ruby truffleruby].include?(RUBY_ENGINE)
|
|
|
12
12
|
append_cflags ["-O3", "-std=c99"]
|
|
13
13
|
|
|
14
14
|
# ruby.h has some -Wpedantic fails in some cases
|
|
15
|
-
# (e.g. https://github.com/
|
|
15
|
+
# (e.g. https://github.com/rails/bootsnap/issues/15)
|
|
16
16
|
unless ["0", "", nil].include?(ENV["BOOTSNAP_PEDANTIC"])
|
|
17
17
|
append_cflags([
|
|
18
18
|
"-Wall",
|
|
@@ -59,7 +59,7 @@ module Bootsnap
|
|
|
59
59
|
def fork_defunct?
|
|
60
60
|
return true unless ::Process.respond_to?(:fork)
|
|
61
61
|
|
|
62
|
-
# Ref: https://github.com/
|
|
62
|
+
# Ref: https://github.com/rails/bootsnap/issues/495
|
|
63
63
|
# The second forked process will hang on some QEMU environments
|
|
64
64
|
r, w = IO.pipe
|
|
65
65
|
pids = 2.times.map do
|
data/lib/bootsnap/cli.rb
CHANGED
|
@@ -20,7 +20,7 @@ module Bootsnap
|
|
|
20
20
|
|
|
21
21
|
attr_reader :cache_dir, :argv
|
|
22
22
|
|
|
23
|
-
attr_accessor :compile_gemfile, :exclude, :verbose, :iseq, :yaml, :
|
|
23
|
+
attr_accessor :compile_gemfile, :exclude, :verbose, :iseq, :yaml, :jobs
|
|
24
24
|
|
|
25
25
|
def initialize(argv)
|
|
26
26
|
@argv = argv
|
|
@@ -31,7 +31,6 @@ module Bootsnap
|
|
|
31
31
|
self.jobs = nil
|
|
32
32
|
self.iseq = true
|
|
33
33
|
self.yaml = true
|
|
34
|
-
self.json = true
|
|
35
34
|
end
|
|
36
35
|
|
|
37
36
|
def precompile_command(*sources)
|
|
@@ -42,21 +41,18 @@ module Bootsnap
|
|
|
42
41
|
cache_dir: cache_dir,
|
|
43
42
|
iseq: iseq,
|
|
44
43
|
yaml: yaml,
|
|
45
|
-
json: json,
|
|
46
44
|
revalidation: true,
|
|
47
45
|
)
|
|
48
46
|
|
|
49
47
|
@work_pool = WorkerPool.create(size: jobs, jobs: {
|
|
50
48
|
ruby: method(:precompile_ruby),
|
|
51
49
|
yaml: method(:precompile_yaml),
|
|
52
|
-
json: method(:precompile_json),
|
|
53
50
|
})
|
|
54
51
|
@work_pool.spawn
|
|
55
52
|
|
|
56
53
|
main_sources = sources.map { |d| File.expand_path(d) }
|
|
57
54
|
precompile_ruby_files(main_sources)
|
|
58
55
|
precompile_yaml_files(main_sources)
|
|
59
|
-
precompile_json_files(main_sources)
|
|
60
56
|
|
|
61
57
|
if compile_gemfile
|
|
62
58
|
# Gems that include JSON or YAML files usually don't put them in `lib/`.
|
|
@@ -70,7 +66,6 @@ module Bootsnap
|
|
|
70
66
|
|
|
71
67
|
precompile_ruby_files(gem_paths, exclude: gem_exclude)
|
|
72
68
|
precompile_yaml_files(gem_paths, exclude: gem_exclude)
|
|
73
|
-
precompile_json_files(gem_paths, exclude: gem_exclude)
|
|
74
69
|
end
|
|
75
70
|
|
|
76
71
|
if (exitstatus = @work_pool.shutdown)
|
|
@@ -145,29 +140,6 @@ module Bootsnap
|
|
|
145
140
|
end
|
|
146
141
|
end
|
|
147
142
|
|
|
148
|
-
def precompile_json_files(load_paths, exclude: self.exclude)
|
|
149
|
-
return unless json
|
|
150
|
-
|
|
151
|
-
load_paths.each do |path|
|
|
152
|
-
if !exclude || !exclude.match?(path)
|
|
153
|
-
list_files(path, "**/*.json").each do |json_file|
|
|
154
|
-
# We ignore hidden files to not match the various .config.json files
|
|
155
|
-
if !File.basename(json_file).start_with?(".") && (!exclude || !exclude.match?(json_file))
|
|
156
|
-
@work_pool.push(:json, json_file)
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
def precompile_json(*json_files)
|
|
164
|
-
Array(json_files).each do |json_file|
|
|
165
|
-
if CompileCache::JSON.precompile(json_file) && verbose
|
|
166
|
-
$stderr.puts(json_file)
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
143
|
def precompile_ruby_files(load_paths, exclude: self.exclude)
|
|
172
144
|
return unless iseq
|
|
173
145
|
|
|
@@ -276,9 +248,9 @@ module Bootsnap
|
|
|
276
248
|
opts.on("--no-yaml", help) { self.yaml = false }
|
|
277
249
|
|
|
278
250
|
help = <<~HELP
|
|
279
|
-
Disable JSON precompilation.
|
|
251
|
+
Disable JSON precompilation. Deprecated.
|
|
280
252
|
HELP
|
|
281
|
-
opts.on("--no-json", help) {
|
|
253
|
+
opts.on("--no-json", help) { $stderr.puts("The --no-json option is deprecated and now a noop.") }
|
|
282
254
|
end
|
|
283
255
|
end
|
|
284
256
|
end
|
|
@@ -9,7 +9,11 @@ module Bootsnap
|
|
|
9
9
|
|
|
10
10
|
Error = Class.new(StandardError)
|
|
11
11
|
|
|
12
|
-
def self.setup(cache_dir:, iseq:, yaml:, json
|
|
12
|
+
def self.setup(cache_dir:, iseq:, yaml:, json: (json_unset = true), readonly: false, revalidation: false)
|
|
13
|
+
unless json_unset
|
|
14
|
+
warn("Bootsnap::CompileCache.setup `json` argument is deprecated and has no effect")
|
|
15
|
+
end
|
|
16
|
+
|
|
13
17
|
if iseq
|
|
14
18
|
if supported?
|
|
15
19
|
require_relative "compile_cache/iseq"
|
|
@@ -28,15 +32,6 @@ module Bootsnap
|
|
|
28
32
|
end
|
|
29
33
|
end
|
|
30
34
|
|
|
31
|
-
if json
|
|
32
|
-
if supported?
|
|
33
|
-
require_relative "compile_cache/json"
|
|
34
|
-
Bootsnap::CompileCache::JSON.install!(cache_dir)
|
|
35
|
-
elsif $VERBOSE
|
|
36
|
-
warn("[bootsnap/setup] JSON parsing caching is not supported on this implementation of Ruby")
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
35
|
if supported? && defined?(Bootsnap::CompileCache::Native)
|
|
41
36
|
Bootsnap::CompileCache::Native.readonly = readonly
|
|
42
37
|
Bootsnap::CompileCache::Native.revalidation = revalidation
|
data/lib/bootsnap/version.rb
CHANGED
data/lib/bootsnap.rb
CHANGED
|
@@ -54,8 +54,12 @@ module Bootsnap
|
|
|
54
54
|
revalidation: false,
|
|
55
55
|
compile_cache_iseq: true,
|
|
56
56
|
compile_cache_yaml: true,
|
|
57
|
-
compile_cache_json: true
|
|
57
|
+
compile_cache_json: (compile_cache_json_unset = true)
|
|
58
58
|
)
|
|
59
|
+
unless compile_cache_json_unset
|
|
60
|
+
warn("Bootsnap.setup `compile_cache_json` argument is deprecated and has no effect")
|
|
61
|
+
end
|
|
62
|
+
|
|
59
63
|
if load_path_cache
|
|
60
64
|
Bootsnap::LoadPathCache.setup(
|
|
61
65
|
cache_path: "#{cache_dir}/bootsnap/load-path-cache",
|
|
@@ -69,7 +73,6 @@ module Bootsnap
|
|
|
69
73
|
cache_dir: "#{cache_dir}/bootsnap/compile-cache",
|
|
70
74
|
iseq: compile_cache_iseq,
|
|
71
75
|
yaml: compile_cache_yaml,
|
|
72
|
-
json: compile_cache_json,
|
|
73
76
|
readonly: readonly,
|
|
74
77
|
revalidation: revalidation,
|
|
75
78
|
)
|
|
@@ -115,7 +118,6 @@ module Bootsnap
|
|
|
115
118
|
load_path_cache: enabled?("BOOTSNAP_LOAD_PATH_CACHE"),
|
|
116
119
|
compile_cache_iseq: enabled?("BOOTSNAP_COMPILE_CACHE"),
|
|
117
120
|
compile_cache_yaml: enabled?("BOOTSNAP_COMPILE_CACHE"),
|
|
118
|
-
compile_cache_json: enabled?("BOOTSNAP_COMPILE_CACHE"),
|
|
119
121
|
readonly: bool_env("BOOTSNAP_READONLY"),
|
|
120
122
|
revalidation: bool_env("BOOTSNAP_REVALIDATE"),
|
|
121
123
|
ignore_directories: ignore_directories,
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bootsnap
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.19.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Burke Libbey
|
|
@@ -45,7 +45,6 @@ files:
|
|
|
45
45
|
- lib/bootsnap/cli/worker_pool.rb
|
|
46
46
|
- lib/bootsnap/compile_cache.rb
|
|
47
47
|
- lib/bootsnap/compile_cache/iseq.rb
|
|
48
|
-
- lib/bootsnap/compile_cache/json.rb
|
|
49
48
|
- lib/bootsnap/compile_cache/yaml.rb
|
|
50
49
|
- lib/bootsnap/explicit_require.rb
|
|
51
50
|
- lib/bootsnap/load_path_cache.rb
|
|
@@ -59,13 +58,13 @@ files:
|
|
|
59
58
|
- lib/bootsnap/load_path_cache/store.rb
|
|
60
59
|
- lib/bootsnap/setup.rb
|
|
61
60
|
- lib/bootsnap/version.rb
|
|
62
|
-
homepage: https://github.com/
|
|
61
|
+
homepage: https://github.com/rails/bootsnap
|
|
63
62
|
licenses:
|
|
64
63
|
- MIT
|
|
65
64
|
metadata:
|
|
66
|
-
bug_tracker_uri: https://github.com/
|
|
67
|
-
changelog_uri: https://github.com/
|
|
68
|
-
source_code_uri: https://github.com/
|
|
65
|
+
bug_tracker_uri: https://github.com/rails/bootsnap/issues
|
|
66
|
+
changelog_uri: https://github.com/rails/bootsnap/blob/main/CHANGELOG.md
|
|
67
|
+
source_code_uri: https://github.com/rails/bootsnap
|
|
69
68
|
allowed_push_host: https://rubygems.org
|
|
70
69
|
rdoc_options: []
|
|
71
70
|
require_paths:
|
|
@@ -81,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
81
80
|
- !ruby/object:Gem::Version
|
|
82
81
|
version: '0'
|
|
83
82
|
requirements: []
|
|
84
|
-
rubygems_version: 3.6.
|
|
83
|
+
rubygems_version: 3.6.9
|
|
85
84
|
specification_version: 4
|
|
86
85
|
summary: Boot large ruby/rails apps faster
|
|
87
86
|
test_files: []
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "bootsnap/bootsnap"
|
|
4
|
-
|
|
5
|
-
module Bootsnap
|
|
6
|
-
module CompileCache
|
|
7
|
-
module JSON
|
|
8
|
-
class << self
|
|
9
|
-
attr_accessor(:msgpack_factory, :supported_options)
|
|
10
|
-
attr_reader(:cache_dir)
|
|
11
|
-
|
|
12
|
-
def cache_dir=(cache_dir)
|
|
13
|
-
@cache_dir = cache_dir.end_with?("/") ? "#{cache_dir}json" : "#{cache_dir}-json"
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def input_to_storage(payload, _)
|
|
17
|
-
obj = ::JSON.parse(payload)
|
|
18
|
-
msgpack_factory.dump(obj)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def storage_to_output(data, kwargs)
|
|
22
|
-
if kwargs&.key?(:symbolize_names)
|
|
23
|
-
kwargs[:symbolize_keys] = kwargs.delete(:symbolize_names)
|
|
24
|
-
end
|
|
25
|
-
msgpack_factory.load(data, kwargs)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def input_to_output(data, kwargs)
|
|
29
|
-
::JSON.parse(data, **(kwargs || {}))
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def precompile(path)
|
|
33
|
-
Bootsnap::CompileCache::Native.precompile(
|
|
34
|
-
cache_dir,
|
|
35
|
-
path.to_s,
|
|
36
|
-
self,
|
|
37
|
-
)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def install!(cache_dir)
|
|
41
|
-
self.cache_dir = cache_dir
|
|
42
|
-
init!
|
|
43
|
-
if ::JSON.respond_to?(:load_file)
|
|
44
|
-
::JSON.singleton_class.prepend(Patch)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def init!
|
|
49
|
-
require "json"
|
|
50
|
-
require "msgpack"
|
|
51
|
-
|
|
52
|
-
self.msgpack_factory = MessagePack::Factory.new
|
|
53
|
-
self.supported_options = [:symbolize_names]
|
|
54
|
-
if supports_freeze?
|
|
55
|
-
self.supported_options = [:freeze]
|
|
56
|
-
end
|
|
57
|
-
supported_options.freeze
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
private
|
|
61
|
-
|
|
62
|
-
def supports_freeze?
|
|
63
|
-
::JSON.parse('["foo"]', freeze: true).first.frozen? &&
|
|
64
|
-
MessagePack.load(MessagePack.dump("foo"), freeze: true).frozen?
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
module Patch
|
|
69
|
-
def load_file(path, *args)
|
|
70
|
-
return super if args.size > 1
|
|
71
|
-
|
|
72
|
-
if (kwargs = args.first)
|
|
73
|
-
return super unless kwargs.is_a?(Hash)
|
|
74
|
-
return super unless (kwargs.keys - ::Bootsnap::CompileCache::JSON.supported_options).empty?
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
::Bootsnap::CompileCache::Native.fetch(
|
|
78
|
-
Bootsnap::CompileCache::JSON.cache_dir,
|
|
79
|
-
File.realpath(path),
|
|
80
|
-
::Bootsnap::CompileCache::JSON,
|
|
81
|
-
kwargs,
|
|
82
|
-
)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
ruby2_keywords :load_file if respond_to?(:ruby2_keywords, true)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|