class SimplyGenius::Atmos::Template

Constants

TEMPLATES_ACTIONS_FILE
TEMPLATES_SPEC_FILE

Attributes

context[R]
directory[R]
name[R]
source[R]

Public Class Methods

new(name, directory, source, context: {}) click to toggle source
# File lib/simplygenius/atmos/template.rb, line 15
def initialize(name, directory, source, context: {})
  @name = name
  @directory = directory
  @source = source
  @context = context
  @context = SettingsHash.new(@context) unless @context.kind_of?(SettingsHash)
end

Public Instance Methods

actions() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 48
def actions
  @actions ||= (File.exist?(actions_path) ? File.read(actions_path) : "")
end
actions_path() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 44
def actions_path
  File.join(directory, TEMPLATES_ACTIONS_FILE)
end
config() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 56
def config
  @config ||= begin
    data = File.read(config_path)
    SettingsHash.new(YAML.load(data) || {})
  end
end
config_path() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 52
def config_path
  File.join(directory, TEMPLATES_SPEC_FILE)
end
context_path() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 31
def context_path
  name.gsub('-', '_').gsub('/', '.')
end
dependencies() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 69
def dependencies
  @dependencies ||= begin
    deps = Array(config[:dependent_templates])
    deps.collect do |d|
      if d.kind_of?(String)
        tmpl = SourcePath.find_template(d)
      elsif d.kind_of?(Hash)
        raise ArgumentError.new("Template must be named with name key: #{tmpl}") unless d[:name]
        tmpl = SourcePath.find_template(d[:name])
        tmpl.context.merge!(d[:context]) if d[:context]
      else
        raise TypeError.new("Invalid template structure: #{d}")
      end

      tmpl
    end
  end
end
dup() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 88
def dup
  dependencies
  Marshal.load(Marshal.dump(self))
end
optional() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 63
def optional
  result = config[:optional] || {}
  raise TypeError.new("Template config item :optional must be a hash: #{result.inspect}") unless result.is_a?(Hash)
  result
end
scoped_context() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 35
def scoped_context
  result = context.notation_get(context_path)
  if result.nil?
    context.notation_put(context_path, SettingsHash.new, additive: false)
    result = context.notation_get(context_path)
  end
  result
end
to_h() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 27
def to_h
  SettingsHash.new({name: name, source: source.to_h, context: context})
end
to_s() click to toggle source
# File lib/simplygenius/atmos/template.rb, line 23
def to_s
  "#{name}"
end
walk_dependencies(seen=Set.new) click to toggle source

depth first iteration of dependencies

# File lib/simplygenius/atmos/template.rb, line 94
def walk_dependencies(seen=Set.new)
  Enumerator.new do |yielder|
    if seen.include?(name)
      seen << name
      raise ArgumentError.new("Circular template dependency: #{seen.to_a.join(" => ")}")
    end
    seen << name

    dependencies.each do |dep|

      dep = dep.dup
      dep.context.merge!(context)
      dep.walk_dependencies(seen.dup).each do |d|
        yielder << d
      end
    end
    yielder << dup
  end
end