Module: Lutaml::Model::Schema::XmlCompiler

Extended by:
XmlCompiler
Included in:
XmlCompiler
Defined in:
lib/lutaml/model/schema/xml_compiler.rb,
lib/lutaml/model/schema/xml_compiler/spec_builder.rb,
lib/lutaml/model/schema/xml_compiler/element_order.rb,
lib/lutaml/model/schema/xml_compiler/registry_generator.rb,
lib/lutaml/model/schema/xml_compiler/spec_builder/members.rb,
lib/lutaml/model/schema/xml_compiler/supported_data_types.rb,
lib/lutaml/model/schema/xml_compiler/spec_builder/simple_types.rb,
lib/lutaml/model/schema/xml_compiler/spec_builder/complex_types.rb

Defined Under Namespace

Modules: ElementOrder, SupportedDataTypes Classes: RegistryGenerator, SpecBuilder

Constant Summary collapse

ELEMENT_ORDER_IGNORABLE =
%w[import include].freeze
XML_ADAPTER_NOT_SET_MESSAGE =
<<~MSG
  Nokogiri is not set as XML Adapter.
  Make sure Nokogiri is installed and set as XML Adapter eg.
  execute: gem install nokogiri
  require 'lutaml/xml'
  Lutaml::Model::Config.xml_adapter = :nokogiri
MSG
XML_DEFINED_ATTRIBUTES =
{
  "id" => "Lutaml::Xml::W3c::XmlIdType",
  "lang" => "Lutaml::Xml::W3c::XmlLangType",
  "space" => "Lutaml::Xml::W3c::XmlSpaceType",
  "base" => "Lutaml::Xml::W3c::XmlBaseType",
}.freeze
XML_NAMESPACE_URI =
"http://www.w3.org/XML/1998/namespace"

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#builderObject (readonly)

The SpecBuilder instance set up by as_models. Exposed so tests can introspect the walked Definitions::* hashes (e.g. XmlCompiler.builder.attributes["id"]) without re-walking.



40
41
42
# File 'lib/lutaml/model/schema/xml_compiler.rb', line 40

def builder
  @builder
end

Instance Method Details

#as_models(schema, options: {}) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/lutaml/model/schema/xml_compiler.rb', line 73

def as_models(schema, options: {})
  unless Config.xml_adapter.name.end_with?("NokogiriAdapter")
    raise Error, XML_ADAPTER_NOT_SET_MESSAGE
  end

  parsed_schema = Lutaml::Xml::Schema::Xsd.parse(
    schema, location: options[:location]
  )
  schemas = Array(parsed_schema)

  @builder = SpecBuilder.new
  @builder.populate_default_attributes
  @builder.collect_namespaces(schemas, options)
  @builder.walk_schemas(schemas)
end

#to_models(schema, options = {}) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/lutaml/model/schema/xml_compiler.rb', line 42

def to_models(schema, options = {})
  as_models(schema, options: options)
  options[:indent] = options[:indent] ? options[:indent].to_i : 2

  unless options.key?(:module_namespace)
    output_dir = options.fetch(:output_dir,
                               "lutaml_models_#{Time.now.to_i}")
    options[:module_namespace] =
      File.basename(output_dir).split("_").map(&:capitalize).join
  end

  options[:register_id] ||= :default if options[:module_namespace]

  @builder.add_supported_types
  @builder.finalize_required_files!

  output = build_output(options)

  if options[:create_files]
    dir = options.fetch(:output_dir, "lutaml_models_#{Time.now.to_i}")
    FileWriter.write(output, dir, registry_generator: RegistryGenerator)
    true
  else
    if options[:load_classes]
      ClassLoader.load(output,
                       registry_generator: RegistryGenerator)
    end
    output.sources
  end
end