Module: Kettle::Dev::ModularGemfiles
- Defined in:
- lib/kettle/dev/modular_gemfiles.rb
Overview
Utilities for copying modular Gemfiles and related directories
in a DRY fashion. Used by both the template rake task and the
setup CLI to ensure gemfiles/modular/* are present before use.
Constant Summary collapse
- MODULAR_GEMFILE_DIR =
"gemfiles/modular"
Class Method Summary collapse
-
.sync!(helpers:, project_root:, gem_checkout_root:, min_ruby: nil) ⇒ void
Copy the modular gemfiles and nested directories from the gem checkout into the target project, prompting where appropriate via the provided helpers.
Class Method Details
.sync!(helpers:, project_root:, gem_checkout_root:, min_ruby: nil) ⇒ void
This method returns an undefined value.
Copy the modular gemfiles and nested directories from the gem
checkout into the target project, prompting where appropriate
via the provided helpers.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/kettle/dev/modular_gemfiles.rb', line 22 def sync!(helpers:, project_root:, gem_checkout_root:, min_ruby: nil) # 4a) gemfiles/modular/*.gemfile except style.gemfile (handled below) # Note: `injected.gemfile` is only intended for testing this gem, and isn't even actively used there. It is not part of the template. # Note: `style.gemfile` is handled separately below. modular_gemfiles = %w[ coverage debug documentation optional runtime_heads templating x_std_libs ] modular_gemfiles.each do |base| modular_gemfile = "#{base}.gemfile" src = helpers.prefer_example(File.join(gem_checkout_root, MODULAR_GEMFILE_DIR, modular_gemfile)) dest = File.join(project_root, MODULAR_GEMFILE_DIR, modular_gemfile) helpers.copy_file_with_prompt(src, dest, allow_create: true, allow_replace: true) do |content| # Use apply_strategy for proper AST-based merging with Prism helpers.apply_strategy(content, dest) end end # 4b) gemfiles/modular/style.gemfile with dynamic rubocop constraints modular_gemfile = "style.gemfile" src = helpers.prefer_example(File.join(gem_checkout_root, MODULAR_GEMFILE_DIR, modular_gemfile)) dest = File.join(project_root, MODULAR_GEMFILE_DIR, modular_gemfile) if File.basename(src).sub(/\.example\z/, "") == "style.gemfile" helpers.copy_file_with_prompt(src, dest, allow_create: true, allow_replace: true) do |content| # Adjust rubocop-lts constraint based on min_ruby version_map = [ [Gem::Version.new("1.8"), "~> 0.1"], [Gem::Version.new("1.9"), "~> 2.0"], [Gem::Version.new("2.0"), "~> 4.0"], [Gem::Version.new("2.1"), "~> 6.0"], [Gem::Version.new("2.2"), "~> 8.0"], [Gem::Version.new("2.3"), "~> 10.0"], [Gem::Version.new("2.4"), "~> 12.0"], [Gem::Version.new("2.5"), "~> 14.0"], [Gem::Version.new("2.6"), "~> 16.0"], [Gem::Version.new("2.7"), "~> 18.0"], [Gem::Version.new("3.0"), "~> 20.0"], [Gem::Version.new("3.1"), "~> 22.0"], [Gem::Version.new("3.2"), "~> 24.0"], [Gem::Version.new("3.3"), "~> 26.0"], [Gem::Version.new("3.4"), "~> 28.0"], ] new_constraint = nil rubocop_ruby_gem_version = nil ruby1_8 = version_map.first begin if min_ruby version_map.reverse_each do |min, req| if min_ruby >= min new_constraint = req rubocop_ruby_gem_version = min.segments.join("_") break end end end if !new_constraint || !rubocop_ruby_gem_version # A gem with no declared minimum ruby is effectively >= 1.8.7 new_constraint = ruby1_8[1] rubocop_ruby_gem_version = ruby1_8[0].segments.join("_") end rescue StandardError => e Kettle::Dev.debug_error(e, __method__) if defined?(Kettle::Dev.debug_error) # ignore, use default ensure new_constraint ||= ruby1_8[1] rubocop_ruby_gem_version ||= ruby1_8[0].segments.join("_") end if new_constraint && rubocop_ruby_gem_version token = "{RUBOCOP|LTS|CONSTRAINT}" content.gsub!(token, new_constraint) if content.include?(token) token = "{RUBOCOP|RUBY|GEM}" content.gsub!(token, "rubocop-ruby#{rubocop_ruby_gem_version}") if content.include?(token) end # Use apply_strategy for proper AST-based merging with Prism helpers.apply_strategy(content, dest) end else helpers.copy_file_with_prompt(src, dest, allow_create: true, allow_replace: true) do |content| # Use apply_strategy for proper AST-based merging with Prism helpers.apply_strategy(content, dest) end end # 4c) Copy modular directories with nested/versioned files %w[erb mutex_m stringio x_std_libs].each do |dir| src_dir = File.join(gem_checkout_root, MODULAR_GEMFILE_DIR, dir) dest_dir = File.join(project_root, MODULAR_GEMFILE_DIR, dir) helpers.copy_dir_with_prompt(src_dir, dest_dir) end end |