Class: Uniword::Schema::ModelGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/uniword/schema/model_generator.rb

Overview

ModelGenerator generates lutaml-model classes from YAML schema definitions

This generator creates complete, proper lutaml-model classes that follow ALL architectural rules, especially Pattern 0 (attributes BEFORE xml blocks).

Examples:

Generate classes for WordProcessingML namespace

generator = ModelGenerator.new('wordprocessingml')
generator.generate_all

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(schema_name, output_dir: nil) ⇒ ModelGenerator

Returns a new instance of ModelGenerator.



18
19
20
21
22
23
24
# File 'lib/uniword/schema/model_generator.rb', line 18

def initialize(schema_name, output_dir: nil)
  @schema_name = schema_name
  @loader = SchemaLoader.instance
  @namespace_info = @loader.namespace(schema_name)
  @output_dir = output_dir || File.join(__dir__, "../../generated",
                                        schema_name)
end

Instance Attribute Details

#namespace_infoObject (readonly)

Returns the value of attribute namespace_info.



16
17
18
# File 'lib/uniword/schema/model_generator.rb', line 16

def namespace_info
  @namespace_info
end

#output_dirObject (readonly)

Returns the value of attribute output_dir.



16
17
18
# File 'lib/uniword/schema/model_generator.rb', line 16

def output_dir
  @output_dir
end

#schema_nameObject (readonly)

Returns the value of attribute schema_name.



16
17
18
# File 'lib/uniword/schema/model_generator.rb', line 16

def schema_name
  @schema_name
end

Instance Method Details

#generate_allHash

Generate all classes for this schema

Returns:

  • (Hash)

    Map of element_name => generated_file_path



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/uniword/schema/model_generator.rb', line 29

def generate_all
  element_names = @loader.element_names(schema_name)

  # Ensure output directory exists
  FileUtils.mkdir_p(@output_dir)

  results = {}
  element_names.each do |element_name|
    file_path = generate_element_class(element_name)
    results[element_name] = file_path
  end

  results
end

#generate_element_class(element_name) ⇒ String

Generate a single element class

Parameters:

  • element_name (String)

    Element XML tag name

Returns:

  • (String)

    Path to generated file



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/uniword/schema/model_generator.rb', line 48

def generate_element_class(element_name)
  element_def = @loader.element_definition(schema_name, element_name)
  raise "Element '#{element_name}' not found in schema '#{schema_name}'" unless element_def

  # Ensure output directory exists
  FileUtils.mkdir_p(@output_dir)

  class_name = element_def["class_name"]
  file_name = underscore(class_name)
  file_path = File.join(@output_dir, "#{file_name}.rb")

  code = generate_class_code(element_name, element_def)
  File.write(file_path, code)

  file_path
end