class Lutaml::Model::Schema::Decorators::DefinitionCollection
def [](name)
def [](name) @definitions[name] || raise("Definition not found: #{name}") end
def definition_class
def definition_class Lutaml::Model::Schema::Decorators::ClassDefinition end
def each(&block)
def each(&block) @definitions.each(&block) end
def find_common_base_class(class_defs)
def find_common_base_class(class_defs) return nil if class_defs.size < 2 # Get intersection of all property names common_props = class_defs.map { |klass| klass.properties.keys }.reduce(:&) return nil if common_props.empty? # Look for a class that exactly matches the common properties — assume it's the base class_defs.find do |klass| klass.properties.keys.to_set == common_props.to_set end end
def initialize(definitions_hash)
def initialize(definitions_hash) @definition_hash = definitions_hash @polymorphic_classes = [] @definitions = definitions_hash.to_h do |name, schema| definition = definition_class.new(name, schema) @polymorphic_classes << definition if definition.polymorphic? [name, definition] end resolve_polymorphic_base_types! end
def refactor_subclasses(child_classes, base_class)
def refactor_subclasses(child_classes, base_class) common_keys = base_class.properties.keys.to_set (child_classes - [base_class]).each do |child| child.base_class = base_class child.properties.reject! { |key, _| common_keys.include?(key) } base_class.sub_classes << child unless base_class.sub_classes.include?(child) end end
def resolve_child_classes(class_names)
def resolve_child_classes(class_names) class_names.filter_map { |name| @definitions[name] } end
def resolve_polymorphic_attribute(attr)
def resolve_polymorphic_attribute(attr) child_classes = resolve_child_classes(attr.polymorphic) return if child_classes.size < 2 base_class = find_common_base_class(child_classes) return unless base_class update_polymorphic_attribute(attr, base_class) refactor_subclasses(child_classes, base_class) end
def resolve_polymorphic_base_types!
def resolve_polymorphic_base_types! @polymorphic_classes.each do |poly_class| poly_class.polymorphic_attributes.each do |attr| resolve_polymorphic_attribute(attr) end end end
def transform_values(&block)
def transform_values(&block) @definitions.transform_values(&block) end
def update_polymorphic_attribute(attr, base_class)
def update_polymorphic_attribute(attr, base_class) attr.base_class = base_class attr.type = base_class.namespaced_name.gsub("_", "::") end