Class: Alki::Assembly::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/alki/assembly/builder.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBuilder

Returns a new instance of Builder.



9
10
11
12
13
14
15
# 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

Instance Attribute Details

#assembly_nameObject (readonly)

Returns the value of attribute assembly_name.



17
18
19
# File 'lib/alki/assembly/builder.rb', line 17

def assembly_name
  @assembly_name
end

#config_dirObject (readonly)

Returns the value of attribute config_dir.



17
18
19
# File 'lib/alki/assembly/builder.rb', line 17

def config_dir
  @config_dir
end

#definitionObject (readonly)

Returns the value of attribute definition.



17
18
19
# File 'lib/alki/assembly/builder.rb', line 17

def definition
  @definition
end

Class Method Details

.build(opts = {}, &blk) ⇒ Object



19
20
21
# File 'lib/alki/assembly/builder.rb', line 19

def self.build(opts={},&blk)
  new.build(opts,&blk)
end

Instance Method Details

#build(opts = {}, &blk) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 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) ⇒ Object



96
97
98
# File 'lib/alki/assembly/builder.rb', line 96

def build_assembly(blk)
  @definition = Alki::Dsl.build('alki/dsls/assembly', dsl_opts, &blk)
end

#build_classObject



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# 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_assemblyObject



92
93
94
# File 'lib/alki/assembly/builder.rb', line 92

def build_empty_assembly
  build_assembly ->{}
end

#config_prefixObject



74
75
76
77
78
79
# 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_optsObject



100
101
102
103
104
105
106
107
108
109
110
# 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_fileObject



85
86
87
88
89
90
# 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_directoryObject



81
82
83
# 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) ⇒ Object



70
71
72
# File 'lib/alki/assembly/builder.rb', line 70

def set_assembly_name(name)
  @assembly_name = name
end

#setup_project_assembly(path) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 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