Class: Clacky::ExtensionScaffold::TemplateRenderer

Inherits:
Object
  • Object
show all
Defined in:
lib/clacky/extension/scaffold/template_renderer.rb

Overview

Copy a template directory into target, rendering .erb files with ERB and substituting __key__ placeholders in path segments. Non-erb files are copied byte-for-byte.

Placeholders in filenames use the __slug__ form (double underscores around the key) — any locals key can be referenced this way.

Constant Summary collapse

PATH_PLACEHOLDER =
/__([a-z_][a-z0-9_]*)__/.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(template_dir, target, locals) ⇒ TemplateRenderer

Returns a new instance of TemplateRenderer.



22
23
24
25
26
27
# File 'lib/clacky/extension/scaffold/template_renderer.rb', line 22

def initialize(template_dir, target, locals)
  @template_dir = File.expand_path(template_dir)
  @target       = target
  @locals       = locals
  @binding      = OpenStruct.new(locals).instance_eval { binding }
end

Class Method Details

.render(template_dir:, target:, locals: {}) ⇒ Object



18
19
20
# File 'lib/clacky/extension/scaffold/template_renderer.rb', line 18

def self.render(template_dir:, target:, locals: {})
  new(template_dir, target, locals).render
end

Instance Method Details

#renderObject

Raises:

  • (ArgumentError)


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/clacky/extension/scaffold/template_renderer.rb', line 29

def render
  raise ArgumentError, "template dir not found: #{@template_dir}" unless Dir.exist?(@template_dir)

  Dir.glob(File.join(@template_dir, "**", "{*,.[!.]*}"), File::FNM_DOTMATCH).sort.each do |src|
    next if [".", ".."].include?(File.basename(src))

    rel  = src.sub(/\A#{Regexp.escape(@template_dir)}\/?/, "")
    next if rel.empty?

    dest = File.join(@target, substitute_path(rel))

    if File.directory?(src)
      FileUtils.mkdir_p(dest)
    elsif File.extname(src) == ".erb"
      FileUtils.mkdir_p(File.dirname(dest))
      File.write(dest.sub(/\.erb\z/, ""), ERB.new(File.read(src), trim_mode: "-").result(@binding))
    else
      FileUtils.mkdir_p(File.dirname(dest))
      FileUtils.cp(src, dest)
    end
  end

  @target
end