Module: Lutaml::Model::Schema::XmlCompiler
- Extended by:
- XmlCompiler
- Included in:
- XmlCompiler
- Defined in:
- lib/lutaml/model/schema/xml_compiler.rb
Constant Summary collapse
- DEFAULT_CLASSES =
%w[string integer int boolean].freeze
- ELEMENT_ORDER_IGNORABLE =
%w[import include].freeze
- MODEL_TEMPLATE =
ERB.new("# frozen_string_literal: true\nrequire \"lutaml/model\"\n<%=\n requiring_files = resolve_required_files(content)\n if requiring_files&.any?\n requiring_files.map { |file| \"require_relative \\\\\\\"\\\#{file}\\\\\\\"\" }.join(\"\\n\") + \"\\n\"\n end\n-%>\n\nclass <%= Utils.camel_case(name) %> < <%= resolve_parent_class(content) %>\n<%=\n if content&.key_exist?(:attributes)\n output = content.attributes.map do |attribute|\n attribute = @attributes[attribute.ref_class.split(\":\").last] if attribute.key?(:ref_class)\n \" attribute :\\\#{Utils.snake_case(attribute.name)}, \\\#{resolve_attribute_class(attribute)}\\\#{resolve_attribute_default(attribute) if attribute.key_exist?(:default)}\"\n end.join(\"\\n\")\n output + \"\\n\" if output && !output&.empty?\n end\n-%>\n<%=\n if content&.key_exist?(:sequence) || content&.key_exist?(:choice) || content&.key_exist?(:group)\n output = resolve_content(content).map do |element_name, element|\n element = @elements[element.ref_class.split(\":\")&.last] if element&.key_exist?(:ref_class)\n \" attribute :\\\#{Utils.snake_case(element_name)}, \\\#{resolve_element_class(element)}\\\#{resolve_occurs(element.arguments) if element.key_exist?(:arguments)}\"\n end.join(\"\\n\")\n output + \"\\n\" if output && !output&.empty?\n end\n-%>\n<%=\n if content&.key_exist?(:complex_content)\n resolve_complex_content(content.complex_content).map do |element_name, element|\n if element_name == :attributes\n element.map { |attribute| \" attribute :\\\#{Utils.snake_case(attribute.name)}, \\\#{resolve_attribute_class(attribute)}\\\#{resolve_attribute_default(attribute.default) if attribute.key_exist?(:default)}\" }.join(\"\\n\")\n else\n element = @elements[element.ref_class.split(\":\")&.last] if element&.key_exist?(:ref_class)\n \" attribute :\\\#{Utils.snake_case(element_name)}, \\\#{resolve_element_class(element)}\\\#{resolve_occurs(element.arguments) if element.key_exist?(:arguments)}\"\n end\n end.join(\"\\n\")\n output + \"\\n\" if output && !output&.empty?\n end\n-%>\n<%= \" attribute :content, \\\#{content[:mixed] ? ':string' : content.simple_content.extension_base}\" if content_exist = (content.key_exist?(:simple_content) && content.simple_content.key_exist?(:extension_base)) || content[:mixed] -%>\n\n xml do\n root \"<%= name %>\", mixed: true\n<%= resolve_namespace(options) %>\n<%= \" map_content to: :content\\n\" if content_exist -%>\n<%=\n if content&.key_exist?(:attributes)\n output = content.attributes.map do |attribute|\n attribute = @attributes[attribute.ref_class.split(\":\").last] if attribute.key?(:ref_class)\n \" map_attribute :\\\#{Utils.snake_case(attribute.name)}, to: :\\\#{Utils.snake_case(attribute.name)}\"\n end.join(\"\\n\")\n output + \"\\n\" if output && !output&.empty?\n end\n-%>\n<%=\n if content&.key_exist?(:sequence) || content&.key_exist?(:choice) || content&.key_exist?(:group)\n output = resolve_content(content).map do |element_name, element|\n element = @elements[element.ref_class.split(\":\")&.last] if element&.key_exist?(:ref_class)\n \" map_element :\\\#{element_name}, to: :\\\#{Utils.snake_case(element_name)}\"\n end.join(\"\\n\")\n output + \"\\n\" if output && !output&.empty?\n end\n-%>\n<%=\n if content&.key_exist?(:complex_content)\n output = resolve_complex_content(content.complex_content).map do |element_name, element|\n if element_name == :attributes\n element.map { |attribute| \" map_attribute :\\\#{Utils.snake_case(attribute.name)}, to: :\\\#{Utils.snake_case(attribute.name)}\" }.join(\"\\n\")\n else\n element = @elements[element.ref_class.split(\":\")&.last] if element&.key_exist?(:ref_class)\n \" map_element :\\\#{element_name}, to: :\\\#{Utils.snake_case(element_name)}\"\n end\n end.join(\"\\n\")\n output + \"\\n\" if output && !output&.empty?\n end\n-%>\n end\nend\n\n", trim_mode: "-")
- XML_ADAPTER_NOT_SET_MESSAGE =
"Nokogiri is not set as XML Adapter.\nMake sure Nokogiri is installed and set as XML Adapter eg.\nexecute: gem install nokogiri\nrequire 'lutaml/model/adapter/nokogiri'\nLutaml::Model.xml_adapter = Lutaml::Model::Adapter::Nokogiri\n"
Instance Method Summary collapse
Instance Method Details
#to_models(schema, options = {}) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/lutaml/model/schema/xml_compiler.rb', line 109 def to_models(schema, = {}) as_models(schema, options: ) @data_types_classes = Templates::SimpleType.create_simple_types(@simple_types) if [:create_files] dir = .fetch(:output_dir, "lutaml_models_#{Time.now.to_i}") FileUtils.mkdir_p(dir) @data_types_classes.each do |name, content| create_file(name, content, dir) end @complex_types.each do |name, content| create_file(name, MODEL_TEMPLATE.result(binding), dir) end nil else simple_types = @data_types_classes.transform_keys do |key| Utils.camel_case(key.to_s) end complex_types = @complex_types.to_h do |name, content| [Utils.camel_case(name), MODEL_TEMPLATE.result(binding)] end classes_hash = simple_types.merge(complex_types) require_classes(classes_hash) if [:load_classes] classes_hash end end |