module AwsCftTools::TemplateSet::Closure

Closure-related functions for a TemplateSet.

Public Instance Methods

closed_subset(templates) click to toggle source

Provides the subset of the given templates that have no dependent templates outside the set.

@param templates [AwsCftTools::TemplateSet] @return [AwsCftTools::TemplateSet]

# File lib/aws_cft_tools/template_set/closure.rb, line 36
def closed_subset(templates)
  templates_for(@dependency_tree.closed_subset(templates.filenames))
end
closure(templates) click to toggle source

Provides the given templates and any from the set that those templates depend on.

@param templates [Array<AwsCftTools::Template>] @return [AwsCftTools::TemplateSet]

# File lib/aws_cft_tools/template_set/closure.rb, line 15
def closure(templates)
  templates_for(
    calculate_closure(templates.filenames) { |template| @dependency_tree.dependencies_for(template) }
  )
end
filenames() click to toggle source

Provides a list of filenames holding the source for the templates in a set.

@return [Array<String>]

# File lib/aws_cft_tools/template_set/closure.rb, line 26
def filenames
  map(&:filename).map(&:to_s)
end
in_folder_order(folders) click to toggle source

@param folders [Array<String>] @return [AwsCftTools::TemplateSet]

# File lib/aws_cft_tools/template_set/closure.rb, line 44
def in_folder_order(folders)
  proper_ordered_set, set = folders.reduce([clone, []]) do |memo, folder|
    set, proper_ordered_set = memo
    selected = closure(templates_in_folder(set, folder)) - proper_ordered_set
    [set - selected, proper_ordered_set | selected]
  end

  proper_ordered_set | set
end

Private Instance Methods

calculate_closure(set, &block) click to toggle source
# File lib/aws_cft_tools/template_set/closure.rb, line 60
def calculate_closure(set, &block)
  stack = set.clone

  stack += closure_step(stack.shift, set, &block) while stack.any?
  set
end
closure_step(template, set) { |template| ... } click to toggle source
# File lib/aws_cft_tools/template_set/closure.rb, line 67
def closure_step(template, set)
  [].tap do |stack|
    (yield(template) - set).each do |depedency|
      stack << depedency
      set.unshift(depedency)
    end
  end
end
templates_in_folder(set, folder) click to toggle source
# File lib/aws_cft_tools/template_set/closure.rb, line 56
def templates_in_folder(set, folder)
  set.select { |template| template.filename.to_s.start_with?(folder + '/') }
end