Class: LcpRuby::Dsl::DslLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/lcp_ruby/dsl/dsl_loader.rb

Defined Under Namespace

Classes: EvalContext, JobEvalContext, ModelEvalContext, PresenterEvalContext, TypeEvalContext, ViewGroupEvalContext, WorkflowEvalContext

Class Method Summary collapse

Class Method Details

.load_file(file_path) ⇒ Object



104
105
106
107
108
109
110
# File 'lib/lcp_ruby/dsl/dsl_loader.rb', line 104

def self.load_file(file_path)
  context = EvalContext.new
  context.instance_eval(File.read(file_path), file_path)
  context.definitions
rescue SyntaxError => e
  raise MetadataError, "Ruby DSL syntax error in #{file_path}: #{e.message}"
end

.load_jobs(dir) ⇒ Object



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/lcp_ruby/dsl/dsl_loader.rb', line 204

def self.load_jobs(dir)
  definitions = {}
  return definitions unless dir.exist?

  Dir[dir.join("*.rb")].sort.each do |file_path|
    context = JobEvalContext.new
    context.instance_eval(File.read(file_path), file_path)
    rel_path = PathUtils.relative_path(file_path)
    context.job_definitions.each do |job_def|
      if definitions.key?(job_def.name)
        raise MetadataError,
          "Duplicate job '#{job_def.name}' in DSL files — conflict at #{file_path}"
      end
      job_def.source_path = rel_path
      job_def.source_type = "ruby"
      definitions[job_def.name] = job_def
    end
  rescue SyntaxError => e
    raise MetadataError, "Ruby DSL syntax error in #{file_path}: #{e.message}"
  end

  definitions
end

.load_model_hashes(dir) ⇒ Object

Returns raw model hashes for the inheritance resolver. Format: { name => { hash:, source_path:, source_type: } }



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/lcp_ruby/dsl/dsl_loader.rb', line 27

def self.load_model_hashes(dir)
  entries = {}
  return entries unless dir.exist?

  Dir[dir.join("*.rb")].sort.each do |file_path|
    context = ModelEvalContext.new
    context.instance_eval(File.read(file_path), file_path)
    rel_path = PathUtils.relative_path(file_path)

    context.entries.each do |entry|
      name = entry[:name]
      if entries.key?(name)
        raise MetadataError,
          "Duplicate model '#{name}' in DSL files — conflict at #{file_path}"
      end

      hash = entry[:builder].to_hash
      hash["inherits"] = entry[:inherits] if entry[:inherits]

      entries[name] = { hash: hash, source_path: rel_path, source_type: "ruby" }
    end
  rescue SyntaxError => e
    raise MetadataError, "Ruby DSL syntax error in #{file_path}: #{e.message}"
  end

  entries
end

.load_models(dir) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/lcp_ruby/dsl/dsl_loader.rb', line 55

def self.load_models(dir)
  definitions = {}
  entries = load_model_hashes(dir)
  entries.each do |name, entry|
    definition = Metadata::ModelDefinition.from_hash(entry[:hash])
    definition.source_path = entry[:source_path]
    definition.source_type = entry[:source_type]
    definitions[name] = definition
  end
  definitions
end

.load_presenters(dir) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/lcp_ruby/dsl/dsl_loader.rb', line 67

def self.load_presenters(dir)
  definitions = {}
  return definitions unless dir.exist?

  # Pass 1: Evaluate all files, collect (name, inherits, builder) tuples
  entries = []
  Dir[dir.join("*.rb")].sort.each do |file_path|
    context = PresenterEvalContext.new
    context.instance_eval(File.read(file_path), file_path)
    context.entries.each do |entry|
      entry[:source_path] = file_path
      entries << entry
    end
  rescue SyntaxError => e
    raise MetadataError, "Ruby DSL syntax error in #{file_path}: #{e.message}"
  end

  # Check for duplicates within DSL files
  seen = {}
  entries.each do |entry|
    name = entry[:name]
    if seen.key?(name)
      raise MetadataError,
        "Duplicate presenter '#{name}' in DSL files — conflict at #{entry[:source_path]}"
    end
    seen[name] = entry
  end

  # Pass 2: Resolve inheritance via topological sort
  resolved = resolve_presenter_inheritance(entries, seen)
  resolved.each do |definition|
    definitions[definition.name] = definition
  end

  definitions
end

.load_types(dir) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/lcp_ruby/dsl/dsl_loader.rb', line 4

def self.load_types(dir)
  definitions = {}
  return definitions unless dir.exist?

  Dir[dir.join("*.rb")].sort.each do |file_path|
    context = TypeEvalContext.new
    context.instance_eval(File.read(file_path), file_path)
    context.type_definitions.each do |type_def|
      if definitions.key?(type_def.name)
        raise MetadataError,
          "Duplicate type '#{type_def.name}' in DSL files — conflict at #{file_path}"
      end
      definitions[type_def.name] = type_def
    end
  rescue SyntaxError => e
    raise MetadataError, "Ruby DSL syntax error in #{file_path}: #{e.message}"
  end

  definitions
end

.load_view_groups(dir) ⇒ Object



228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/lcp_ruby/dsl/dsl_loader.rb', line 228

def self.load_view_groups(dir)
  definitions = {}
  return definitions unless dir.exist?

  Dir[dir.join("*.rb")].sort.each do |file_path|
    context = ViewGroupEvalContext.new
    context.instance_eval(File.read(file_path), file_path)
    rel_path = PathUtils.relative_path(file_path)
    context.view_group_definitions.each do |vg_def|
      if definitions.key?(vg_def.name)
        raise MetadataError,
          "Duplicate view group '#{vg_def.name}' in DSL files — conflict at #{file_path}"
      end
      vg_def.source_path = rel_path
      vg_def.source_type = "ruby"
      definitions[vg_def.name] = vg_def
    end
  rescue SyntaxError => e
    raise MetadataError, "Ruby DSL syntax error in #{file_path}: #{e.message}"
  end

  definitions
end

.load_workflows(dir) ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'lib/lcp_ruby/dsl/dsl_loader.rb', line 180

def self.load_workflows(dir)
  definitions = {}
  return definitions unless dir.exist?

  Dir[dir.join("*.rb")].sort.each do |file_path|
    context = WorkflowEvalContext.new
    context.instance_eval(File.read(file_path), file_path)
    rel_path = PathUtils.relative_path(file_path)
    context.workflow_definitions.each do |wf_def|
      if definitions.key?(wf_def.name)
        raise MetadataError,
          "Duplicate workflow '#{wf_def.name}' in DSL files — conflict at #{file_path}"
      end
      wf_def.source_path = rel_path
      wf_def.source_type = "ruby"
      definitions[wf_def.name] = wf_def
    end
  rescue SyntaxError => e
    raise MetadataError, "Ruby DSL syntax error in #{file_path}: #{e.message}"
  end

  definitions
end