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+

Gems tracked by Kettle::Rb::GemFloors get their minor series' security floor (e.g. "~> 7.1.0", ">= 7.1.6"). Exact patch versions stay pinned. A comment notes advisories that no release in the series fixes, and an exact patch version below the floor.

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)


27
28
29
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 27

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

Instance Attribute Details

#base_dir ⇒ String (readonly)

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

Returns:

  • (String) —

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



24
25
26
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 24

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)


75
76
77
78
79
80
81
82
83
84
85
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 75

def build_content(gem_name, version, sub_deps)
  lines = header_lines
  lines.concat(gem_lines(gem_name, version, pinned_requirements(gem_name, version)))

  sub_deps.each do |dep_name, dep_version|
    lines.concat(gem_lines(dep_name, dep_version, floored_requirements(dep_name, dep_version, ["~> #{dep_version}"])))
  end

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

#build_tier2_content(gem_name, version) ⇒ String

Parameters:

  • gem_name (String)
  • version (String)

Returns:

  • (String)


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

def build_tier2_content(gem_name, version)
  lines = header_lines
  lines.concat(gem_lines(gem_name, version, pinned_requirements(gem_name, version)))
  lines << ""
  "#{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



41
42
43
44
45
46
47
48
49
50
51
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 41

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



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/kettle/jem/appraisals/modular_gemfile_generator.rb', line 61

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