Class: Railstart::TemplateRunner

Inherits:
Object
  • Object
show all
Defined in:
lib/railstart/template_runner.rb

Overview

Executes Rails application templates (including RailsBytes scripts) inside a generated application directory.

Wraps Rails' own AppGenerator so existing template DSL helpers such as gem, initializer, route, etc. are available without reimplementing them in Railstart.

Instance Method Summary collapse

Constructor Details

#initialize(app_path:, generator_factory: nil, shell: Thor::Base.shell.new) ⇒ TemplateRunner

Returns a new instance of TemplateRunner.

Parameters:

  • app_path (String)

    absolute path to the Rails application

  • generator_factory (#call) (defaults to: nil)

    optional factory for injecting a generator (mainly used in tests)

  • shell (Thor::Shell) (defaults to: Thor::Base.shell.new)

    Thor shell instance for output



18
19
20
21
22
# File 'lib/railstart/template_runner.rb', line 18

def initialize(app_path:, generator_factory: nil, shell: Thor::Base.shell.new)
  @app_path = app_path
  @shell = shell
  @generator_factory = generator_factory
end

Instance Method Details

#apply(source, variables: {}) ⇒ void

This method returns an undefined value.

Apply a Rails template located at +source+.

Parameters:

  • source (String)

    file path or URL

  • variables (Hash) (defaults to: {})

    instance variables injected into the template

Raises:



31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/railstart/template_runner.rb', line 31

def apply(source, variables: {})
  raise TemplateError, "Template source must be provided" if source.to_s.strip.empty?

  generator = build_generator
  assign_variables(generator, variables)
  generator.apply(source)
rescue TemplateError
  raise
rescue LoadError => e
  raise TemplateError, "Rails must be installed to run template post-actions: #{e.message}"
rescue StandardError => e
  raise TemplateError, "Failed to apply template #{source}: #{e.message}"
end

#assign_variables(generator, variables) ⇒ Object (private)



47
48
49
50
51
# File 'lib/railstart/template_runner.rb', line 47

def assign_variables(generator, variables)
  Array(variables).each do |key, value|
    generator.instance_variable_set(:"@#{key}", value)
  end
end

#build_generatorObject (private)



53
54
55
56
57
58
59
60
61
# File 'lib/railstart/template_runner.rb', line 53

def build_generator
  generator = generator_factory.call(@app_path)
  if generator.respond_to?(:destination_root=)
    generator.destination_root = @app_path
  elsif generator.respond_to?(:destination_root)
    generator.instance_variable_set(:@destination_root, @app_path)
  end
  generator
end

#default_generator_factoryObject (private)



67
68
69
70
71
72
73
74
75
# File 'lib/railstart/template_runner.rb', line 67

def default_generator_factory
  require "rails/generators"
  require "rails/generators/rails/app/app_generator"

  shell = @shell
  lambda do |_app_path|
    Rails::Generators::AppGenerator.new([], {}, shell: shell)
  end
end

#generator_factoryObject (private)



63
64
65
# File 'lib/railstart/template_runner.rb', line 63

def generator_factory
  @generator_factory ||= default_generator_factory
end