class Alki::Assembly::Builder

Attributes

assembly_name[R]
config_dir[R]
definition[R]

Public Class Methods

build(opts={},&blk) click to toggle source
# File lib/alki/assembly/builder.rb, line 19
def self.build(opts={},&blk)
  new.build(opts,&blk)
end
new() click to toggle source
# File lib/alki/assembly/builder.rb, line 9
def initialize
  @config_dir = nil
  @assembly_name = nil
  @definition = nil
  @load_mode = :direct
  @primary_config = 'assembly'
end

Public Instance Methods

build(opts={},&blk) click to toggle source
# File lib/alki/assembly/builder.rb, line 23
def build(opts={},&blk)
  @load_mode = opts[:load_mode] if opts[:load_mode]
  build_assembly blk if blk
  @primary_config = opts[:primary_config] if opts[:primary_config]
  set_assembly_name opts[:name] if opts[:name]
  setup_project_assembly opts[:project_assembly] if opts[:project_assembly]
  if opts[:config_dir]
    context = if opts[:project_assembly]
      File.dirname opts[:project_assembly]
    else
      Dir.pwd
    end
    @config_dir = File.expand_path opts[:config_dir], context
  end
  register_config_directory if @config_dir
  if blk
    build_assembly blk
  else
    load_assembly_file
  end
  build_empty_assembly unless definition
  build_class
end
build_assembly(blk) click to toggle source
# File lib/alki/assembly/builder.rb, line 96
def build_assembly(blk)
  @definition = Alki::Dsl.build('alki/dsls/assembly', dsl_opts, &blk)
end
build_class() click to toggle source
# File lib/alki/assembly/builder.rb, line 112
def build_class
  definition = @definition
  name = @assembly_name
  load_class = if @load_mode == :require
    ->{ name }
  else
    ->{ self }
  end
  Alki::ClassBuilder.build(
    prefix: '',
    name: @assembly_name,
    class_modules: [Alki::Assembly],
    type: :module,
    class_methods: {
      assembly_name: {
        body: ->{
          name
        }
      },
      definition: {
        body: ->{
          Alki.load definition
        }
      },
      load_class: {
        body: load_class
      }
    }
  )
end
build_empty_assembly() click to toggle source
# File lib/alki/assembly/builder.rb, line 92
def build_empty_assembly
  build_assembly ->{}
end
config_prefix() click to toggle source
# File lib/alki/assembly/builder.rb, line 74
def config_prefix
  unless @assembly_name
    raise "Can't use config directory without a name"
  end
  File.join(@assembly_name,'assembly_config')
end
dsl_opts() click to toggle source
# File lib/alki/assembly/builder.rb, line 100
def dsl_opts
  opts = {}
  if @assembly_name
    opts[:assembly_name] = @assembly_name
    if @config_dir
      opts[:config_dir] = @config_dir
      opts[:prefix] = config_prefix
    end
  end
  opts
end
load_assembly_file() click to toggle source
# File lib/alki/assembly/builder.rb, line 85
def load_assembly_file
  if @config_dir
    @definition = File.join(config_prefix,@primary_config)
    true
  end
end
register_config_directory() click to toggle source
# File lib/alki/assembly/builder.rb, line 81
def register_config_directory
  Alki::Loader.register @config_dir, builder: 'alki/dsls/assembly', name: config_prefix, **dsl_opts
end
set_assembly_name(name) click to toggle source
# File lib/alki/assembly/builder.rb, line 70
def set_assembly_name(name)
  @assembly_name = name
end
setup_project_assembly(path) click to toggle source
# File lib/alki/assembly/builder.rb, line 47
def setup_project_assembly(path)
  root = Alki::Support.find_root(path) do |dir|
    File.exist?(File.join(dir,'config',"#{@primary_config}.rb")) ||
      File.exist?(File.join(dir,'Gemfile')) ||
      !Dir.glob(File.join(dir,'*.gemspec')).empty?
  end
  if root
    unless @assembly_name
      lib_dir = File.join(root,'lib')
      name = Alki::Support.path_name path, lib_dir
      unless name
        raise "Can't auto-detect name of assembly"
      end
      set_assembly_name name
    end

    unless @config_dir
      config_dir = File.join(root,'config')
      @config_dir = config_dir if File.exist? config_dir
    end
  end
end