Class: Kettle::Jem::Appraisals::ModularGemfileGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/kettle/jem/appraisals/modular_gemfile_generator.rb,
sig/kettle/jem/appraisals.rbs

Overview

Generates modular gemfile files for the appraisal matrix.

Creates per-version gemfiles organized by gem name and Ruby series:

+gemfiles/modular/{gem_name}/{ruby_series}/v{version}.gemfile+

Examples:

gen = ModularGemfileGenerator.new(base_dir: "/path/to/project")
gen.generate(gem_name: "activerecord", version: "7.1", ruby_series: "r3")
#=> "gemfiles/modular/activerecord/r3/v7.1.gemfile"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base_dir: Dir.pwd) ⇒ ModularGemfileGenerator

Returns a new instance of ModularGemfileGenerator.

Parameters:

  • base_dir (String) (defaults to: Dir.pwd)

    path to the project root (defaults to the current working directory)

  • base_dir: (String) (defaults to: Dir.pwd)


20
21
22
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 20

def initialize(base_dir: Dir.pwd)
  @base_dir = base_dir
end

Instance Attribute Details

#base_dirString (readonly)

Returns absolute path to the project root (where gemfiles/ lives).

Returns:

  • (String)

    absolute path to the project root (where gemfiles/ lives)



17
18
19
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 17

def base_dir
  @base_dir
end

Instance Method Details

#build_content(gem_name, version, sub_deps) ⇒ String

Parameters:

  • gem_name (String)
  • version (String)
  • sub_deps (Hash[String, String])

Returns:

  • (String)


68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 68

def build_content(gem_name, version, sub_deps)
  lines = [
    "# frozen_string_literal: true",
    "",
    "# Generated by kettle-jem-appraisals",
    "gem #{gem_name.inspect}, #{version_requirement(version).inspect}"
  ]

  sub_deps.each do |dep_name, dep_version|
    lines << "gem #{dep_name.inspect}, \"~> #{dep_version}\""
  end

  lines << ""
  "#{lines.join("\n")}\n"
end

#build_tier2_content(gem_name, version) ⇒ String

Parameters:

  • gem_name (String)
  • version (String)

Returns:

  • (String)


84
85
86
87
88
89
90
91
92
93
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 84

def build_tier2_content(gem_name, version)
  lines = [
    "# frozen_string_literal: true",
    "",
    "# Generated by kettle-jem-appraisals",
    "gem #{gem_name.inspect}, #{version_requirement(version).inspect}",
    ""
  ]
  "#{lines.join("\n")}\n"
end

#generate(gem_name:, version:, ruby_series:, sub_deps: {}) ⇒ String

Generates a modular gemfile for a tier1 gem, including its sub-dependencies.

Writes the file to disk and returns the relative path.

Parameters:

  • gem_name (String)

    tier1 gem name (e.g., "activerecord")

  • version (String)

    minor version string (e.g., "7.1")

  • ruby_series (String)

    Ruby series bucket (e.g., "r3")

  • sub_deps (Hash{String => String}) (defaults to: {})

    sub-dependency name → version constraint (e.g., {"sqlite3" => "1.6.9"})

  • gem_name: (String)
  • version: (String)
  • ruby_series: (String)
  • sub_deps: (Hash[String, String]) (defaults to: {})

Returns:

  • (String)

    the relative path to the generated gemfile



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 34

def generate(gem_name:, version:, ruby_series:, sub_deps: {})
  dir = File.join(base_dir, "gemfiles", "modular", gem_name, ruby_series)
  FileUtils.mkdir_p(dir)

  filename = "v#{version}.gemfile"
  path = File.join(dir, filename)
  content = build_content(gem_name, version, sub_deps)

  File.write(path, content)
  File.join("gemfiles", "modular", gem_name, ruby_series, filename)
end

#generate_tier2(gem_name:, version:, ruby_series:) ⇒ String

Generates a modular gemfile for a tier2 gem (no sub-dependencies).

Writes the file to disk and returns the relative path.

Parameters:

  • gem_name (String)

    tier2 gem name (e.g., "omniauth")

  • version (String)

    minor version string (e.g., "2.1")

  • ruby_series (String)

    Ruby series bucket (e.g., "r3")

  • gem_name: (String)
  • version: (String)
  • ruby_series: (String)

Returns:

  • (String)

    the relative path to the generated gemfile



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 54

def generate_tier2(gem_name:, version:, ruby_series:)
  dir = File.join(base_dir, "gemfiles", "modular", gem_name, ruby_series)
  FileUtils.mkdir_p(dir)

  filename = "v#{version}.gemfile"
  path = File.join(dir, filename)
  content = build_tier2_content(gem_name, version)

  File.write(path, content)
  File.join("gemfiles", "modular", gem_name, ruby_series, filename)
end