diff --git a/.rubocop.yml b/.rubocop.yml index d0308d3d..80723522 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,13 +1,8 @@ -inherit_from: .rubocop_todo.yml - -inherit_gem: - rubocop-shopify: rubocop.yml - AllCops: Exclude: - 'vendor/**/*' - 'tmp/**/*' - TargetRubyVersion: 2.5 + TargetRubyVersion: 2.3 # This doesn't take into account retrying from an exception Lint/SuppressedException: @@ -17,6 +12,149 @@ Lint/SuppressedException: Style/EmptyLiteral: Enabled: false +Style/EmptyMethod: + Enabled: false + # allow the use of globals which makes sense in a CLI app like this Style/GlobalVars: Enabled: false + +Style/PercentLiteralDelimiters: + Enabled: false + +Style/TrailingCommaInHashLiteral: + EnforcedStyleForMultiline: comma + +Style/TrailingCommaInArguments: + EnforcedStyleForMultiline: comma + +Layout/LineLength: + Max: 120 + +Style/TrailingCommaInArguments: + EnforcedStyleForMultiline: comma + +Metrics/AbcSize: + Enabled: false + +Metrics/MethodLength: + Enabled: false + +Metrics/BlockLength: + Enabled: false + +Metrics/ClassLength: + Enabled: false + +Metrics/CyclomaticComplexity: + Enabled: false + +Metrics/ModuleLength: + Enabled: false + +Metrics/ParameterLists: + Enabled: false + +Metrics/PerceivedComplexity: + Enabled: false + +Naming/MethodName: + Exclude: + - 'test/**/*' + +Layout/SpaceInsideHashLiteralBraces: + EnforcedStyle: no_space + +Naming/RescuedExceptionsVariableName: + PreferredName: error + +Bundler/OrderedGems: + Enabled: false + +Gemspec/OrderedDependencies: + Enabled: false + +Gemspec/DuplicatedAssignment: + Enabled: false + +Layout/MultilineMethodCallIndentation: + EnforcedStyle: indented + +Style/SymbolArray: + Enabled: false + +Style/StderrPuts: + Enabled: false + +Style/ModuleFunction: + Enabled: false + +Style/IfUnlessModifier: + Enabled: false + +Style/GuardClause: + Enabled: false + +Layout/EndAlignment: + EnforcedStyleAlignWith: start_of_line + +Layout/RescueEnsureAlignment: + Enabled: false + +Layout/FirstHashElementIndentation: + EnforcedStyle: consistent + +Style/NumericPredicate: + Enabled: false + +Layout/SpaceInsideHashLiteralBraces: + EnforcedStyle: no_space + +Lint/AssignmentInCondition: + AllowSafeAssignment: true + +Lint/UnusedMethodArgument: + AllowUnusedKeywordArguments: true + +Security/MarshalLoad: + Enabled: false + +Security/YAMLLoad: + Enabled: false + +Style/Alias: + EnforcedStyle: prefer_alias_method + +Style/Documentation: + Enabled: false + +Style/DoubleNegation: + Enabled: false + +Style/CommentedKeyword: + Enabled: false + +Naming/VariableNumber: + Enabled: false + +Style/Next: + Enabled: false + +Style/StringLiterals: + EnforcedStyle: double_quotes + + +Lint/RaiseException: + Enabled: true + +Lint/StructNewOverride: + Enabled: true + +Style/HashEachMethods: + Enabled: true + +Style/HashTransformKeys: + Enabled: true + +Style/HashTransformValues: + Enabled: true diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml deleted file mode 100644 index cd89770e..00000000 --- a/.rubocop_todo.yml +++ /dev/null @@ -1,213 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2022-01-12 21:26:07 UTC using RuboCop version 1.24.1. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 1 -# Configuration parameters: Include. -# Include: **/*.gemspec -Gemspec/DuplicatedAssignment: - Exclude: - - 'bootsnap.gemspec' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include. -# Include: **/*.gemspec -Gemspec/OrderedDependencies: - Exclude: - - 'bootsnap.gemspec' - -# Offense count: 37 -# Cop supports --auto-correct. -Layout/EmptyLineAfterMagicComment: - Enabled: false - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/EmptyLines: - Exclude: - - 'lib/bootsnap.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment. -Layout/ExtraSpacing: - Exclude: - - 'lib/bootsnap/cli.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, IndentationWidth. -# SupportedStyles: aligned, indented -Layout/LineEndStringConcatenationIndentation: - Exclude: - - 'lib/bootsnap/compile_cache.rb' - - 'test/load_path_cache/realpath_cache_test.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, IndentationWidth. -# SupportedStyles: aligned, indented -Layout/MultilineOperationIndentation: - Exclude: - - 'lib/bootsnap/compile_cache.rb' - - 'lib/bootsnap/load_path_cache.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/RescueEnsureAlignment: - Exclude: - - 'lib/bootsnap/load_path_cache/path.rb' - -# Offense count: 12 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces. -# SupportedStyles: space, no_space, compact -# SupportedStylesForEmptyBraces: space, no_space -Layout/SpaceInsideHashLiteralBraces: - Exclude: - - 'test/compile_cache/json_test.rb' - - 'test/compile_cache/yaml_test.rb' - -# Offense count: 5 -# Configuration parameters: AllowSafeAssignment. -Lint/AssignmentInCondition: - Exclude: - - 'lib/bootsnap/cli.rb' - - 'lib/bootsnap/compile_cache/json.rb' - - 'lib/bootsnap/compile_cache/yaml.rb' - - 'lib/bootsnap/load_path_cache/loaded_features_index.rb' - -# Offense count: 5 -# Configuration parameters: IgnoredPatterns. -# SupportedStyles: snake_case, camelCase -Naming/MethodName: - EnforcedStyle: snake_case - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions. -# SupportedStyles: assign_to_condition, assign_inside_condition -Style/ConditionalAssignment: - Exclude: - - 'lib/bootsnap.rb' - -# Offense count: 36 -# Cop supports --auto-correct. -# Configuration parameters: IgnoreMacros, IgnoredMethods, IgnoredPatterns, IncludedMacros, AllowParenthesesInMultilineCall, AllowParenthesesInChaining, AllowParenthesesInCamelCaseMethod, AllowParenthesesInStringInterpolation, EnforcedStyle. -# SupportedStyles: require_parentheses, omit_parentheses -Style/MethodCallWithArgsParentheses: - Exclude: - - 'lib/bootsnap.rb' - - 'lib/bootsnap/cli.rb' - - 'test/cli_test.rb' - - 'test/compile_cache/json_test.rb' - - 'test/compile_cache/yaml_test.rb' - - 'test/compile_cache_test.rb' - - 'test/load_path_cache/cache_test.rb' - - 'test/load_path_cache/core_ext/kernel_require_test.rb' - - 'test/load_path_cache/store_test.rb' - - 'test/worker_pool_test.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: AllowedMethods. -# AllowedMethods: be, be_a, be_an, be_between, be_falsey, be_kind_of, be_instance_of, be_truthy, be_within, eq, eql, end_with, include, match, raise_error, respond_to, start_with -Style/NestedParenthesizedCalls: - Exclude: - - 'test/load_path_cache/core_ext/kernel_require_test.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, MinBodyLength. -# SupportedStyles: skip_modifier_ifs, always -Style/Next: - Exclude: - - 'lib/bootsnap/cli.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Style/RedundantBegin: - Exclude: - - 'lib/bootsnap/load_path_cache/path.rb' - - 'lib/bootsnap/load_path_cache/store.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/RedundantFreeze: - Exclude: - - 'lib/bootsnap/load_path_cache/store.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/RedundantParentheses: - Exclude: - - 'lib/bootsnap/load_path_cache/cache.rb' - -# Offense count: 7 -# Cop supports --auto-correct. -Style/RedundantSelf: - Exclude: - - 'lib/bootsnap/cli.rb' - - 'lib/bootsnap/compile_cache/json.rb' - - 'lib/bootsnap/compile_cache/yaml.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods. -# AllowedMethods: present?, blank?, presence, try, try! -Style/SafeNavigation: - Exclude: - - 'lib/bootsnap/compile_cache/json.rb' - - 'lib/bootsnap/compile_cache/yaml.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: RequireEnglish, EnforcedStyle. -# SupportedStyles: use_perl_names, use_english_names -Style/SpecialGlobalVars: - Exclude: - - 'test/worker_pool_test.rb' - -# Offense count: 593 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiterals: - Enabled: false - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiteralsInInterpolation: - Exclude: - - 'test/load_path_cache/path_test.rb' - - 'test/load_path_cache/realpath_cache_test.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: . -# SupportedStyles: percent, brackets -Style/SymbolArray: - EnforcedStyle: percent - MinSize: 3 - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, no_comma -Style/TrailingCommaInHashLiteral: - Exclude: - - 'bootsnap.gemspec' - -# Offense count: 15 -# Cop supports --auto-correct. -# Configuration parameters: MinSize, WordRegex. -# SupportedStyles: percent, brackets -Style/WordArray: - EnforcedStyle: percent diff --git a/Gemfile b/Gemfile index 9ead070c..853ed674 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,6 @@ # frozen_string_literal: true -source 'https://rubygems.org' + +source "https://rubygems.org" # Specify your gem's dependencies in bootsnap.gemspec gemspec @@ -9,7 +10,7 @@ if ENV["PSYCH_4"] end group :development do - gem 'rubocop' - gem 'rubocop-shopify', require: false - gem 'byebug', platform: :ruby + gem "rubocop", "0.81.0" # Ruby 2.3 support + gem "rubocop-shopify", require: false + gem "byebug", platform: :ruby end diff --git a/Rakefile b/Rakefile index 24c7b79b..8b782644 100644 --- a/Rakefile +++ b/Rakefile @@ -1,12 +1,13 @@ # frozen_string_literal: true -require('rake/extensiontask') -require('bundler/gem_tasks') -gemspec = Gem::Specification.load('bootsnap.gemspec') +require("rake/extensiontask") +require("bundler/gem_tasks") + +gemspec = Gem::Specification.load("bootsnap.gemspec") Rake::ExtensionTask.new do |ext| - ext.name = 'bootsnap' - ext.ext_dir = 'ext/bootsnap' - ext.lib_dir = 'lib/bootsnap' + ext.name = "bootsnap" + ext.ext_dir = "ext/bootsnap" + ext.lib_dir = "lib/bootsnap" ext.gem_spec = gemspec end diff --git a/bootsnap.gemspec b/bootsnap.gemspec index 59011be7..0f63c903 100644 --- a/bootsnap.gemspec +++ b/bootsnap.gemspec @@ -1,8 +1,8 @@ -# coding: utf-8 # frozen_string_literal: true -lib = File.expand_path('../lib', __FILE__) + +lib = File.expand_path("lib", __dir__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require('bootsnap/version') +require("bootsnap/version") Gem::Specification.new do |spec| spec.name = "bootsnap" @@ -17,30 +17,30 @@ Gem::Specification.new do |spec| spec.homepage = "https://github.com/Shopify/bootsnap" spec.metadata = { - 'bug_tracker_uri' => 'https://github.com/Shopify/bootsnap/issues', - 'changelog_uri' => 'https://github.com/Shopify/bootsnap/blob/main/CHANGELOG.md', - 'source_code_uri' => 'https://github.com/Shopify/bootsnap', - 'allowed_push_host' => 'https://rubygems.org' + "bug_tracker_uri" => "https://github.com/Shopify/bootsnap/issues", + "changelog_uri" => "https://github.com/Shopify/bootsnap/blob/main/CHANGELOG.md", + "source_code_uri" => "https://github.com/Shopify/bootsnap", + "allowed_push_host" => "https://rubygems.org", } - spec.files = %x(git ls-files -z ext lib).split("\x0") + %w(CHANGELOG.md LICENSE.txt README.md) + spec.files = `git ls-files -z ext lib`.split("\x0") + %w(CHANGELOG.md LICENSE.txt README.md) spec.require_paths = %w(lib) - spec.bindir = 'exe' + spec.bindir = "exe" spec.executables = %w(bootsnap) - spec.required_ruby_version = '>= 2.3.0' + spec.required_ruby_version = ">= 2.3.0" if RUBY_PLATFORM =~ /java/ - spec.platform = 'java' + spec.platform = "java" else spec.platform = Gem::Platform::RUBY - spec.extensions = ['ext/bootsnap/extconf.rb'] + spec.extensions = ["ext/bootsnap/extconf.rb"] end spec.add_development_dependency("bundler") - spec.add_development_dependency('rake') - spec.add_development_dependency('rake-compiler') + spec.add_development_dependency("rake") + spec.add_development_dependency("rake-compiler") spec.add_development_dependency("minitest", "~> 5.0") spec.add_development_dependency("mocha", "~> 1.2") diff --git a/exe/bootsnap b/exe/bootsnap index 35f9db62..51fb5c7b 100755 --- a/exe/bootsnap +++ b/exe/bootsnap @@ -1,5 +1,5 @@ #!/usr/bin/env ruby # frozen_string_literal: true -require 'bootsnap/cli' +require "bootsnap/cli" exit Bootsnap::CLI.new(ARGV).run diff --git a/ext/bootsnap/extconf.rb b/ext/bootsnap/extconf.rb index 290d82e1..20dce590 100644 --- a/ext/bootsnap/extconf.rb +++ b/ext/bootsnap/extconf.rb @@ -1,22 +1,23 @@ # frozen_string_literal: true + require("mkmf") -if RUBY_ENGINE == 'ruby' - $CFLAGS << ' -O3 ' - $CFLAGS << ' -std=c99' +if RUBY_ENGINE == "ruby" + $CFLAGS << " -O3 " + $CFLAGS << " -std=c99" # ruby.h has some -Wpedantic fails in some cases # (e.g. https://github.com/Shopify/bootsnap/issues/15) - unless ['0', '', nil].include?(ENV['BOOTSNAP_PEDANTIC']) - $CFLAGS << ' -Wall' - $CFLAGS << ' -Werror' - $CFLAGS << ' -Wextra' - $CFLAGS << ' -Wpedantic' + unless ["0", "", nil].include?(ENV["BOOTSNAP_PEDANTIC"]) + $CFLAGS << " -Wall" + $CFLAGS << " -Werror" + $CFLAGS << " -Wextra" + $CFLAGS << " -Wpedantic" - $CFLAGS << ' -Wno-unused-parameter' # VALUE self has to be there but we don't care what it is. - $CFLAGS << ' -Wno-keyword-macro' # hiding return - $CFLAGS << ' -Wno-gcc-compat' # ruby.h 2.6.0 on macos 10.14, dunno - $CFLAGS << ' -Wno-compound-token-split-by-macro' + $CFLAGS << " -Wno-unused-parameter" # VALUE self has to be there but we don't care what it is. + $CFLAGS << " -Wno-keyword-macro" # hiding return + $CFLAGS << " -Wno-gcc-compat" # ruby.h 2.6.0 on macos 10.14, dunno + $CFLAGS << " -Wno-compound-token-split-by-macro" end create_makefile("bootsnap/bootsnap") diff --git a/lib/bootsnap.rb b/lib/bootsnap.rb index 842973d9..7e263eb8 100644 --- a/lib/bootsnap.rb +++ b/lib/bootsnap.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -require_relative('bootsnap/version') -require_relative('bootsnap/bundler') -require_relative('bootsnap/load_path_cache') -require_relative('bootsnap/compile_cache') +require_relative("bootsnap/version") +require_relative("bootsnap/bundler") +require_relative("bootsnap/load_path_cache") +require_relative("bootsnap/compile_cache") module Bootsnap InvalidConfiguration = Class.new(StandardError) @@ -18,10 +18,10 @@ def self.log! def self.logger=(logger) @logger = logger - if logger.respond_to?(:debug) - self.instrumentation = ->(event, path) { @logger.debug("[Bootsnap] #{event} #{path}") } + self.instrumentation = if logger.respond_to?(:debug) + ->(event, path) { @logger.debug("[Bootsnap] #{event} #{path}") } else - self.instrumentation = ->(event, path) { @logger.call("[Bootsnap] #{event} #{path}") } + ->(event, path) { @logger.call("[Bootsnap] #{event} #{path}") } end end @@ -62,13 +62,15 @@ def self.setup( "to turn `compile_cache_iseq` off on Ruby 2.5" end - Bootsnap::LoadPathCache.setup( - cache_path: cache_dir + '/bootsnap/load-path-cache', - development_mode: development_mode, - ) if load_path_cache + if load_path_cache + Bootsnap::LoadPathCache.setup( + cache_path: cache_dir + "/bootsnap/load-path-cache", + development_mode: development_mode, + ) + end Bootsnap::CompileCache.setup( - cache_dir: cache_dir + '/bootsnap/compile-cache', + cache_dir: cache_dir + "/bootsnap/compile-cache", iseq: compile_cache_iseq, yaml: compile_cache_yaml, json: compile_cache_json, @@ -79,18 +81,18 @@ def self.iseq_cache_supported? return @iseq_cache_supported if defined? @iseq_cache_supported ruby_version = Gem::Version.new(RUBY_VERSION) - @iseq_cache_supported = ruby_version < Gem::Version.new('2.5.0') || ruby_version >= Gem::Version.new('2.6.0') + @iseq_cache_supported = ruby_version < Gem::Version.new("2.5.0") || ruby_version >= Gem::Version.new("2.6.0") end def self.default_setup - env = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || ENV['ENV'] - development_mode = ['', nil, 'development'].include?(env) + env = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || ENV["ENV"] + development_mode = ["", nil, "development"].include?(env) - unless ENV['DISABLE_BOOTSNAP'] - cache_dir = ENV['BOOTSNAP_CACHE_DIR'] + unless ENV["DISABLE_BOOTSNAP"] + cache_dir = ENV["BOOTSNAP_CACHE_DIR"] unless cache_dir config_dir_frame = caller.detect do |line| - line.include?('/config/') + line.include?("/config/") end unless config_dir_frame @@ -102,35 +104,34 @@ def self.default_setup end path = config_dir_frame.split(/:\d+:/).first - path = File.dirname(path) until File.basename(path) == 'config' + path = File.dirname(path) until File.basename(path) == "config" app_root = File.dirname(path) - cache_dir = File.join(app_root, 'tmp', 'cache') + cache_dir = File.join(app_root, "tmp", "cache") end - setup( - cache_dir: cache_dir, - development_mode: development_mode, - load_path_cache: !ENV['DISABLE_BOOTSNAP_LOAD_PATH_CACHE'], - compile_cache_iseq: !ENV['DISABLE_BOOTSNAP_COMPILE_CACHE'] && iseq_cache_supported?, - compile_cache_yaml: !ENV['DISABLE_BOOTSNAP_COMPILE_CACHE'], - compile_cache_json: !ENV['DISABLE_BOOTSNAP_COMPILE_CACHE'], + cache_dir: cache_dir, + development_mode: development_mode, + load_path_cache: !ENV["DISABLE_BOOTSNAP_LOAD_PATH_CACHE"], + compile_cache_iseq: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"] && iseq_cache_supported?, + compile_cache_yaml: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"], + compile_cache_json: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"], ) - if ENV['BOOTSNAP_LOG'] + if ENV["BOOTSNAP_LOG"] log! end end end - if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/ + if RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/ def self.absolute_path?(path) - path[1] == ':' + path[1] == ":" end else def self.absolute_path?(path) - path.start_with?('/') + path.start_with?("/") end end end diff --git a/lib/bootsnap/bundler.rb b/lib/bootsnap/bundler.rb index a646efb5..0165e569 100644 --- a/lib/bootsnap/bundler.rb +++ b/lib/bootsnap/bundler.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module Bootsnap extend(self) diff --git a/lib/bootsnap/cli.rb b/lib/bootsnap/cli.rb index c171ec58..11a886d7 100644 --- a/lib/bootsnap/cli.rb +++ b/lib/bootsnap/cli.rb @@ -1,10 +1,10 @@ # frozen_string_literal: true -require 'bootsnap' -require 'bootsnap/cli/worker_pool' -require 'optparse' -require 'fileutils' -require 'etc' +require "bootsnap" +require "bootsnap/cli/worker_pool" +require "optparse" +require "fileutils" +require "etc" module Bootsnap class CLI @@ -25,7 +25,7 @@ def match?(string) def initialize(argv) @argv = argv - self.cache_dir = ENV.fetch('BOOTSNAP_CACHE_DIR', 'tmp/cache') + self.cache_dir = ENV.fetch("BOOTSNAP_CACHE_DIR", "tmp/cache") self.compile_gemfile = false self.exclude = nil self.verbose = false @@ -36,16 +36,16 @@ def initialize(argv) end def precompile_command(*sources) - require 'bootsnap/compile_cache/iseq' - require 'bootsnap/compile_cache/yaml' - require 'bootsnap/compile_cache/json' + require "bootsnap/compile_cache/iseq" + require "bootsnap/compile_cache/yaml" + require "bootsnap/compile_cache/json" fix_default_encoding do - Bootsnap::CompileCache::ISeq.cache_dir = self.cache_dir + Bootsnap::CompileCache::ISeq.cache_dir = cache_dir Bootsnap::CompileCache::YAML.init! - Bootsnap::CompileCache::YAML.cache_dir = self.cache_dir + Bootsnap::CompileCache::YAML.cache_dir = cache_dir Bootsnap::CompileCache::JSON.init! - Bootsnap::CompileCache::JSON.cache_dir = self.cache_dir + Bootsnap::CompileCache::JSON.cache_dir = cache_dir @work_pool = WorkerPool.create(size: jobs, jobs: { ruby: method(:precompile_ruby), @@ -61,7 +61,7 @@ def precompile_command(*sources) if compile_gemfile # Some gems embed their tests, they're very unlikely to be loaded, so not worth precompiling. - gem_exclude = Regexp.union([exclude, '/spec/', '/test/'].compact) + gem_exclude = Regexp.union([exclude, "/spec/", "/test/"].compact) precompile_ruby_files($LOAD_PATH.map { |d| File.expand_path(d) }, exclude: gem_exclude) # Gems that include JSON or YAML files usually don't put them in `lib/`. @@ -72,7 +72,7 @@ def precompile_command(*sources) precompile_json_files(gem_paths, exclude: gem_exclude) end - if exitstatus = @work_pool.shutdown + if (exitstatus = @work_pool.shutdown) exit(exitstatus) end end @@ -89,7 +89,7 @@ def precompile_command(*sources) if dir_sort def list_files(path, pattern) if File.directory?(path) - Dir[File.join(path, pattern), sort: false] + Dir[File.join(path, pattern), sort: false] elsif File.exist?(path) [path] else @@ -99,7 +99,7 @@ def list_files(path, pattern) else def list_files(path, pattern) if File.directory?(path) - Dir[File.join(path, pattern)] + Dir[File.join(path, pattern)] elsif File.exist?(path) [path] else @@ -126,9 +126,9 @@ def precompile_yaml_files(load_paths, exclude: self.exclude) load_paths.each do |path| if !exclude || !exclude.match?(path) - list_files(path, '**/*.{yml,yaml}').each do |yaml_file| + list_files(path, "**/*.{yml,yaml}").each do |yaml_file| # We ignore hidden files to not match the various .ci.yml files - if !File.basename(yaml_file).start_with?('.') && (!exclude || !exclude.match?(yaml_file)) + if !File.basename(yaml_file).start_with?(".") && (!exclude || !exclude.match?(yaml_file)) @work_pool.push(:yaml, yaml_file) end end @@ -149,9 +149,9 @@ def precompile_json_files(load_paths, exclude: self.exclude) load_paths.each do |path| if !exclude || !exclude.match?(path) - list_files(path, '**/*.json').each do |json_file| + list_files(path, "**/*.json").each do |json_file| # We ignore hidden files to not match the various .config.json files - if !File.basename(json_file).start_with?('.') && (!exclude || !exclude.match?(json_file)) + if !File.basename(json_file).start_with?(".") && (!exclude || !exclude.match?(json_file)) @work_pool.push(:json, json_file) end end @@ -172,7 +172,7 @@ def precompile_ruby_files(load_paths, exclude: self.exclude) load_paths.each do |path| if !exclude || !exclude.match?(path) - list_files(path, '**/*.rb').each do |ruby_file| + list_files(path, "**/*.rb").each do |ruby_file| if !exclude || !exclude.match?(ruby_file) @work_pool.push(:ruby, ruby_file) end @@ -210,7 +210,7 @@ def invalid_usage!(message) end def cache_dir=(dir) - @cache_dir = File.expand_path(File.join(dir, 'bootsnap/compile-cache')) + @cache_dir = File.expand_path(File.join(dir, "bootsnap/compile-cache")) end def exclude_pattern(pattern) @@ -225,24 +225,24 @@ def parser opts.separator "GLOBAL OPTIONS" opts.separator "" - help = <<~EOS + help = <<~HELP Path to the bootsnap cache directory. Defaults to tmp/cache - EOS - opts.on('--cache-dir DIR', help.strip) do |dir| + HELP + opts.on("--cache-dir DIR", help.strip) do |dir| self.cache_dir = dir end - help = <<~EOS + help = <<~HELP Print precompiled paths. - EOS - opts.on('--verbose', '-v', help.strip) do + HELP + opts.on("--verbose", "-v", help.strip) do self.verbose = true end - help = <<~EOS + help = <<~HELP Number of workers to use. Default to number of processors, set to 0 to disable multi-processing. - EOS - opts.on('--jobs JOBS', '-j', help.strip) do |jobs| + HELP + opts.on("--jobs JOBS", "-j", help.strip) do |jobs| self.jobs = Integer(jobs) end @@ -251,30 +251,30 @@ def parser opts.separator "" opts.separator " precompile [DIRECTORIES...]: Precompile all .rb files in the passed directories" - help = <<~EOS + help = <<~HELP Precompile the gems in Gemfile - EOS - opts.on('--gemfile', help) { self.compile_gemfile = true } + HELP + opts.on("--gemfile", help) { self.compile_gemfile = true } - help = <<~EOS + help = <<~HELP Path pattern to not precompile. e.g. --exclude 'aws-sdk|google-api' - EOS - opts.on('--exclude PATTERN', help) { |pattern| exclude_pattern(pattern) } + HELP + opts.on("--exclude PATTERN", help) { |pattern| exclude_pattern(pattern) } - help = <<~EOS + help = <<~HELP Disable ISeq (.rb) precompilation. - EOS - opts.on('--no-iseq', help) { self.iseq = false } + HELP + opts.on("--no-iseq", help) { self.iseq = false } - help = <<~EOS + help = <<~HELP Disable YAML precompilation. - EOS - opts.on('--no-yaml', help) { self.yaml = false } + HELP + opts.on("--no-yaml", help) { self.yaml = false } - help = <<~EOS + help = <<~HELP Disable JSON precompilation. - EOS - opts.on('--no-json', help) { self.json = false } + HELP + opts.on("--no-json", help) { self.json = false } end end end diff --git a/lib/bootsnap/cli/worker_pool.rb b/lib/bootsnap/cli/worker_pool.rb index 3e1f5ea5..a4d40bad 100644 --- a/lib/bootsnap/cli/worker_pool.rb +++ b/lib/bootsnap/cli/worker_pool.rb @@ -63,6 +63,7 @@ def work_loop loop do job, *args = Marshal.load(@pipe_out) return if job == :exit + @jobs.fetch(job).call(*args) end rescue IOError diff --git a/lib/bootsnap/compile_cache.rb b/lib/bootsnap/compile_cache.rb index e3b8842d..1b407e67 100644 --- a/lib/bootsnap/compile_cache.rb +++ b/lib/bootsnap/compile_cache.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module Bootsnap module CompileCache Error = Class.new(StandardError) @@ -7,7 +8,7 @@ module CompileCache def self.setup(cache_dir:, iseq:, yaml:, json:) if iseq if supported? - require_relative('compile_cache/iseq') + require_relative("compile_cache/iseq") Bootsnap::CompileCache::ISeq.install!(cache_dir) elsif $VERBOSE warn("[bootsnap/setup] bytecode caching is not supported on this implementation of Ruby") @@ -16,7 +17,7 @@ def self.setup(cache_dir:, iseq:, yaml:, json:) if yaml if supported? - require_relative('compile_cache/yaml') + require_relative("compile_cache/yaml") Bootsnap::CompileCache::YAML.install!(cache_dir) elsif $VERBOSE warn("[bootsnap/setup] YAML parsing caching is not supported on this implementation of Ruby") @@ -25,7 +26,7 @@ def self.setup(cache_dir:, iseq:, yaml:, json:) if json if supported? - require_relative('compile_cache/json') + require_relative("compile_cache/json") Bootsnap::CompileCache::JSON.install!(cache_dir) elsif $VERBOSE warn("[bootsnap/setup] JSON parsing caching is not supported on this implementation of Ruby") @@ -44,9 +45,9 @@ def self.permission_error(path) def self.supported? # only enable on 'ruby' (MRI), POSIX (darwin, linux, *bsd), Windows (RubyInstaller2) and >= 2.3.0 - RUBY_ENGINE == 'ruby' && - RUBY_PLATFORM =~ /darwin|linux|bsd|mswin|mingw|cygwin/ && - Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.3.0") + RUBY_ENGINE == "ruby" && + RUBY_PLATFORM =~ /darwin|linux|bsd|mswin|mingw|cygwin/ && + Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.3.0") end end end diff --git a/lib/bootsnap/compile_cache/iseq.rb b/lib/bootsnap/compile_cache/iseq.rb index e4681beb..e926eb4f 100644 --- a/lib/bootsnap/compile_cache/iseq.rb +++ b/lib/bootsnap/compile_cache/iseq.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true -require('bootsnap/bootsnap') -require('zlib') + +require("bootsnap/bootsnap") +require("zlib") module Bootsnap module CompileCache @@ -23,27 +24,27 @@ def self.input_to_storage(_, path) iseq = begin RubyVM::InstructionSequence.compile_file(path) rescue SyntaxError - raise(Uncompilable, 'syntax error') + raise(Uncompilable, "syntax error") end begin iseq.to_binary rescue TypeError - raise(Uncompilable, 'ruby bug #18250') + raise(Uncompilable, "ruby bug #18250") end end else def self.input_to_storage(_, path) RubyVM::InstructionSequence.compile_file(path).to_binary rescue SyntaxError - raise(Uncompilable, 'syntax error') + raise(Uncompilable, "syntax error") end end def self.storage_to_output(binary, _args) RubyVM::InstructionSequence.load_from_binary(binary) - rescue RuntimeError => e - if e.message == 'broken binary format' + rescue RuntimeError => error + if error.message == "broken binary format" STDERR.puts("[Bootsnap::CompileCache] warning: rejecting broken binary") nil else @@ -80,8 +81,8 @@ def load_iseq(path) Bootsnap::CompileCache::ISeq.fetch(path.to_s) rescue Errno::EACCES Bootsnap::CompileCache.permission_error(path) - rescue RuntimeError => e - if e.message =~ /unmatched platform/ + rescue RuntimeError => error + if error.message =~ /unmatched platform/ puts("unmatched platform for file #{path}") end raise diff --git a/lib/bootsnap/compile_cache/json.rb b/lib/bootsnap/compile_cache/json.rb index ba527542..36d0c6be 100644 --- a/lib/bootsnap/compile_cache/json.rb +++ b/lib/bootsnap/compile_cache/json.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('bootsnap/bootsnap') + +require("bootsnap/bootsnap") module Bootsnap module CompileCache @@ -13,7 +14,7 @@ def input_to_storage(payload, _) end def storage_to_output(data, kwargs) - if kwargs && kwargs.key?(:symbolize_names) + if kwargs&.key?(:symbolize_names) kwargs[:symbolize_keys] = kwargs.delete(:symbolize_names) end msgpack_factory.load(data, kwargs) @@ -40,22 +41,23 @@ def install!(cache_dir) end def init! - require('json') - require('msgpack') + require("json") + require("msgpack") self.msgpack_factory = MessagePack::Factory.new self.supported_options = [:symbolize_names] if ::JSON.parse('["foo"]', freeze: true).first.frozen? self.supported_options = [:freeze] end - self.supported_options.freeze + supported_options.freeze end end module Patch def load_file(path, *args) return super if args.size > 1 - if kwargs = args.first + + if (kwargs = args.first) return super unless kwargs.is_a?(Hash) return super unless (kwargs.keys - ::Bootsnap::CompileCache::JSON.supported_options).empty? end diff --git a/lib/bootsnap/compile_cache/yaml.rb b/lib/bootsnap/compile_cache/yaml.rb index 14743853..1088e924 100644 --- a/lib/bootsnap/compile_cache/yaml.rb +++ b/lib/bootsnap/compile_cache/yaml.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('bootsnap/bootsnap') + +require("bootsnap/bootsnap") module Bootsnap module CompileCache @@ -16,7 +17,7 @@ def input_to_storage(contents, _) end def storage_to_output(data, kwargs) - if kwargs && kwargs.key?(:symbolize_names) + if kwargs&.key?(:symbolize_names) kwargs[:symbolize_keys] = kwargs.delete(:symbolize_names) end msgpack_factory.load(data, kwargs) @@ -33,6 +34,7 @@ def input_to_output(data, kwargs) def strict_load(payload, *args) ast = ::YAML.parse(payload) return ast unless ast + strict_visitor.create(*args).visit(ast) end ruby2_keywords :strict_load if respond_to?(:ruby2_keywords, true) @@ -52,14 +54,14 @@ def install!(cache_dir) end def init! - require('yaml') - require('msgpack') - require('date') + require("yaml") + require("msgpack") + require("date") if Patch.method_defined?(:unsafe_load_file) && !::YAML.respond_to?(:unsafe_load_file) Patch.send(:remove_method, :unsafe_load_file) end - if Patch.method_defined?(:load_file) && ::YAML::VERSION >= '4' + if Patch.method_defined?(:load_file) && ::YAML::VERSION >= "4" Patch.send(:remove_method, :load_file) end @@ -74,7 +76,7 @@ def init! MessagePack::Timestamp::TYPE, # or just -1 Time, packer: MessagePack::Time::Packer, - unpacker: MessagePack::Time::Unpacker + unpacker: MessagePack::Time::Unpacker, ) marshal_fallback = { @@ -94,14 +96,14 @@ def init! self.supported_options = [] params = ::YAML.method(:load).parameters if params.include?([:key, :symbolize_names]) - self.supported_options << :symbolize_names + supported_options << :symbolize_names end if params.include?([:key, :freeze]) - if factory.load(factory.dump('yaml'), freeze: true).frozen? - self.supported_options << :freeze + if factory.load(factory.dump("yaml"), freeze: true).frozen? + supported_options << :freeze end end - self.supported_options.freeze + supported_options.freeze end def strict_visitor @@ -110,6 +112,7 @@ def visit(target) if target.tag raise Uncompilable, "YAML tags are not supported: #{target.tag}" end + super end end @@ -119,7 +122,8 @@ def visit(target) module Patch def load_file(path, *args) return super if args.size > 1 - if kwargs = args.first + + if (kwargs = args.first) return super unless kwargs.is_a?(Hash) return super unless (kwargs.keys - ::Bootsnap::CompileCache::YAML.supported_options).empty? end @@ -140,7 +144,8 @@ def load_file(path, *args) def unsafe_load_file(path, *args) return super if args.size > 1 - if kwargs = args.first + + if (kwargs = args.first) return super unless kwargs.is_a?(Hash) return super unless (kwargs.keys - ::Bootsnap::CompileCache::YAML.supported_options).empty? end diff --git a/lib/bootsnap/explicit_require.rb b/lib/bootsnap/explicit_require.rb index bf937f10..29ce5a43 100644 --- a/lib/bootsnap/explicit_require.rb +++ b/lib/bootsnap/explicit_require.rb @@ -1,9 +1,10 @@ # frozen_string_literal: true + module Bootsnap module ExplicitRequire - ARCHDIR = RbConfig::CONFIG['archdir'] - RUBYLIBDIR = RbConfig::CONFIG['rubylibdir'] - DLEXT = RbConfig::CONFIG['DLEXT'] + ARCHDIR = RbConfig::CONFIG["archdir"] + RUBYLIBDIR = RbConfig::CONFIG["rubylibdir"] + DLEXT = RbConfig::CONFIG["DLEXT"] def self.from_self(feature) require_relative("../#{feature}") diff --git a/lib/bootsnap/load_path_cache.rb b/lib/bootsnap/load_path_cache.rb index 26021bda..2b57414b 100644 --- a/lib/bootsnap/load_path_cache.rb +++ b/lib/bootsnap/load_path_cache.rb @@ -5,9 +5,9 @@ module LoadPathCache ReturnFalse = Class.new(StandardError) FallbackScan = Class.new(StandardError) - DOT_RB = '.rb' - DOT_SO = '.so' - SLASH = '/' + DOT_RB = ".rb" + DOT_SO = ".so" + SLASH = "/" # If a NameError happens several levels deep, don't re-handle it # all the way up the chain: mark it once and bubble it up without @@ -15,7 +15,7 @@ module LoadPathCache ERROR_TAG_IVAR = :@__bootsnap_rescued DL_EXTENSIONS = ::RbConfig::CONFIG - .values_at('DLEXT', 'DLEXT2') + .values_at("DLEXT", "DLEXT2") .reject { |ext| !ext || ext.empty? } .map { |ext| ".#{ext}" } .freeze @@ -42,24 +42,24 @@ def setup(cache_path:, development_mode:) @realpath_cache = RealpathCache.new @load_path_cache = Cache.new(store, $LOAD_PATH, development_mode: development_mode) - require_relative('load_path_cache/core_ext/kernel_require') - require_relative('load_path_cache/core_ext/loaded_features') + require_relative("load_path_cache/core_ext/kernel_require") + require_relative("load_path_cache/core_ext/loaded_features") end def supported? - RUBY_ENGINE == 'ruby' && - RUBY_PLATFORM =~ /darwin|linux|bsd|mswin|mingw|cygwin/ + RUBY_ENGINE == "ruby" && + RUBY_PLATFORM =~ /darwin|linux|bsd|mswin|mingw|cygwin/ end end end end if Bootsnap::LoadPathCache.supported? - require_relative('load_path_cache/path_scanner') - require_relative('load_path_cache/path') - require_relative('load_path_cache/cache') - require_relative('load_path_cache/store') - require_relative('load_path_cache/change_observer') - require_relative('load_path_cache/loaded_features_index') - require_relative('load_path_cache/realpath_cache') + require_relative("load_path_cache/path_scanner") + require_relative("load_path_cache/path") + require_relative("load_path_cache/cache") + require_relative("load_path_cache/store") + require_relative("load_path_cache/change_observer") + require_relative("load_path_cache/loaded_features_index") + require_relative("load_path_cache/realpath_cache") end diff --git a/lib/bootsnap/load_path_cache/cache.rb b/lib/bootsnap/load_path_cache/cache.rb index 33ea1967..fe49514a 100644 --- a/lib/bootsnap/load_path_cache/cache.rb +++ b/lib/bootsnap/load_path_cache/cache.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require_relative('../explicit_require') +require_relative("../explicit_require") module Bootsnap module LoadPathCache @@ -28,15 +28,16 @@ def load_dir(dir) BUILTIN_FEATURES = $LOADED_FEATURES.each_with_object({}) do |feat, features| # Builtin features are of the form 'enumerator.so'. # All others include paths. - next unless feat.size < 20 && !feat.include?('/') + next unless feat.size < 20 && !feat.include?("/") - base = File.basename(feat, '.*') # enumerator.so -> enumerator + base = File.basename(feat, ".*") # enumerator.so -> enumerator ext = File.extname(feat) # .so features[feat] = nil # enumerator.so features[base] = nil # enumerator next unless [DOT_SO, *DL_EXTENSIONS].include?(ext) + DL_EXTENSIONS.each do |dl_ext| features["#{base}#{dl_ext}"] = nil # enumerator.bundle end @@ -50,7 +51,7 @@ def find(feature, try_extensions: true) return feature if Bootsnap.absolute_path?(feature) - if feature.start_with?('./', '../') + if feature.start_with?("./", "../") return try_extensions ? expand_path(feature) : File.expand_path(feature).freeze end @@ -64,7 +65,7 @@ def find(feature, try_extensions: true) # returns false as if it were already loaded; however, there is no # file to find on disk. We've pre-built a list of these, and we # return false if any of them is loaded. - raise(LoadPathCache::ReturnFalse, '', []) if BUILTIN_FEATURES.key?(feature) + raise(LoadPathCache::ReturnFalse, "", []) if BUILTIN_FEATURES.key?(feature) # The feature wasn't found on our preliminary search through the index. # We resolve this differently depending on what the extension was. @@ -73,13 +74,14 @@ def find(feature, try_extensions: true) # native dynamic extension, e.g. .bundle or .so), we know it was a # failure and there's nothing more we can do to find the file. # no extension, .rb, (.bundle or .so) - when '', *CACHED_EXTENSIONS + when "", *CACHED_EXTENSIONS nil # Ruby allows specifying native extensions as '.so' even when DLEXT # is '.bundle'. This is where we handle that case. when DOT_SO x = search_index(feature[0..-4] + DLEXT) return x if x + if DLEXT2 x = search_index(feature[0..-4] + DLEXT2) return x if x @@ -87,7 +89,7 @@ def find(feature, try_extensions: true) else # other, unknown extension. For example, `.rake`. Since we haven't # cached these, we legitimately need to run the load path search. - raise(LoadPathCache::FallbackScan, '', []) + raise(LoadPathCache::FallbackScan, "", []) end end @@ -95,16 +97,18 @@ def find(feature, try_extensions: true) # cases where the file doesn't appear to be on the load path. We should # be able to detect newly-created files without rebooting the # application. - raise(LoadPathCache::FallbackScan, '', []) if @development_mode + raise(LoadPathCache::FallbackScan, "", []) if @development_mode end def unshift_paths(sender, *paths) return unless sender == @path_obj + @mutex.synchronize { unshift_paths_locked(*paths) } end def push_paths(sender, *paths) return unless sender == @path_obj + @mutex.synchronize { push_paths_locked(*paths) } end @@ -137,6 +141,7 @@ def push_paths_locked(*paths) p = Path.new(path) @has_relative_paths = true if p.relative? next if p.non_directory? + expanded_path = p.expanded_path entries, dirs = p.entries_and_dirs(@store) # push -> low precedence -> set only if unset @@ -151,6 +156,7 @@ def unshift_paths_locked(*paths) paths.map(&:to_s).reverse_each do |path| p = Path.new(path) next if p.non_directory? + expanded_path = p.expanded_path entries, dirs = p.entries_and_dirs(@store) # unshift -> high precedence -> unconditional set @@ -173,56 +179,62 @@ def now end if DLEXT2 - def search_index(f, try_extensions: true) + def search_index(feature, try_extensions: true) if try_extensions - try_index(f + DOT_RB) || try_index(f + DLEXT) || try_index(f + DLEXT2) || try_index(f) + try_index(feature + DOT_RB) || + try_index(feature + DLEXT) || + try_index(feature + DLEXT2) || + try_index(feature) else - try_index(f) + try_index(feature) end end - def maybe_append_extension(f) - try_ext(f + DOT_RB) || try_ext(f + DLEXT) || try_ext(f + DLEXT2) || f + def maybe_append_extension(feature) + try_ext(feature + DOT_RB) || + try_ext(feature + DLEXT) || + try_ext(feature + DLEXT2) || + feature end else - def search_index(f, try_extensions: true) + def search_index(feature, try_extensions: true) if try_extensions - try_index(f + DOT_RB) || try_index(f + DLEXT) || try_index(f) + try_index(feature + DOT_RB) || try_index(feature + DLEXT) || try_index(feature) else - try_index(f) + try_index(feature) end end - def maybe_append_extension(f) - try_ext(f + DOT_RB) || try_ext(f + DLEXT) || f + def maybe_append_extension(feature) + try_ext(feature + DOT_RB) || try_ext(feature + DLEXT) || feature end end s = rand.to_s.force_encoding(Encoding::US_ASCII).freeze if s.respond_to?(:-@) - if (-s).equal?(s) && (-s.dup).equal?(s) || RUBY_VERSION >= '2.7' - def try_index(f) - if (p = @index[f]) - -(File.join(p, f).freeze) + if (-s).equal?(s) && (-s.dup).equal?(s) || RUBY_VERSION >= "2.7" + def try_index(feature) + if (path = @index[feature]) + -File.join(path, feature).freeze end end else - def try_index(f) - if (p = @index[f]) - -File.join(p, f).untaint + def try_index(feature) + if (path = @index[feature]) + -File.join(path, feature).untaint end end end else - def try_index(f) - if (p = @index[f]) - File.join(p, f) + def try_index(feature) + if (path = @index[feature]) + File.join(path, feature) end end end - def try_ext(f) - f if File.exist?(f) + def try_ext(feature) + feature if File.exist?(feature) end end end diff --git a/lib/bootsnap/load_path_cache/change_observer.rb b/lib/bootsnap/load_path_cache/change_observer.rb index 97fbba5e..9322566f 100644 --- a/lib/bootsnap/load_path_cache/change_observer.rb +++ b/lib/bootsnap/load_path_cache/change_observer.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module Bootsnap module LoadPathCache module ChangeObserver @@ -57,6 +58,7 @@ def uniq!(*args) def self.register(observer, arr) return if arr.frozen? # can't register observer, but no need to. + arr.instance_variable_set(:@lpc_observer, observer) arr.extend(ArrayMixin) end diff --git a/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb b/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb index dd4ff555..9e9130f5 100644 --- a/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb +++ b/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module Bootsnap module LoadPathCache module CoreExt @@ -13,7 +14,7 @@ def self.make_load_error(path) end module Kernel - module_function # rubocop:disable Style/ModuleFunction + module_function alias_method(:require_without_bootsnap, :require) @@ -32,9 +33,9 @@ def require(path) end raise(Bootsnap::LoadPathCache::CoreExt.make_load_error(path)) - rescue LoadError => e - e.instance_variable_set(Bootsnap::LoadPathCache::ERROR_TAG_IVAR, true) - raise(e) + rescue LoadError => error + error.instance_variable_set(Bootsnap::LoadPathCache::ERROR_TAG_IVAR, true) + raise(error) rescue Bootsnap::LoadPathCache::ReturnFalse false rescue Bootsnap::LoadPathCache::FallbackScan @@ -75,9 +76,9 @@ def autoload(const, path) # added to $LOADED_FEATURES and won't be able to hook that modification # since it's done in C-land. autoload_without_bootsnap(const, Bootsnap::LoadPathCache.load_path_cache.find(path) || path) - rescue LoadError => e - e.instance_variable_set(Bootsnap::LoadPathCache::ERROR_TAG_IVAR, true) - raise(e) + rescue LoadError => error + error.instance_variable_set(Bootsnap::LoadPathCache::ERROR_TAG_IVAR, true) + raise(error) rescue Bootsnap::LoadPathCache::ReturnFalse false rescue Bootsnap::LoadPathCache::FallbackScan diff --git a/lib/bootsnap/load_path_cache/core_ext/loaded_features.rb b/lib/bootsnap/load_path_cache/core_ext/loaded_features.rb index c7f62ac2..59556600 100644 --- a/lib/bootsnap/load_path_cache/core_ext/loaded_features.rb +++ b/lib/bootsnap/load_path_cache/core_ext/loaded_features.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + class << $LOADED_FEATURES alias_method(:delete_without_bootsnap, :delete) def delete(key) diff --git a/lib/bootsnap/load_path_cache/loaded_features_index.rb b/lib/bootsnap/load_path_cache/loaded_features_index.rb index 12cc0fb1..9e070f38 100644 --- a/lib/bootsnap/load_path_cache/loaded_features_index.rb +++ b/lib/bootsnap/load_path_cache/loaded_features_index.rb @@ -29,14 +29,15 @@ def initialize @mutex = Mutex.new # In theory the user could mutate $LOADED_FEATURES and invalidate our - # cache. If this ever comes up in practice — or if you, the - # enterprising reader, feels inclined to solve this problem — we could + # cache. If this ever comes up in practice - or if you, the + # enterprising reader, feels inclined to solve this problem - we could # parallel the work done with ChangeObserver on $LOAD_PATH to mirror # updates to our @lfi. $LOADED_FEATURES.each do |feat| hash = feat.hash $LOAD_PATH.each do |lpe| next unless feat.start_with?(lpe) + # /a/b/lib/my/foo.rb # ^^^^^^^^^ short = feat[(lpe.length + 1)..-1] @@ -93,7 +94,7 @@ def register(short, long = nil) ret = yield long = $LOADED_FEATURES[len..-1].detect do |feat| offset = 0 - while offset = feat.index(short, offset) + while (offset = feat.index(short, offset)) if feat.index(".", offset + 1) && !feat.index("/", offset + 2) break true else @@ -128,7 +129,7 @@ def register(short, long = nil) private - STRIP_EXTENSION = /\.[^.]*?$/ + STRIP_EXTENSION = /\.[^.]*?$/.freeze private_constant(:STRIP_EXTENSION) # Might Ruby automatically search for this extension if @@ -145,15 +146,15 @@ def register(short, long = nil) # with calling a Ruby file 'x.dylib.rb' and then requiring it as 'x.dylib'.) # # See . - def extension_elidable?(f) - f.to_s.end_with?('.rb', '.so', '.o', '.dll', '.dylib') + def extension_elidable?(feature) + feature.to_s.end_with?(".rb", ".so", ".o", ".dll", ".dylib") end - def strip_extension_if_elidable(f) - if extension_elidable?(f) - f.sub(STRIP_EXTENSION, '') + def strip_extension_if_elidable(feature) + if extension_elidable?(feature) + feature.sub(STRIP_EXTENSION, "") else - f + feature end end end diff --git a/lib/bootsnap/load_path_cache/path.rb b/lib/bootsnap/load_path_cache/path.rb index b2e13d3d..7376e7de 100644 --- a/lib/bootsnap/load_path_cache/path.rb +++ b/lib/bootsnap/load_path_cache/path.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require_relative('path_scanner') + +require_relative("path_scanner") module Bootsnap module LoadPathCache @@ -43,6 +44,7 @@ def entries_and_dirs(store) # set to zero anyway, just in case we change the stability heuristics. _, entries, dirs = store.get(expanded_path) return [entries, dirs] if entries # cache hit + entries, dirs = scan! store.set(expanded_path, [0, entries, dirs]) return [entries, dirs] @@ -93,8 +95,8 @@ def latest_mtime(path, dirs) # Built-in ruby lib stuff doesn't change, but things can occasionally be # installed into sitedir, which generally lives under libdir. - RUBY_LIBDIR = RbConfig::CONFIG['libdir'] - RUBY_SITEDIR = RbConfig::CONFIG['sitedir'] + RUBY_LIBDIR = RbConfig::CONFIG["libdir"] + RUBY_SITEDIR = RbConfig::CONFIG["sitedir"] def stability @stability ||= begin diff --git a/lib/bootsnap/load_path_cache/path_scanner.rb b/lib/bootsnap/load_path_cache/path_scanner.rb index 9b311437..45116d87 100644 --- a/lib/bootsnap/load_path_cache/path_scanner.rb +++ b/lib/bootsnap/load_path_cache/path_scanner.rb @@ -1,18 +1,18 @@ # frozen_string_literal: true -require_relative('../explicit_require') +require_relative("../explicit_require") module Bootsnap module LoadPathCache module PathScanner REQUIRABLE_EXTENSIONS = [DOT_RB] + DL_EXTENSIONS NORMALIZE_NATIVE_EXTENSIONS = !DL_EXTENSIONS.include?(LoadPathCache::DOT_SO) - ALTERNATIVE_NATIVE_EXTENSIONS_PATTERN = /\.(o|bundle|dylib)\z/ + ALTERNATIVE_NATIVE_EXTENSIONS_PATTERN = /\.(o|bundle|dylib)\z/.freeze BUNDLE_PATH = if Bootsnap.bundler? (Bundler.bundle_path.cleanpath.to_s << LoadPathCache::SLASH).freeze else - '' + "" end class << self @@ -44,7 +44,8 @@ def call(path) def walk(absolute_dir_path, relative_dir_path, &block) Dir.foreach(absolute_dir_path) do |name| - next if name.start_with?('.') + next if name.start_with?(".") + relative_path = relative_dir_path ? File.join(relative_dir_path, name) : name absolute_path = "#{absolute_dir_path}/#{name}" @@ -58,7 +59,7 @@ def walk(absolute_dir_path, relative_dir_path, &block) end end - if RUBY_VERSION >= '3.1' + if RUBY_VERSION >= "3.1" def os_path(path) path.freeze end diff --git a/lib/bootsnap/load_path_cache/realpath_cache.rb b/lib/bootsnap/load_path_cache/realpath_cache.rb index 3c120cc1..db479480 100644 --- a/lib/bootsnap/load_path_cache/realpath_cache.rb +++ b/lib/bootsnap/load_path_cache/realpath_cache.rb @@ -21,6 +21,7 @@ def realpath(caller_location, path) def find_file(name) return File.realpath(name).freeze if File.exist?(name) + CACHED_EXTENSIONS.each do |ext| filename = "#{name}#{ext}" return File.realpath(filename).freeze if File.exist?(filename) diff --git a/lib/bootsnap/load_path_cache/store.rb b/lib/bootsnap/load_path_cache/store.rb index 071ca4f4..99246e95 100644 --- a/lib/bootsnap/load_path_cache/store.rb +++ b/lib/bootsnap/load_path_cache/store.rb @@ -1,14 +1,15 @@ # frozen_string_literal: true -require_relative('../explicit_require') -Bootsnap::ExplicitRequire.with_gems('msgpack') { require('msgpack') } -Bootsnap::ExplicitRequire.from_rubylibdir('fileutils') +require_relative("../explicit_require") + +Bootsnap::ExplicitRequire.with_gems("msgpack") { require("msgpack") } +Bootsnap::ExplicitRequire.from_rubylibdir("fileutils") module Bootsnap module LoadPathCache class Store - VERSION_KEY = '__bootsnap_ruby_version__' - CURRENT_VERSION = "#{RUBY_REVISION}-#{RUBY_PLATFORM}".freeze + VERSION_KEY = "__bootsnap_ruby_version__" + CURRENT_VERSION = "#{RUBY_REVISION}-#{RUBY_PLATFORM}".freeze # rubocop:disable Style/RedundantFreeze NestedTransactionError = Class.new(StandardError) SetOutsideTransactionNotAllowed = Class.new(StandardError) @@ -26,6 +27,7 @@ def get(key) def fetch(key) raise(SetOutsideTransactionNotAllowed) unless @txn_mutex.owned? + v = get(key) unless v @dirty = true @@ -37,6 +39,7 @@ def fetch(key) def set(key, value) raise(SetOutsideTransactionNotAllowed) unless @txn_mutex.owned? + if value != @data[key] @dirty = true @data[key] = value @@ -45,6 +48,7 @@ def set(key, value) def transaction raise(NestedTransactionError) if @txn_mutex.owned? + @txn_mutex.synchronize do begin yield @@ -88,7 +92,7 @@ def load_data def dump_data # Change contents atomically so other processes can't get invalid # caches if they read at an inopportune time. - tmp = "#{@store_path}.#{Process.pid}.#{(rand * 100000).to_i}.tmp" + tmp = "#{@store_path}.#{Process.pid}.#{(rand * 100_000).to_i}.tmp" FileUtils.mkpath(File.dirname(tmp)) exclusive_write = File::Constants::CREAT | File::Constants::EXCL | File::Constants::WRONLY # `encoding:` looks redundant wrt `binwrite`, but necessary on windows @@ -103,7 +107,7 @@ def dump_data end def default_data - { VERSION_KEY => CURRENT_VERSION } + {VERSION_KEY => CURRENT_VERSION} end end end diff --git a/lib/bootsnap/setup.rb b/lib/bootsnap/setup.rb index 32348cd2..232980f1 100644 --- a/lib/bootsnap/setup.rb +++ b/lib/bootsnap/setup.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true -require_relative('../bootsnap') + +require_relative("../bootsnap") Bootsnap.default_setup diff --git a/lib/bootsnap/version.rb b/lib/bootsnap/version.rb index a7fdfdd5..7046d91b 100644 --- a/lib/bootsnap/version.rb +++ b/lib/bootsnap/version.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module Bootsnap VERSION = "1.9.4" end diff --git a/test/bundler_test.rb b/test/bundler_test.rb index 1890faef..1b1bc0a0 100644 --- a/test/bundler_test.rb +++ b/test/bundler_test.rb @@ -1,17 +1,18 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") class BundlerTest < Minitest::Test def test_bundler_with_bundle_bin_path_env without_required_env_keys do - ENV['BUNDLE_BIN_PATH'] = 'foo' + ENV["BUNDLE_BIN_PATH"] = "foo" assert_predicate(Bootsnap, :bundler?) end end def test_bundler_with_bundle_gemfile_env without_required_env_keys do - ENV['BUNDLE_GEMFILE'] = 'foo' + ENV["BUNDLE_GEMFILE"] = "foo" assert_predicate(Bootsnap, :bundler?) end end diff --git a/test/cli_test.rb b/test/cli_test.rb index d2f52ab3..3f33c996 100644 --- a/test/cli_test.rb +++ b/test/cli_test.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true -require('test_helper') -require('bootsnap/cli') + +require("test_helper") +require("bootsnap/cli") module Bootsnap class CLITest < Minitest::Test @@ -8,52 +9,52 @@ class CLITest < Minitest::Test def setup super - @cache_dir = File.expand_path('tmp/cache/bootsnap/compile-cache') + @cache_dir = File.expand_path("tmp/cache/bootsnap/compile-cache") end def test_precompile_single_file - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) CompileCache::ISeq.expects(:precompile).with(File.expand_path(path), cache_dir: @cache_dir) - assert_equal 0, CLI.new(['precompile', '-j', '0', path]).run + assert_equal 0, CLI.new(["precompile", "-j", "0", path]).run end def test_no_iseq - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) CompileCache::ISeq.expects(:precompile).never - assert_equal 0, CLI.new(['precompile', '-j', '0', '--no-iseq', path]).run + assert_equal 0, CLI.new(["precompile", "-j", "0", "--no-iseq", path]).run end def test_precompile_directory - path_a = Help.set_file('foo/a.rb', 'a = a = 3', 100) - path_b = Help.set_file('foo/b.rb', 'b = b = 3', 100) + path_a = Help.set_file("foo/a.rb", "a = a = 3", 100) + path_b = Help.set_file("foo/b.rb", "b = b = 3", 100) CompileCache::ISeq.expects(:precompile).with(File.expand_path(path_a), cache_dir: @cache_dir) CompileCache::ISeq.expects(:precompile).with(File.expand_path(path_b), cache_dir: @cache_dir) - assert_equal 0, CLI.new(['precompile', '-j', '0', 'foo']).run + assert_equal 0, CLI.new(["precompile", "-j", "0", "foo"]).run end def test_precompile_exclude - path_a = Help.set_file('foo/a.rb', 'a = a = 3', 100) - Help.set_file('foo/b.rb', 'b = b = 3', 100) + path_a = Help.set_file("foo/a.rb", "a = a = 3", 100) + Help.set_file("foo/b.rb", "b = b = 3", 100) CompileCache::ISeq.expects(:precompile).with(File.expand_path(path_a), cache_dir: @cache_dir) - assert_equal 0, CLI.new(['precompile', '-j', '0', '--exclude', 'b.rb', 'foo']).run + assert_equal 0, CLI.new(["precompile", "-j", "0", "--exclude", "b.rb", "foo"]).run end def test_precompile_gemfile - assert_equal 0, CLI.new(['precompile', '--gemfile']).run + assert_equal 0, CLI.new(["precompile", "--gemfile"]).run end def test_precompile_yaml - path = Help.set_file('a.yaml', 'foo: bar', 100) + path = Help.set_file("a.yaml", "foo: bar", 100) CompileCache::YAML.expects(:precompile).with(File.expand_path(path), cache_dir: @cache_dir) - assert_equal 0, CLI.new(['precompile', '-j', '0', path]).run + assert_equal 0, CLI.new(["precompile", "-j", "0", path]).run end def test_no_yaml - path = Help.set_file('a.yaml', 'foo: bar', 100) + path = Help.set_file("a.yaml", "foo: bar", 100) CompileCache::YAML.expects(:precompile).never - assert_equal 0, CLI.new(['precompile', '-j', '0', '--no-yaml', path]).run + assert_equal 0, CLI.new(["precompile", "-j", "0", "--no-yaml", path]).run end end end diff --git a/test/compile_cache/iseq_cache_test.rb b/test/compile_cache/iseq_cache_test.rb index 59e6d9d6..10228ed9 100644 --- a/test/compile_cache/iseq_cache_test.rb +++ b/test/compile_cache/iseq_cache_test.rb @@ -1,11 +1,12 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") class CompileCacheISeqTest < Minitest::Test include(TmpdirHelper) def test_ruby_bug_18250 - Help.set_file('a.rb', 'def foo(*); ->{ super }; end; def foo(**); ->{ super }; end', 100) - Bootsnap::CompileCache::ISeq.fetch('a.rb') + Help.set_file("a.rb", "def foo(*); ->{ super }; end; def foo(**); ->{ super }; end", 100) + Bootsnap::CompileCache::ISeq.fetch("a.rb") end end diff --git a/test/compile_cache/json_test.rb b/test/compile_cache/json_test.rb index f0bf53fd..99b4c076 100644 --- a/test/compile_cache/json_test.rb +++ b/test/compile_cache/json_test.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") class CompileCacheJSONTest < Minitest::Test include(TmpdirHelper) @@ -7,7 +8,7 @@ class CompileCacheJSONTest < Minitest::Test module FakeJson Fallback = Class.new(StandardError) class << self - def load_file(path, symbolize_names: false, freeze: false, fallback: nil) + def load_file(_path, symbolize_names: false, freeze: false, fallback: nil) raise Fallback end end @@ -27,55 +28,55 @@ def test_json_input_to_output } JSON expected = { - 'foo' => 42, - 'bar' => [1], + "foo" => 42, + "bar" => [1], } assert_equal expected, document end def test_load_file - Help.set_file('a.json', '{"foo": "bar"}', 100) - assert_equal({'foo' => 'bar'}, FakeJson.load_file('a.json')) + Help.set_file("a.json", '{"foo": "bar"}', 100) + assert_equal({"foo" => "bar"}, FakeJson.load_file("a.json")) end def test_load_file_symbolize_names - Help.set_file('a.json', '{"foo": "bar"}', 100) - FakeJson.load_file('a.json') + Help.set_file("a.json", '{"foo": "bar"}', 100) + FakeJson.load_file("a.json") if ::Bootsnap::CompileCache::JSON.supported_options.include?(:symbolize_names) 2.times do - assert_equal({foo: 'bar'}, FakeJson.load_file('a.json', symbolize_names: true)) + assert_equal({foo: "bar"}, FakeJson.load_file("a.json", symbolize_names: true)) end else assert_raises(FakeJson::Fallback) do # would call super - FakeJson.load_file('a.json', symbolize_names: true) + FakeJson.load_file("a.json", symbolize_names: true) end end end def test_load_file_freeze - Help.set_file('a.json', '["foo"]', 100) - FakeJson.load_file('a.json') + Help.set_file("a.json", '["foo"]', 100) + FakeJson.load_file("a.json") if ::Bootsnap::CompileCache::JSON.supported_options.include?(:freeze) 2.times do - string = FakeJson.load_file('a.json', freeze: true).first + string = FakeJson.load_file("a.json", freeze: true).first assert_equal("foo", string) assert_predicate(string, :frozen?) end else assert_raises(FakeJson::Fallback) do # would call super - FakeJson.load_file('a.json', freeze: true) + FakeJson.load_file("a.json", freeze: true) end end end def test_load_file_unknown_option - Help.set_file('a.json', '["foo"]', 100) - FakeJson.load_file('a.json') + Help.set_file("a.json", '["foo"]', 100) + FakeJson.load_file("a.json") assert_raises(FakeJson::Fallback) do # would call super - FakeJson.load_file('a.json', fallback: true) + FakeJson.load_file("a.json", fallback: true) end end end diff --git a/test/compile_cache/yaml_test.rb b/test/compile_cache/yaml_test.rb index e9a9358a..f9b6d6fd 100644 --- a/test/compile_cache/yaml_test.rb +++ b/test/compile_cache/yaml_test.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") class CompileCacheYAMLTest < Minitest::Test include(TmpdirHelper) @@ -7,11 +8,11 @@ class CompileCacheYAMLTest < Minitest::Test module FakeYaml Fallback = Class.new(StandardError) class << self - def load_file(path, symbolize_names: false, freeze: false, fallback: nil) + def load_file(_path, symbolize_names: false, freeze: false, fallback: nil) raise Fallback end - def unsafe_load_file(path, symbolize_names: false, freeze: false, fallback: nil) + def unsafe_load_file(_path, symbolize_names: false, freeze: false, fallback: nil) raise Fallback end end @@ -31,7 +32,7 @@ def test_yaml_strict_load YAML expected = { foo: 42, - 'bar' => [1], + "bar" => [1], } assert_equal expected, document end @@ -44,89 +45,89 @@ def test_yaml_input_to_output YAML expected = { foo: 42, - 'bar' => [1], + "bar" => [1], } assert_equal expected, document end def test_yaml_tags error = assert_raises Bootsnap::CompileCache::Uncompilable do - ::Bootsnap::CompileCache::YAML.strict_load('!many Boolean') + ::Bootsnap::CompileCache::YAML.strict_load("!many Boolean") end assert_equal "YAML tags are not supported: !many", error.message error = assert_raises Bootsnap::CompileCache::Uncompilable do - ::Bootsnap::CompileCache::YAML.strict_load('!ruby/object {}') + ::Bootsnap::CompileCache::YAML.strict_load("!ruby/object {}") end assert_equal "YAML tags are not supported: !ruby/object", error.message end - if YAML::VERSION >= '4' + if YAML::VERSION >= "4" def test_load_psych_4 # Until we figure out a proper strategy, only `YAML.unsafe_load_file` # is cached with Psych >= 4 - Help.set_file('a.yml', "foo: &foo\n bar: 42\nplop:\n <<: *foo", 100) + Help.set_file("a.yml", "foo: &foo\n bar: 42\nplop:\n <<: *foo", 100) assert_raises FakeYaml::Fallback do - FakeYaml.load_file('a.yml') + FakeYaml.load_file("a.yml") end end else def test_load_file - Help.set_file('a.yml', "---\nfoo: bar", 100) - assert_equal({'foo' => 'bar'}, FakeYaml.load_file('a.yml')) + Help.set_file("a.yml", "---\nfoo: bar", 100) + assert_equal({"foo" => "bar"}, FakeYaml.load_file("a.yml")) end def test_load_file_aliases - Help.set_file('a.yml', "foo: &foo\n bar: 42\nplop:\n <<: *foo", 100) - assert_equal({"foo" => { "bar" => 42 }, "plop" => { "bar" => 42} }, FakeYaml.load_file('a.yml')) + Help.set_file("a.yml", "foo: &foo\n bar: 42\nplop:\n <<: *foo", 100) + assert_equal({"foo" => {"bar" => 42}, "plop" => {"bar" => 42}}, FakeYaml.load_file("a.yml")) end def test_load_file_symbolize_names - Help.set_file('a.yml', "---\nfoo: bar", 100) - FakeYaml.load_file('a.yml') + Help.set_file("a.yml", "---\nfoo: bar", 100) + FakeYaml.load_file("a.yml") if ::Bootsnap::CompileCache::YAML.supported_options.include?(:symbolize_names) 2.times do - assert_equal({foo: 'bar'}, FakeYaml.load_file('a.yml', symbolize_names: true)) + assert_equal({foo: "bar"}, FakeYaml.load_file("a.yml", symbolize_names: true)) end else assert_raises(FakeYaml::Fallback) do # would call super - FakeYaml.load_file('a.yml', symbolize_names: true) + FakeYaml.load_file("a.yml", symbolize_names: true) end end end def test_load_file_freeze - Help.set_file('a.yml', "---\nfoo", 100) - FakeYaml.load_file('a.yml') + Help.set_file("a.yml", "---\nfoo", 100) + FakeYaml.load_file("a.yml") if ::Bootsnap::CompileCache::YAML.supported_options.include?(:freeze) 2.times do - string = FakeYaml.load_file('a.yml', freeze: true) + string = FakeYaml.load_file("a.yml", freeze: true) assert_equal("foo", string) assert_predicate(string, :frozen?) end else assert_raises(FakeYaml::Fallback) do # would call super - FakeYaml.load_file('a.yml', freeze: true) + FakeYaml.load_file("a.yml", freeze: true) end end end def test_load_file_unknown_option - Help.set_file('a.yml', "---\nfoo", 100) - FakeYaml.load_file('a.yml') + Help.set_file("a.yml", "---\nfoo", 100) + FakeYaml.load_file("a.yml") assert_raises(FakeYaml::Fallback) do # would call super - FakeYaml.load_file('a.yml', fallback: true) + FakeYaml.load_file("a.yml", fallback: true) end end end if YAML.respond_to?(:unsafe_load_file) def test_unsafe_load_file - Help.set_file('a.yml', "foo: &foo\n bar: 42\nplop:\n <<: *foo", 100) - assert_equal({"foo" => { "bar" => 42 }, "plop" => { "bar" => 42} }, FakeYaml.unsafe_load_file('a.yml')) + Help.set_file("a.yml", "foo: &foo\n bar: 42\nplop:\n <<: *foo", 100) + assert_equal({"foo" => {"bar" => 42}, "plop" => {"bar" => 42}}, FakeYaml.unsafe_load_file("a.yml")) end end end diff --git a/test/compile_cache_handler_errors_test.rb b/test/compile_cache_handler_errors_test.rb index 3414a9b2..ac9ff586 100644 --- a/test/compile_cache_handler_errors_test.rb +++ b/test/compile_cache_handler_errors_test.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") class CompileCacheHandlerErrorsTest < Minitest::Test include(TmpdirHelper) @@ -10,16 +11,16 @@ class CompileCacheHandlerErrorsTest < Minitest::Test # 3. exception def test_input_to_storage_unexpected_type - path = Help.set_file('a.rb', 'a = 3', 100) + path = Help.set_file("a.rb", "a = 3", 100) Bootsnap::CompileCache::ISeq.expects(:input_to_storage).returns(nil) # this could be made slightly more obvious though. assert_raises(TypeError) { load(path) } end def test_input_to_storage_invalid_instance_of_expected_type - path = Help.set_file('a.rb', 'a = 3', 100) - Bootsnap::CompileCache::ISeq.expects(:input_to_storage).returns('broken') - Bootsnap::CompileCache::ISeq.expects(:input_to_output).with('a = 3', nil).returns('whatever') + path = Help.set_file("a.rb", "a = 3", 100) + Bootsnap::CompileCache::ISeq.expects(:input_to_storage).returns("broken") + Bootsnap::CompileCache::ISeq.expects(:input_to_output).with("a = 3", nil).returns("whatever") _, err = capture_subprocess_io do load(path) end @@ -27,14 +28,14 @@ def test_input_to_storage_invalid_instance_of_expected_type end def test_input_to_storage_raises - path = Help.set_file('a.rb', 'a = 3', 100) + path = Help.set_file("a.rb", "a = 3", 100) klass = Class.new(StandardError) - Bootsnap::CompileCache::ISeq.expects(:input_to_storage).raises(klass, 'oops') + Bootsnap::CompileCache::ISeq.expects(:input_to_storage).raises(klass, "oops") assert_raises(klass) { load(path) } end def test_storage_to_output_unexpected_type - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) Bootsnap::CompileCache::ISeq.expects(:storage_to_output).returns(Object.new) # It seems like ruby doesn't really care. load(path) @@ -45,16 +46,16 @@ def test_storage_to_output_unexpected_type # def test_storage_to_output_invalid_instance_of_expected_type def test_storage_to_output_raises - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) klass = Class.new(StandardError) - Bootsnap::CompileCache::ISeq.expects(:storage_to_output).times(2).raises(klass, 'oops') + Bootsnap::CompileCache::ISeq.expects(:storage_to_output).times(2).raises(klass, "oops") assert_raises(klass) { load(path) } # called from two paths; this tests the second. assert_raises(klass) { load(path) } end def test_input_to_output_unexpected_type - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) Bootsnap::CompileCache::ISeq.expects(:input_to_storage).raises(Bootsnap::CompileCache::Uncompilable) Bootsnap::CompileCache::ISeq.expects(:input_to_output).returns(Object.new) # It seems like ruby doesn't really care. @@ -66,10 +67,10 @@ def test_input_to_output_unexpected_type # def test_input_to_output_invalid_instance_of_expected_type def test_input_to_output_raises - path = Help.set_file('a.rb', 'a = 3', 100) + path = Help.set_file("a.rb", "a = 3", 100) klass = Class.new(StandardError) Bootsnap::CompileCache::ISeq.expects(:input_to_storage).raises(Bootsnap::CompileCache::Uncompilable) - Bootsnap::CompileCache::ISeq.expects(:input_to_output).raises(klass, 'oops') + Bootsnap::CompileCache::ISeq.expects(:input_to_output).raises(klass, "oops") assert_raises(klass) { load(path) } end end diff --git a/test/compile_cache_key_format_test.rb b/test/compile_cache_key_format_test.rb index 40c56d58..522475ee 100644 --- a/test/compile_cache_key_format_test.rb +++ b/test/compile_cache_key_format_test.rb @@ -1,8 +1,9 @@ # frozen_string_literal: true -require('test_helper') -require('tempfile') -require('tmpdir') -require('fileutils') + +require("test_helper") +require("tempfile") +require("tmpdir") +require("fileutils") class CompileCacheKeyFormatTest < Minitest::Test FILE = File.expand_path(__FILE__) @@ -16,7 +17,7 @@ class CompileCacheKeyFormatTest < Minitest::Test size: 16...24, mtime: 24...32, data_size: 32...40, - } + }.freeze def test_key_version key = cache_key_for_file(FILE) @@ -27,12 +28,12 @@ def test_key_version def test_key_compile_option_stable k1 = cache_key_for_file(FILE) k2 = cache_key_for_file(FILE) - RubyVM::InstructionSequence.compile_option = { tailcall_optimization: true } + RubyVM::InstructionSequence.compile_option = {tailcall_optimization: true} k3 = cache_key_for_file(FILE) assert_equal(k1[R[:compile_option]], k2[R[:compile_option]]) refute_equal(k1[R[:compile_option]], k3[R[:compile_option]]) ensure - RubyVM::InstructionSequence.compile_option = { tailcall_optimization: false } + RubyVM::InstructionSequence.compile_option = {tailcall_optimization: false} end def test_key_ruby_revision @@ -60,11 +61,11 @@ def test_key_mtime end def test_fetch - if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/ - target = 'NUL' + if RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/ + target = "NUL" expected_file = "#{@tmp_dir}/36/9eba19c29ffe00" else - target = '/dev/null' + target = "/dev/null" expected_file = "#{@tmp_dir}/8c/d2d180bbd995df" end @@ -80,7 +81,7 @@ def test_fetch def test_unexistent_fetch assert_raises(Errno::ENOENT) do - Bootsnap::CompileCache::Native.fetch(@tmp_dir, '123', Bootsnap::CompileCache::ISeq, nil) + Bootsnap::CompileCache::Native.fetch(@tmp_dir, "123", Bootsnap::CompileCache::ISeq, nil) end end diff --git a/test/compile_cache_test.rb b/test/compile_cache_test.rb index 63c3de88..98174a2c 100644 --- a/test/compile_cache_test.rb +++ b/test/compile_cache_test.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") class CompileCacheTest < Minitest::Test include(TmpdirHelper) @@ -14,7 +15,7 @@ def test_compile_option_crc32 def test_coverage_running? refute(Bootsnap::CompileCache::Native.coverage_running?) - require('coverage') + require("coverage") begin Coverage.start assert(Bootsnap::CompileCache::Native.coverage_running?) @@ -24,7 +25,7 @@ def test_coverage_running? end def test_no_write_permission_to_cache - if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/ + if RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/ # Always pass this test on Windows because directories aren't read, only # listed. You can restrict the ability to list directory contents on # Windows or you can set ACLS on a folder such that it is not allowed to @@ -36,25 +37,25 @@ def test_no_write_permission_to_cache # read-only files. pass else - path = Help.set_file('a.rb', 'a = 3', 100) + path = Help.set_file("a.rb", "a = 3", 100) folder = File.dirname(Help.cache_path(@tmp_dir, path)) FileUtils.mkdir_p(folder) - FileUtils.chmod(0400, folder) + FileUtils.chmod(0o400, folder) load(path) end end def test_can_open_read_only_cache - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) # Load once to create the cache file load(path) - FileUtils.chmod(0400, path) + FileUtils.chmod(0o400, path) # Loading again after the file is marked read-only should still succeed load(path) end def test_file_is_only_read_once - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) storage = RubyVM::InstructionSequence.compile_file(path).to_binary output = RubyVM::InstructionSequence.load_from_binary(storage) # This doesn't really *prove* the file is only read once, but @@ -66,7 +67,7 @@ def test_file_is_only_read_once end def test_raises_syntax_error - path = Help.set_file('a.rb', 'a = (3', 100) + path = Help.set_file("a.rb", "a = (3", 100) assert_raises(SyntaxError) do # SyntaxError emits directly to stderr in addition to raising, it seems. capture_io { load(path) } @@ -74,19 +75,19 @@ def test_raises_syntax_error end def test_no_recache_when_mtime_and_size_same - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) storage = RubyVM::InstructionSequence.compile_file(path).to_binary output = RubyVM::InstructionSequence.load_from_binary(storage) Bootsnap::CompileCache::ISeq.expects(:input_to_storage).times(1).returns(storage) Bootsnap::CompileCache::ISeq.expects(:storage_to_output).times(2).returns(output) load(path) - Help.set_file(path, 'a = a = 4', 100) + Help.set_file(path, "a = a = 4", 100) load(path) end def test_recache_when_mtime_different - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) storage = RubyVM::InstructionSequence.compile_file(path).to_binary output = RubyVM::InstructionSequence.load_from_binary(storage) # Totally lies the second time but that's not the point. @@ -94,12 +95,12 @@ def test_recache_when_mtime_different Bootsnap::CompileCache::ISeq.expects(:storage_to_output).times(2).returns(output) load(path) - Help.set_file(path, 'a = a = 2', 101) + Help.set_file(path, "a = a = 2", 101) load(path) end def test_recache_when_size_different - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) storage = RubyVM::InstructionSequence.compile_file(path).to_binary output = RubyVM::InstructionSequence.load_from_binary(storage) # Totally lies the second time but that's not the point. @@ -107,27 +108,27 @@ def test_recache_when_size_different Bootsnap::CompileCache::ISeq.expects(:storage_to_output).times(2).returns(output) load(path) - Help.set_file(path, 'a = 33', 100) + Help.set_file(path, "a = 33", 100) load(path) end def test_invalid_cache_file - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) cp = Help.cache_path(@tmp_dir, path) FileUtils.mkdir_p(File.dirname(cp)) - File.write(cp, 'nope') + File.write(cp, "nope") load(path) assert(File.size(cp) > 32) # cache was overwritten end def test_instrumentation_hit - path = Help.set_file('a.rb', 'a = a = 3', 100) - load(path) + file_path = Help.set_file("a.rb", "a = a = 3", 100) + load(file_path) calls = [] Bootsnap.instrumentation = ->(event, path) { calls << [event, path] } - load(path) + load(file_path) assert_equal [], calls ensure @@ -135,29 +136,29 @@ def test_instrumentation_hit end def test_instrumentation_miss - path = Help.set_file('a.rb', 'a = a = 3', 100) + file_path = Help.set_file("a.rb", "a = a = 3", 100) calls = [] Bootsnap.instrumentation = ->(event, path) { calls << [event, path] } - load(path) + load(file_path) - assert_equal [[:miss, 'a.rb']], calls + assert_equal [[:miss, "a.rb"]], calls ensure Bootsnap.instrumentation = nil end def test_instrumentation_stale - path = Help.set_file('a.rb', 'a = a = 3', 100) - load(path) - path = Help.set_file('a.rb', 'a = a = 4', 101) + file_path = Help.set_file("a.rb", "a = a = 3", 100) + load(file_path) + file_path = Help.set_file("a.rb", "a = a = 4", 101) calls = [] Bootsnap.instrumentation = ->(event, path) { calls << [event, path] } - load(path) + load(file_path) - assert_equal [[:stale, 'a.rb']], calls + assert_equal [[:stale, "a.rb"]], calls ensure Bootsnap.instrumentation = nil end diff --git a/test/helper_test.rb b/test/helper_test.rb index 99f92f85..1de619e8 100644 --- a/test/helper_test.rb +++ b/test/helper_test.rb @@ -1,11 +1,12 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") class HelperTest < MiniTest::Test include(TmpdirHelper) def test_validate_cache_path - path = Help.set_file('a.rb', 'a = a = 3', 100) + path = Help.set_file("a.rb", "a = a = 3", 100) cp = Help.cache_path(@tmp_dir, path) load(path) assert_equal(true, File.file?(cp)) diff --git a/test/load_path_cache/cache_test.rb b/test/load_path_cache/cache_test.rb index 9b3a2c3b..cc8d3386 100644 --- a/test/load_path_cache/cache_test.rb +++ b/test/load_path_cache/cache_test.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") module Bootsnap module LoadPathCache @@ -28,31 +29,31 @@ def teardown # versions aren't a big deal, but feel free to fix the test. def test_builtin_features cache = Cache.new(NullCache, []) - assert_raises(ReturnFalse) { cache.find('thread') } - assert_raises(ReturnFalse) { cache.find('thread.rb') } - assert_raises(ReturnFalse) { cache.find('enumerator') } - assert_raises(ReturnFalse) { cache.find('enumerator.so') } + assert_raises(ReturnFalse) { cache.find("thread") } + assert_raises(ReturnFalse) { cache.find("thread.rb") } + assert_raises(ReturnFalse) { cache.find("enumerator") } + assert_raises(ReturnFalse) { cache.find("enumerator.so") } if RUBY_PLATFORM =~ /darwin/ - assert_raises(ReturnFalse) { cache.find('enumerator.bundle') } + assert_raises(ReturnFalse) { cache.find("enumerator.bundle") } else - assert_raises(FallbackScan) { cache.find('enumerator.bundle') } + assert_raises(FallbackScan) { cache.find("enumerator.bundle") } end - bundle = RUBY_PLATFORM =~ /darwin/ ? 'bundle' : 'so' + bundle = RUBY_PLATFORM =~ /darwin/ ? "bundle" : "so" - refute(cache.find('thread.' + bundle)) - refute(cache.find('enumerator.rb')) - refute(cache.find('encdb.' + bundle)) + refute(cache.find("thread." + bundle)) + refute(cache.find("enumerator.rb")) + refute(cache.find("encdb." + bundle)) end def test_simple po = [@dir1] cache = Cache.new(NullCache, po) - assert_equal("#{@dir1}/a.rb", cache.find('a')) - refute(cache.find('a', try_extensions: false)) + assert_equal("#{@dir1}/a.rb", cache.find("a")) + refute(cache.find("a", try_extensions: false)) cache.push_paths(po, @dir2) - assert_equal("#{@dir2}/b.rb", cache.find('b')) - refute(cache.find('b', try_extensions: false)) + assert_equal("#{@dir2}/b.rb", cache.find("b")) + refute(cache.find("b", try_extensions: false)) end def test_extension_append_for_relative_paths @@ -60,35 +61,35 @@ def test_extension_append_for_relative_paths cache = Cache.new(NullCache, po) dir1_basename = File.basename(@dir1) Dir.chdir(@dir1) do - assert_equal("#{@dir1}/a.rb", cache.find('./a')) - assert_equal("#{@dir1}/a", cache.find('./a', try_extensions: false)) + assert_equal("#{@dir1}/a.rb", cache.find("./a")) + assert_equal("#{@dir1}/a", cache.find("./a", try_extensions: false)) assert_equal("#{@dir1}/a.rb", cache.find("../#{dir1_basename}/a")) assert_equal("#{@dir1}/a", cache.find("../#{dir1_basename}/a", try_extensions: false)) - assert_equal("#{@dir1}/dl#{DLEXT}", cache.find('./dl')) - assert_equal("#{@dir1}/dl", cache.find('./dl', try_extensions: false)) - assert_equal("#{@dir1}/enoent", cache.find('./enoent')) - assert_equal("#{@dir1}/enoent", cache.find('./enoent', try_extensions: false)) + assert_equal("#{@dir1}/dl#{DLEXT}", cache.find("./dl")) + assert_equal("#{@dir1}/dl", cache.find("./dl", try_extensions: false)) + assert_equal("#{@dir1}/enoent", cache.find("./enoent")) + assert_equal("#{@dir1}/enoent", cache.find("./enoent", try_extensions: false)) end end def test_unshifted_paths_have_higher_precedence po = [@dir1] cache = Cache.new(NullCache, po) - assert_equal("#{@dir1}/conflict.rb", cache.find('conflict')) - assert_equal("#{@dir1}/conflict.rb", cache.find('conflict.rb', try_extensions: false)) + assert_equal("#{@dir1}/conflict.rb", cache.find("conflict")) + assert_equal("#{@dir1}/conflict.rb", cache.find("conflict.rb", try_extensions: false)) cache.unshift_paths(po, @dir2) - assert_equal("#{@dir2}/conflict.rb", cache.find('conflict')) - assert_equal("#{@dir2}/conflict.rb", cache.find('conflict.rb', try_extensions: false)) + assert_equal("#{@dir2}/conflict.rb", cache.find("conflict")) + assert_equal("#{@dir2}/conflict.rb", cache.find("conflict.rb", try_extensions: false)) end def test_pushed_paths_have_lower_precedence po = [@dir1] cache = Cache.new(NullCache, po) - assert_equal("#{@dir1}/conflict.rb", cache.find('conflict')) - assert_equal("#{@dir1}/conflict.rb", cache.find('conflict.rb', try_extensions: false)) + assert_equal("#{@dir1}/conflict.rb", cache.find("conflict")) + assert_equal("#{@dir1}/conflict.rb", cache.find("conflict.rb", try_extensions: false)) cache.push_paths(po, @dir2) - assert_equal("#{@dir1}/conflict.rb", cache.find('conflict')) - assert_equal("#{@dir1}/conflict.rb", cache.find('conflict.rb', try_extensions: false)) + assert_equal("#{@dir1}/conflict.rb", cache.find("conflict")) + assert_equal("#{@dir1}/conflict.rb", cache.find("conflict.rb", try_extensions: false)) end def test_directory_caching @@ -100,8 +101,8 @@ def test_directory_caching def test_extension_permutations cache = Cache.new(NullCache, [@dir1]) - assert_equal("#{@dir1}/dl#{DLEXT}", cache.find('dl')) - refute(cache.find('dl', try_extensions: false)) + assert_equal("#{@dir1}/dl#{DLEXT}", cache.find("dl")) + refute(cache.find("dl", try_extensions: false)) assert_equal("#{@dir1}/dl#{DLEXT}", cache.find("dl#{DLEXT}")) assert_equal("#{@dir1}/both.rb", cache.find("both")) refute(cache.find("both", try_extensions: false)) @@ -114,14 +115,14 @@ def test_extension_permutations def test_relative_paths_rescanned Dir.chdir(@dir2) do cache = Cache.new(NullCache, %w(foo)) - refute(cache.find('bar/baz')) + refute(cache.find("bar/baz")) Dir.chdir(@dir1) do # one caveat here is that you get the actual path back when # resolving relative paths. On darwin, this means that # /var/folders/... comes back as /private/var/folders/... -- In # production, this should be fine, but for this test to pass, we # have to resolve it. - assert_equal(File.realpath("#{@dir1}/foo/bar/baz.rb"), cache.find('bar/baz')) + assert_equal(File.realpath("#{@dir1}/foo/bar/baz.rb"), cache.find("bar/baz")) end end end @@ -136,14 +137,14 @@ def test_development_mode FileUtils.touch("#{@dir1}/new.rb") dev_no_cache.stubs(:now).returns(time + 31) - refute(dev_no_cache.find('new')) + refute(dev_no_cache.find("new")) dev_yes_cache.stubs(:now).returns(time + 28) assert_raises(Bootsnap::LoadPathCache::FallbackScan) do - dev_yes_cache.find('new') + dev_yes_cache.find("new") end dev_yes_cache.stubs(:now).returns(time + 31) - assert(dev_yes_cache.find('new')) + assert(dev_yes_cache.find("new")) end def test_path_obj_equal? @@ -152,35 +153,35 @@ def test_path_obj_equal? path_obj.unshift(@dir1) - assert_equal("#{@dir1}/a.rb", cache.find('a')) + assert_equal("#{@dir1}/a.rb", cache.find("a")) end - if RUBY_VERSION >= '2.5' && !(RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/) + if RUBY_VERSION >= "2.5" && RbConfig::CONFIG["host_os"] !~ /mswin|mingw|cygwin/ # https://github.com/ruby/ruby/pull/4061 # https://bugs.ruby-lang.org/issues/17517 - OS_ASCII_PATH_ENCODING = RUBY_VERSION >= '3.1' ? Encoding::UTF_8 : Encoding::US_ASCII + OS_ASCII_PATH_ENCODING = RUBY_VERSION >= "3.1" ? Encoding::UTF_8 : Encoding::US_ASCII def test_path_encoding po = [@dir1] cache = Cache.new(NullCache, po) - path = cache.find('a') + path = cache.find("a") assert_equal("#{@dir1}/a.rb", path) require path internal_path = $LOADED_FEATURES.last assert_equal(OS_ASCII_PATH_ENCODING, internal_path.encoding) assert_equal(OS_ASCII_PATH_ENCODING, path.encoding) - File.write(path, '') + File.write(path, "") assert_same path, internal_path - utf8_path = cache.find('béé') + utf8_path = cache.find("béé") require utf8_path internal_utf8_path = $LOADED_FEATURES.last assert_equal("#{@dir1}/béé.rb", utf8_path) assert_equal(Encoding::UTF_8, internal_utf8_path.encoding) assert_equal(Encoding::UTF_8, utf8_path.encoding) - File.write(utf8_path, '') + File.write(utf8_path, "") assert_same utf8_path, internal_utf8_path end end diff --git a/test/load_path_cache/change_observer_test.rb b/test/load_path_cache/change_observer_test.rb index 2cce25e7..5882ca1e 100644 --- a/test/load_path_cache/change_observer_test.rb +++ b/test/load_path_cache/change_observer_test.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") module Bootsnap module LoadPathCache @@ -11,34 +12,34 @@ def setup end def test_observes_changes - @observer.expects(:push_paths).with(@arr, 'a') - @arr << 'a' + @observer.expects(:push_paths).with(@arr, "a") + @arr << "a" - @observer.expects(:push_paths).with(@arr, 'b', 'c') - @arr.push('b', 'c') + @observer.expects(:push_paths).with(@arr, "b", "c") + @arr.push("b", "c") - @observer.expects(:push_paths).with(@arr, 'd', 'e') - @arr.append('d', 'e') + @observer.expects(:push_paths).with(@arr, "d", "e") + @arr.append("d", "e") - @observer.expects(:unshift_paths).with(@arr, 'f', 'g') - @arr.unshift('f', 'g') + @observer.expects(:unshift_paths).with(@arr, "f", "g") + @arr.unshift("f", "g") - @observer.expects(:push_paths).with(@arr, 'h', 'i') + @observer.expects(:push_paths).with(@arr, "h", "i") @arr.concat(%w(h i)) - @observer.expects(:unshift_paths).with(@arr, 'j', 'k') - @arr.prepend('j', 'k') + @observer.expects(:unshift_paths).with(@arr, "j", "k") + @arr.prepend("j", "k") end def test_reinitializes_on_aggressive_modifications - @observer.expects(:push_paths).with(@arr, 'a', 'b', 'c') - @arr.push('a', 'b', 'c') + @observer.expects(:push_paths).with(@arr, "a", "b", "c") + @arr.push("a", "b", "c") @observer.expects(:reinitialize).times(4) @arr.delete(3) @arr.compact! @arr.map!(&:upcase) - assert_equal('C', @arr.pop) + assert_equal("C", @arr.pop) assert_equal(%w(A B), @arr) end @@ -50,8 +51,8 @@ def test_register_frozen def test_register_twice_observes_once ChangeObserver.register(@observer, @arr) - @observer.expects(:push_paths).with(@arr, 'a').once - @arr << 'a' + @observer.expects(:push_paths).with(@arr, "a").once + @arr << "a" assert_equal(%w(a), @arr) end diff --git a/test/load_path_cache/core_ext/kernel_require_test.rb b/test/load_path_cache/core_ext/kernel_require_test.rb index 2c92e399..9fc89ba4 100644 --- a/test/load_path_cache/core_ext/kernel_require_test.rb +++ b/test/load_path_cache/core_ext/kernel_require_test.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") module Bootsnap module KernelRequireTest @@ -24,10 +25,10 @@ def teardown end def test_no_exstensions_for_kernel_load - assert_raises(LoadError) { load 'a' } - assert(load 'no_ext') + assert_raises(LoadError) { load "a" } + assert(load("no_ext")) Dir.chdir(@dir2) - assert(load 'loads.rb') + assert(load("loads.rb")) end end end diff --git a/test/load_path_cache/loaded_features_index_test.rb b/test/load_path_cache/loaded_features_index_test.rb index ea8da1c2..6edd1a78 100644 --- a/test/load_path_cache/loaded_features_index_test.rb +++ b/test/load_path_cache/loaded_features_index_test.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") module Bootsnap module LoadPathCache @@ -11,35 +12,35 @@ def setup end def test_successful_addition - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.register('bundler', '/a/b/bundler.rb') {} - assert(@index.key?('bundler')) - assert(@index.key?('bundler.rb')) - refute(@index.key?('foo')) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.register("bundler", "/a/b/bundler.rb") {} + assert(@index.key?("bundler")) + assert(@index.key?("bundler.rb")) + refute(@index.key?("foo")) end def test_no_add_on_raise - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) assert_raises(RuntimeError) do - @index.register('bundler', '/a/b/bundler.rb') { raise } + @index.register("bundler", "/a/b/bundler.rb") { raise } end - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) end def test_infer_base_from_ext - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.register('bundler.rb') {} - assert(@index.key?('bundler')) - assert(@index.key?('bundler.rb')) - refute(@index.key?('foo')) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.register("bundler.rb") {} + assert(@index.key?("bundler")) + assert(@index.key?("bundler.rb")) + refute(@index.key?("foo")) end def test_only_strip_elidable_ext @@ -48,95 +49,95 @@ def test_only_strip_elidable_ext # # E.g. 'descriptor.pb.rb' if required via 'descriptor.pb' # should never be shortened to merely 'descriptor'! - refute(@index.key?('descriptor.pb')) - refute(@index.key?('descriptor.pb.rb')) - refute(@index.key?('descriptor.rb')) - refute(@index.key?('descriptor')) - refute(@index.key?('foo')) - @index.register('descriptor.pb.rb') {} - assert(@index.key?('descriptor.pb')) - assert(@index.key?('descriptor.pb.rb')) - refute(@index.key?('descriptor.rb')) - refute(@index.key?('descriptor')) - refute(@index.key?('foo')) + refute(@index.key?("descriptor.pb")) + refute(@index.key?("descriptor.pb.rb")) + refute(@index.key?("descriptor.rb")) + refute(@index.key?("descriptor")) + refute(@index.key?("foo")) + @index.register("descriptor.pb.rb") {} + assert(@index.key?("descriptor.pb")) + assert(@index.key?("descriptor.pb.rb")) + refute(@index.key?("descriptor.rb")) + refute(@index.key?("descriptor")) + refute(@index.key?("foo")) end def test_shared_library_ext_considered_elidable # Check that '.dylib' (token shared library extension) is treated as elidable, # and doesn't get mixed up with Ruby '.rb' files. - refute(@index.key?('libgit2.dylib')) - refute(@index.key?('libgit2.dylib.rb')) - refute(@index.key?('descriptor.rb')) - refute(@index.key?('descriptor')) - refute(@index.key?('foo')) - @index.register('libgit2.dylib') {} - assert(@index.key?('libgit2.dylib')) - refute(@index.key?('libgit2.dylib.rb')) - refute(@index.key?('libgit2.rb')) - refute(@index.key?('foo')) + refute(@index.key?("libgit2.dylib")) + refute(@index.key?("libgit2.dylib.rb")) + refute(@index.key?("descriptor.rb")) + refute(@index.key?("descriptor")) + refute(@index.key?("foo")) + @index.register("libgit2.dylib") {} + assert(@index.key?("libgit2.dylib")) + refute(@index.key?("libgit2.dylib.rb")) + refute(@index.key?("libgit2.rb")) + refute(@index.key?("foo")) end def test_cannot_infer_ext_from_base # Current limitation - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.register('bundler') {} - assert(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.register("bundler") {} + assert(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) end def test_purge_loaded_feature - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.register('bundler', '/a/b/bundler.rb') {} - assert(@index.key?('bundler')) - assert(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.purge('/a/b/bundler.rb') - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.register("bundler", "/a/b/bundler.rb") {} + assert(@index.key?("bundler")) + assert(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.purge("/a/b/bundler.rb") + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) end def test_purge_multi_loaded_feature - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.register('bundler', '/a/b/bundler.rb') {} - assert(@index.key?('bundler')) - assert(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.purge_multi(['/a/b/bundler.rb', '/a/b/does-not-exist.rb']) - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.register("bundler", "/a/b/bundler.rb") {} + assert(@index.key?("bundler")) + assert(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.purge_multi(["/a/b/bundler.rb", "/a/b/does-not-exist.rb"]) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) end def test_register_finds_correct_feature - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.register('bundler', nil) { $LOADED_FEATURES << '/a/b/bundler.rb' } - assert(@index.key?('bundler')) - assert(@index.key?('bundler.rb')) - refute(@index.key?('foo')) - @index.purge('/a/b/bundler.rb') - refute(@index.key?('bundler')) - refute(@index.key?('bundler.rb')) - refute(@index.key?('foo')) + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.register("bundler", nil) { $LOADED_FEATURES << "/a/b/bundler.rb" } + assert(@index.key?("bundler")) + assert(@index.key?("bundler.rb")) + refute(@index.key?("foo")) + @index.purge("/a/b/bundler.rb") + refute(@index.key?("bundler")) + refute(@index.key?("bundler.rb")) + refute(@index.key?("foo")) end def test_derives_initial_state_from_loaded_features index = LoadedFeaturesIndex.new - assert(index.key?('minitest/autorun')) - assert(index.key?('minitest/autorun.rb')) - refute(index.key?('minitest/autorun.so')) + assert(index.key?("minitest/autorun")) + assert(index.key?("minitest/autorun.rb")) + refute(index.key?("minitest/autorun.so")) end def test_works_with_pathname - path = 'bundler.rb' + path = "bundler.rb" pathname = Pathname.new(path) @index.register(pathname, path) { true } assert(@index.key?(pathname)) diff --git a/test/load_path_cache/path_scanner_test.rb b/test/load_path_cache/path_scanner_test.rb index d178a55e..fa3829fe 100644 --- a/test/load_path_cache/path_scanner_test.rb +++ b/test/load_path_cache/path_scanner_test.rb @@ -1,11 +1,12 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") module Bootsnap module LoadPathCache class PathScannerTest < MiniTest::Test - DLEXT = RbConfig::CONFIG['DLEXT'] - OTHER_DLEXT = DLEXT == 'bundle' ? 'so' : 'bundle' + DLEXT = RbConfig::CONFIG["DLEXT"] + OTHER_DLEXT = DLEXT == "bundle" ? "so" : "bundle" def test_scans_requirables_and_dirs Dir.mktmpdir do |dir| diff --git a/test/load_path_cache/path_test.rb b/test/load_path_cache/path_test.rb index aafd4fce..44f58503 100644 --- a/test/load_path_cache/path_test.rb +++ b/test/load_path_cache/path_test.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true -require('test_helper') -require('bootsnap/load_path_cache') + +require("test_helper") +require("bootsnap/load_path_cache") module Bootsnap module LoadPathCache @@ -10,17 +11,17 @@ def setup end def test_stability - require('time') + require("time") time_file = Time.method(:rfc2822).source_location[0] volatile = Path.new(__FILE__) stable = Path.new(time_file) - unknown = Path.new('/who/knows') - lib = Path.new(RbConfig::CONFIG['libdir'] + '/a') - site = Path.new(RbConfig::CONFIG['sitedir'] + '/b') - absolute_prefix = RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/ ? ENV['SystemDrive'] : '' - bundler = Path.new(absolute_prefix + '/bp/3') + unknown = Path.new("/who/knows") + lib = Path.new(RbConfig::CONFIG["libdir"] + "/a") + site = Path.new(RbConfig::CONFIG["sitedir"] + "/b") + absolute_prefix = RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/ ? ENV["SystemDrive"] : "" + bundler = Path.new(absolute_prefix + "/bp/3") - Bundler.stubs(:bundle_path).returns(absolute_prefix + '/bp') + Bundler.stubs(:bundle_path).returns(absolute_prefix + "/bp") assert(stable.stable?, "The stable path #{stable.path.inspect} was unexpectedly not stable.") refute(stable.volatile?, "The stable path #{stable.path.inspect} was unexpectedly volatile.") @@ -35,17 +36,17 @@ def test_stability end def test_non_directory? - if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/ - refute(Path.new('c:/dev').non_directory?) - refute(Path.new('c:/nope').non_directory?) + if RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/ + refute(Path.new("c:/dev").non_directory?) + refute(Path.new("c:/nope").non_directory?) # there isn't a direct analog i could think of # assert(Path.new('/dev/null').non_directory?) assert(Path.new("#{ENV['WinDir']}/System32/Drivers/Etc/hosts").non_directory?) else - refute(Path.new('/dev').non_directory?) - refute(Path.new('/nope').non_directory?) - assert(Path.new('/dev/null').non_directory?) - assert(Path.new('/etc/hosts').non_directory?) + refute(Path.new("/dev").non_directory?) + refute(Path.new("/nope").non_directory?) + assert(Path.new("/dev/null").non_directory?) + assert(Path.new("/etc/hosts").non_directory?) end end diff --git a/test/load_path_cache/realpath_cache_test.rb b/test/load_path_cache/realpath_cache_test.rb index 52b22bfa..9b0b3064 100644 --- a/test/load_path_cache/realpath_cache_test.rb +++ b/test/load_path_cache/realpath_cache_test.rb @@ -1,11 +1,11 @@ # frozen_string_literal: true -require('test_helper') +require("test_helper") module Bootsnap module LoadPathCache class RealpathCacheTest < MiniTest::Test - EXTENSIONS = ['', *CACHED_EXTENSIONS] + EXTENSIONS = ["", *CACHED_EXTENSIONS].freeze def setup @cache = RealpathCache.new @@ -16,13 +16,13 @@ def setup @symlinked_dir = "#{@base_dir}/symlink" FileUtils.ln_s(@absolute_dir, @symlinked_dir) - real_caller = File.new("#{@absolute_dir}/real_caller.rb", 'w').tap(&:close).path + real_caller = File.new("#{@absolute_dir}/real_caller.rb", "w").tap(&:close).path symlinked_caller = "#{@absolute_dir}/symlinked_caller.rb" FileUtils.ln_s(real_caller, symlinked_caller) EXTENSIONS.each do |ext| - real_required = File.new("#{@absolute_dir}/real_required#{ext}", 'w').tap(&:close).path + real_required = File.new("#{@absolute_dir}/real_required#{ext}", "w").tap(&:close).path symlinked_required = "#{@absolute_dir}/symlinked_required#{ext}" FileUtils.ln_s(real_required, symlinked_required) @@ -40,9 +40,11 @@ def remove_required(extensions) end end - variants = %w(absolute symlink).product(%w(absolute symlink), + variants = %w(absolute symlink).product( + %w(absolute symlink), %w(real_caller symlinked_caller), - %w(real_required symlinked_required)) + %w(real_required symlinked_required), + ) variants.each do |caller_dir, required_dir, caller_file, required_file| method_name = "test_with_#{caller_dir}_caller_dir_" \ diff --git a/test/load_path_cache/store_test.rb b/test/load_path_cache/store_test.rb index 4fbce665..0db2af3e 100644 --- a/test/load_path_cache/store_test.rb +++ b/test/load_path_cache/store_test.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true -require('test_helper') -require('tmpdir') -require('fileutils') + +require("test_helper") +require("tmpdir") +require("fileutils") module Bootsnap module LoadPathCache @@ -19,36 +20,36 @@ def teardown attr_reader(:store) def test_persistence - store.transaction { store.set('a', 'b') } + store.transaction { store.set("a", "b") } store2 = Store.new(@path) - assert_equal('b', store2.get('a')) + assert_equal("b", store2.get("a")) end def test_modification - store.transaction { store.set('a', 'b') } + store.transaction { store.set("a", "b") } store2 = Store.new(@path) - assert_equal('b', store2.get('a')) - store.transaction { store.set('a', 'c') } + assert_equal("b", store2.get("a")) + store.transaction { store.set("a", "c") } store3 = Store.new(@path) - assert_equal('c', store3.get('a')) + assert_equal("c", store3.get("a")) end def test_stores_arrays - store.transaction { store.set('a', [1234, %w(a b)]) } + store.transaction { store.set("a", [1234, %w(a b)]) } store2 = Store.new(@path) - assert_equal([1234, %w(a b)], store2.get('a')) + assert_equal([1234, %w(a b)], store2.get("a")) end def test_transaction_required_to_set assert_raises(Store::SetOutsideTransactionNotAllowed) do - store.set('a', 'b') + store.set("a", "b") end assert_raises(Store::SetOutsideTransactionNotAllowed) do - store.fetch('a') { 'b' } + store.fetch("a") { "b" } end end @@ -59,35 +60,35 @@ def test_nested_transaction_fails end def test_no_commit_unless_dirty - store.transaction { store.set('a', nil) } + store.transaction { store.set("a", nil) } refute(File.exist?(@path)) - store.transaction { store.set('a', 1) } + store.transaction { store.set("a", 1) } assert(File.exist?(@path)) end def test_retry_on_collision - retries = sequence('retries') + retries = sequence("retries") MessagePack.expects(:dump).in_sequence(retries).raises(Errno::EEXIST.new("File exists @ rb_sysopen")) MessagePack.expects(:dump).in_sequence(retries).returns(1) FileUtils.expects(:mv).in_sequence(retries) - store.transaction { store.set('a', 1) } + store.transaction { store.set("a", 1) } end def test_ignore_read_only_filesystem MessagePack.expects(:dump).raises(Errno::EROFS.new("Read-only file system @ rb_sysopen")) - store.transaction { store.set('a', 1) } + store.transaction { store.set("a", 1) } refute(File.exist?(@path)) end def test_bust_cache_on_ruby_change - store.transaction { store.set('a', 'b') } + store.transaction { store.set("a", "b") } - assert_equal 'b', Store.new(@path).get('a') + assert_equal "b", Store.new(@path).get("a") stub_const(Store, :CURRENT_VERSION, "foobar") do - assert_nil Store.new(@path).get('a') + assert_nil Store.new(@path).get("a") end end diff --git a/test/minimal_support/bootsnap_setup.rb b/test/minimal_support/bootsnap_setup.rb index 453e9709..80586e00 100644 --- a/test/minimal_support/bootsnap_setup.rb +++ b/test/minimal_support/bootsnap_setup.rb @@ -1,3 +1,4 @@ # frozen_string_literal: true -require('bundler/setup') -require('bootsnap/setup') + +require("bundler/setup") +require("bootsnap/setup") diff --git a/test/setup_test.rb b/test/setup_test.rb index bc1d6e93..a118907f 100644 --- a/test/setup_test.rb +++ b/test/setup_test.rb @@ -1,12 +1,13 @@ # frozen_string_literal: true -require('test_helper') + +require("test_helper") module Bootsnap class SetupTest < Minitest::Test def setup @_old_env = ENV.to_h - @tmp_dir = Dir.mktmpdir('bootsnap-test') - ENV['BOOTSNAP_CACHE_DIR'] = @tmp_dir + @tmp_dir = Dir.mktmpdir("bootsnap-test") + ENV["BOOTSNAP_CACHE_DIR"] = @tmp_dir end def teardown @@ -27,7 +28,7 @@ def test_default_setup end def test_default_setup_with_ENV_not_dev - ENV['ENV'] = 'something' + ENV["ENV"] = "something" Bootsnap.expects(:setup).with( cache_dir: @tmp_dir, @@ -42,7 +43,7 @@ def test_default_setup_with_ENV_not_dev end def test_default_setup_with_DISABLE_BOOTSNAP_LOAD_PATH_CACHE - ENV['DISABLE_BOOTSNAP_LOAD_PATH_CACHE'] = 'something' + ENV["DISABLE_BOOTSNAP_LOAD_PATH_CACHE"] = "something" Bootsnap.expects(:setup).with( cache_dir: @tmp_dir, @@ -57,7 +58,7 @@ def test_default_setup_with_DISABLE_BOOTSNAP_LOAD_PATH_CACHE end def test_default_setup_with_DISABLE_BOOTSNAP_COMPILE_CACHE - ENV['DISABLE_BOOTSNAP_COMPILE_CACHE'] = 'something' + ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"] = "something" Bootsnap.expects(:setup).with( cache_dir: @tmp_dir, @@ -72,14 +73,14 @@ def test_default_setup_with_DISABLE_BOOTSNAP_COMPILE_CACHE end def test_default_setup_with_DISABLE_BOOTSNAP - ENV['DISABLE_BOOTSNAP'] = 'something' + ENV["DISABLE_BOOTSNAP"] = "something" Bootsnap.expects(:setup).never Bootsnap.default_setup end def test_default_setup_with_BOOTSNAP_LOG - ENV['BOOTSNAP_LOG'] = 'something' + ENV["BOOTSNAP_LOG"] = "something" Bootsnap.expects(:setup).with( cache_dir: @tmp_dir, diff --git a/test/test_helper.rb b/test/test_helper.rb index 29e96095..8b7beb7d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true -$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__)) + +$LOAD_PATH.unshift(File.expand_path("../lib", __dir__)) if defined? Warning if Warning.respond_to?(:[]=) @@ -7,18 +8,18 @@ end end -require('bundler/setup') -require('bootsnap') -require('bootsnap/compile_cache/yaml') -require('bootsnap/compile_cache/json') +require("bundler/setup") +require("bootsnap") +require("bootsnap/compile_cache/yaml") +require("bootsnap/compile_cache/json") -require('tmpdir') -require('fileutils') +require("tmpdir") +require("fileutils") -require('minitest/autorun') -require('mocha/minitest') +require("minitest/autorun") +require("mocha/minitest") -cache_dir = File.expand_path('../../tmp/bootsnap/compile-cache', __FILE__) +cache_dir = File.expand_path("../tmp/bootsnap/compile-cache", __dir__) Bootsnap::CompileCache.setup(cache_dir: cache_dir, iseq: true, yaml: false, json: false) if GC.respond_to?(:verify_compaction_references) @@ -28,16 +29,16 @@ end module TestHandler - def self.input_to_storage(_i, p) - 'neato ' + p + def self.input_to_storage(_input, path) + "neato " + path end - def self.storage_to_output(d, _a) - d.upcase + def self.storage_to_output(data, _kwargs) + data.upcase end - def self.input_to_output(_d, _a) - raise('but why tho') + def self.input_to_output(_data, _kwargs) + raise("but why tho") end end @@ -67,7 +68,7 @@ def cache_path(dir, file, args_key = nil) hash ^= fnv1a_64(args_key) end - hex = hash.to_s(16).rjust(16, '0') + hex = hash.to_s(16).rjust(16, "0") "#{dir}/#{hex[0..1]}/#{hex[2..-1]}" end @@ -95,7 +96,7 @@ module TmpdirHelper def setup super @prev_dir = Dir.pwd - @tmp_dir = Dir.mktmpdir('bootsnap-test') + @tmp_dir = Dir.mktmpdir("bootsnap-test") Dir.chdir(@tmp_dir) @prev = Bootsnap::CompileCache::ISeq.cache_dir Bootsnap::CompileCache::ISeq.cache_dir = @tmp_dir diff --git a/test/worker_pool_test.rb b/test/worker_pool_test.rb index 0767037e..f7af20a0 100644 --- a/test/worker_pool_test.rb +++ b/test/worker_pool_test.rb @@ -1,20 +1,21 @@ # frozen_string_literal: true -require('test_helper') -require('bootsnap/cli') + +require("test_helper") +require("bootsnap/cli") module Bootsnap class WorkerPoolTestTest < Minitest::Test def test_dispatch - @pool = CLI::WorkerPool.create(size: 2, jobs: { touch: ->(path) { File.write(path, $$.to_s) } }) + @pool = CLI::WorkerPool.create(size: 2, jobs: {touch: ->(path) { File.write(path, Process.pid.to_s) }}) @pool.spawn - Dir.mktmpdir('bootsnap-test') do |tmpdir| + Dir.mktmpdir("bootsnap-test") do |tmpdir| 10.times do |i| @pool.push(:touch, File.join(tmpdir, i.to_s)) end @pool.shutdown - files = Dir.chdir(tmpdir) { Dir['*'] }.sort + files = Dir.chdir(tmpdir) { Dir["*"] }.sort assert_equal 10.times.map(&:to_s), files end end