glossarist 2.3.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +65 -0
- data/README.adoc +2 -2
- data/config.yml +1 -1
- data/glossarist.gemspec +1 -0
- data/lib/glossarist/asset.rb +4 -9
- data/lib/glossarist/citation.rb +73 -41
- data/lib/glossarist/collection.rb +2 -11
- data/lib/glossarist/collections/asset_collection.rb +0 -3
- data/lib/glossarist/collections/bibliography_collection.rb +1 -1
- data/lib/glossarist/concept.rb +67 -206
- data/lib/glossarist/concept_data.rb +66 -0
- data/lib/glossarist/concept_date.rb +7 -11
- data/lib/glossarist/concept_manager.rb +19 -29
- data/lib/glossarist/concept_set.rb +6 -4
- data/lib/glossarist/concept_source.rb +15 -58
- data/lib/glossarist/config.rb +4 -4
- data/lib/glossarist/designation/abbreviation.rb +15 -16
- data/lib/glossarist/designation/base.rb +16 -15
- data/lib/glossarist/designation/expression.rb +18 -26
- data/lib/glossarist/designation/grammar_info.rb +29 -45
- data/lib/glossarist/designation/graphical_symbol.rb +12 -8
- data/lib/glossarist/designation/letter_symbol.rb +13 -11
- data/lib/glossarist/designation/symbol.rb +11 -13
- data/lib/glossarist/designation.rb +3 -3
- data/lib/glossarist/detailed_definition.rb +6 -24
- data/lib/glossarist/error.rb +4 -4
- data/lib/glossarist/glossary_definition.rb +6 -3
- data/lib/glossarist/localized_concept.rb +17 -62
- data/lib/glossarist/managed_concept.rb +74 -146
- data/lib/glossarist/managed_concept_collection.rb +15 -24
- data/lib/glossarist/managed_concept_data.rb +47 -0
- data/lib/glossarist/non_verb_rep.rb +10 -13
- data/lib/glossarist/related_concept.rb +14 -21
- data/lib/glossarist/utilities/uuid.rb +10 -5
- data/lib/glossarist/utilities.rb +0 -2
- data/lib/glossarist/version.rb +1 -1
- data/lib/glossarist.rb +10 -9
- metadata +23 -13
- data/lib/glossarist/model.rb +0 -40
- data/lib/glossarist/utilities/boolean_attributes.rb +0 -35
- data/lib/glossarist/utilities/enum/class_methods.rb +0 -99
- data/lib/glossarist/utilities/enum/enum_collection.rb +0 -45
- data/lib/glossarist/utilities/enum/instance_methods.rb +0 -55
- data/lib/glossarist/utilities/enum.rb +0 -21
- data/lib/glossarist/v1_reader.rb +0 -28
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            module Glossarist
         | 
| 2 | 
            +
              class ConceptData < Lutaml::Model::Serializable
         | 
| 3 | 
            +
                include Glossarist::Utilities::CommonFunctions
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                attribute :dates, ConceptDate, collection: true
         | 
| 6 | 
            +
                attribute :definition, DetailedDefinition, collection: true
         | 
| 7 | 
            +
                attribute :examples, DetailedDefinition, collection: true
         | 
| 8 | 
            +
                attribute :id, :string
         | 
| 9 | 
            +
                attribute :lineage_source_similarity, :integer
         | 
| 10 | 
            +
                attribute :notes, DetailedDefinition, collection: true
         | 
| 11 | 
            +
                attribute :release, :string
         | 
| 12 | 
            +
                attribute :sources, ConceptSource, collection: true
         | 
| 13 | 
            +
                attribute :terms, Designation::Base, collection: true
         | 
| 14 | 
            +
                attribute :related, RelatedConcept, collection: true
         | 
| 15 | 
            +
                attribute :domain, :string
         | 
| 16 | 
            +
                attribute :review_date, :date_time
         | 
| 17 | 
            +
                attribute :review_decision_date, :date_time
         | 
| 18 | 
            +
                attribute :review_decision_event, :string
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # Concept Methods
         | 
| 21 | 
            +
                # Language code should be exactly 3 char long.
         | 
| 22 | 
            +
                # TODO: use min_length, max_length once added in lutaml-model
         | 
| 23 | 
            +
                attribute :language_code, :string, pattern: /^.{3}$/
         | 
| 24 | 
            +
                attribute :entry_status, :string
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                yaml do
         | 
| 27 | 
            +
                  map :dates, to: :dates
         | 
| 28 | 
            +
                  map :definition, to: :definition, render_nil: true
         | 
| 29 | 
            +
                  map :examples, to: :examples, render_nil: true
         | 
| 30 | 
            +
                  map :id, to: :id
         | 
| 31 | 
            +
                  map :lineage_source_similarity, to: :lineage_source_similarity
         | 
| 32 | 
            +
                  map :notes, to: :notes, render_nil: true
         | 
| 33 | 
            +
                  map :release, to: :release
         | 
| 34 | 
            +
                  map :sources, to: :sources
         | 
| 35 | 
            +
                  map :terms, to: :terms,
         | 
| 36 | 
            +
                              with: { from: :terms_from_yaml, to: :terms_to_yaml }
         | 
| 37 | 
            +
                  map :related, to: :related
         | 
| 38 | 
            +
                  map :domain, to: :domain
         | 
| 39 | 
            +
                  map :language_code, to: :language_code
         | 
| 40 | 
            +
                  map :entry_status, to: :entry_status
         | 
| 41 | 
            +
                  map :review_date, to: :review_date
         | 
| 42 | 
            +
                  map :review_decision_date, to: :review_decision_date
         | 
| 43 | 
            +
                  map :review_decision_event, to: :review_decision_event
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def terms_from_yaml(model, value)
         | 
| 47 | 
            +
                  model.terms = value.map { |v| Designation::Base.of_yaml(v) }
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def terms_to_yaml(model, doc)
         | 
| 51 | 
            +
                  doc["terms"] = model.terms.map(&:to_yaml_hash)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                def date_accepted
         | 
| 55 | 
            +
                  return nil unless dates
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  dates.find(&:accepted?)
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                def authoritative_source
         | 
| 61 | 
            +
                  return [] unless sources
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  sources.select(&:authoritative?)
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
            end
         | 
| @@ -1,20 +1,16 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            module Glossarist
         | 
| 4 | 
            -
              class ConceptDate < Model
         | 
| 5 | 
            -
                include Glossarist::Utilities::Enum
         | 
| 6 | 
            -
             | 
| 4 | 
            +
              class ConceptDate < Lutaml::Model::Serializable
         | 
| 7 5 | 
             
                # Iso8601 date
         | 
| 8 6 | 
             
                # @return [String]
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 7 | 
            +
                attribute :date, :date_time
         | 
| 8 | 
            +
                attribute :type, :string,
         | 
| 9 | 
            +
                          values: Glossarist::GlossaryDefinition::CONCEPT_DATE_TYPES
         | 
| 12 10 |  | 
| 13 | 
            -
                 | 
| 14 | 
            -
                   | 
| 15 | 
            -
             | 
| 16 | 
            -
                    "type" => type,
         | 
| 17 | 
            -
                  }.compact
         | 
| 11 | 
            +
                yaml do
         | 
| 12 | 
            +
                  map :date, to: :date
         | 
| 13 | 
            +
                  map :type, to: :type
         | 
| 18 14 | 
             
                end
         | 
| 19 15 | 
             
              end
         | 
| 20 16 | 
             
            end
         | 
| @@ -1,44 +1,35 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            module Glossarist
         | 
| 4 | 
            -
              class ConceptManager
         | 
| 5 | 
            -
                 | 
| 6 | 
            -
                 | 
| 7 | 
            -
             | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
                #   concepts directory path, either absolute or relative to CWD
         | 
| 12 | 
            -
                def initialize(path: nil)
         | 
| 13 | 
            -
                  @path = path
         | 
| 2 | 
            +
              class ConceptManager < Lutaml::Model::Serializable
         | 
| 3 | 
            +
                attribute :path, :string
         | 
| 4 | 
            +
                attribute :localized_concepts_path, :string
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                yaml do
         | 
| 7 | 
            +
                  map :path, to: :path
         | 
| 8 | 
            +
                  map :localized_concepts_path, to: :localized_concepts_path
         | 
| 14 9 | 
             
                end
         | 
| 15 10 |  | 
| 16 | 
            -
                # Reads all concepts from files.
         | 
| 17 11 | 
             
                def load_from_files(collection: nil)
         | 
| 18 12 | 
             
                  collection ||= ManagedConceptCollection.new
         | 
| 19 13 |  | 
| 20 14 | 
             
                  Dir.glob(concepts_glob) do |filename|
         | 
| 21 | 
            -
                    concept =  | 
| 22 | 
            -
                                Glossarist::V1Reader.load_concept_from_file(filename)
         | 
| 23 | 
            -
                              else
         | 
| 24 | 
            -
                                load_concept_from_file(filename)
         | 
| 25 | 
            -
                              end
         | 
| 15 | 
            +
                    concept = load_concept_from_file(filename)
         | 
| 26 16 |  | 
| 27 17 | 
             
                    collection.store(concept)
         | 
| 28 18 | 
             
                  end
         | 
| 29 19 | 
             
                end
         | 
| 30 20 |  | 
| 31 | 
            -
                # Writes all concepts to files.
         | 
| 32 21 | 
             
                def save_to_files(managed_concepts)
         | 
| 33 | 
            -
                  managed_concepts. | 
| 22 | 
            +
                  managed_concepts.each &method(:save_concept_to_file)
         | 
| 34 23 | 
             
                end
         | 
| 35 24 |  | 
| 36 25 | 
             
                def load_concept_from_file(filename)
         | 
| 37 | 
            -
                  concept_hash = Psych.safe_load(File.read(filename), | 
| 26 | 
            +
                  concept_hash = Psych.safe_load(File.read(filename),
         | 
| 27 | 
            +
                                                 permitted_classes: [Date, Time])
         | 
| 38 28 | 
             
                  concept_hash["uuid"] = concept_hash["id"] || File.basename(filename, ".*")
         | 
| 39 29 |  | 
| 40 | 
            -
                  concept = Config.class_for(:managed_concept). | 
| 41 | 
            -
             | 
| 30 | 
            +
                  concept = Config.class_for(:managed_concept).of_yaml(concept_hash)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  concept.data.localized_concepts.each_value do |id|
         | 
| 42 33 | 
             
                    localized_concept = load_localized_concept(id)
         | 
| 43 34 | 
             
                    concept.add_l10n(localized_concept)
         | 
| 44 35 | 
             
                  end
         | 
| @@ -55,7 +46,7 @@ module Glossarist | |
| 55 46 | 
             
                  )
         | 
| 56 47 | 
             
                  concept_hash["uuid"] = id
         | 
| 57 48 |  | 
| 58 | 
            -
                  Config.class_for(:localized_concept). | 
| 49 | 
            +
                  Config.class_for(:localized_concept).of_yaml(concept_hash)
         | 
| 59 50 | 
             
                rescue Psych::SyntaxError => e
         | 
| 60 51 | 
             
                  raise Glossarist::ParseError.new(filename: filename, line: e.line)
         | 
| 61 52 | 
             
                end
         | 
| @@ -70,16 +61,14 @@ module Glossarist | |
| 70 61 | 
             
                  Dir.mkdir(localized_concept_dir) unless Dir.exist?(localized_concept_dir)
         | 
| 71 62 |  | 
| 72 63 | 
             
                  filename = File.join(concept_dir, "#{concept.uuid}.yaml")
         | 
| 73 | 
            -
                  File.write(filename,  | 
| 64 | 
            +
                  File.write(filename, concept.to_yaml)
         | 
| 74 65 |  | 
| 75 66 | 
             
                  concept.localized_concepts.each do |lang, uuid|
         | 
| 76 67 | 
             
                    filename = File.join(localized_concept_dir, "#{uuid}.yaml")
         | 
| 77 | 
            -
                    File.write(filename,  | 
| 68 | 
            +
                    File.write(filename, concept.localization(lang).to_yaml)
         | 
| 78 69 | 
             
                  end
         | 
| 79 70 | 
             
                end
         | 
| 80 71 |  | 
| 81 | 
            -
                private
         | 
| 82 | 
            -
             | 
| 83 72 | 
             
                def concepts_glob
         | 
| 84 73 | 
             
                  if v1_collection?
         | 
| 85 74 | 
             
                    File.join(path, "concept-*.{yaml,yml}")
         | 
| @@ -116,7 +105,8 @@ module Glossarist | |
| 116 105 | 
             
                end
         | 
| 117 106 |  | 
| 118 107 | 
             
                def v1_collection?
         | 
| 119 | 
            -
                  @v1_collection ||= !Dir.glob(File.join(path, | 
| 108 | 
            +
                  @v1_collection ||= !Dir.glob(File.join(path,
         | 
| 109 | 
            +
                                                         "concept-*.{yaml,yml}")).empty?
         | 
| 120 110 | 
             
                end
         | 
| 121 111 | 
             
              end
         | 
| 122 112 | 
             
            end
         | 
| @@ -1,5 +1,7 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require "set"
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            module Glossarist
         | 
| 4 6 | 
             
              class ConceptSet
         | 
| 5 7 | 
             
                # a `Glossarist::ManagedConceptCollection` object
         | 
| @@ -40,7 +42,7 @@ module Glossarist | |
| 40 42 | 
             
                    concept = concept_map[concept_name.strip.downcase]
         | 
| 41 43 |  | 
| 42 44 | 
             
                    if concept.nil?
         | 
| 43 | 
            -
             | 
| 45 | 
            +
                      puts "  [Not Found]: #{concept_name.strip}"
         | 
| 44 46 | 
             
                    else
         | 
| 45 47 | 
             
                      latex_template(concept)
         | 
| 46 48 | 
             
                    end
         | 
| @@ -57,7 +59,7 @@ module Glossarist | |
| 57 59 |  | 
| 58 60 | 
             
                def latex_template(concept)
         | 
| 59 61 | 
             
                  <<~TEMPLATE
         | 
| 60 | 
            -
                    \\newglossaryentry{#{concept.default_designation. | 
| 62 | 
            +
                    \\newglossaryentry{#{concept.default_designation.tr('_', '-')}}
         | 
| 61 63 | 
             
                    {
         | 
| 62 64 | 
             
                    name={#{concept.default_designation.gsub('_', '\_')}}
         | 
| 63 65 | 
             
                    description={#{normalize_definition(concept.default_definition)}}
         | 
| @@ -66,8 +68,8 @@ module Glossarist | |
| 66 68 | 
             
                end
         | 
| 67 69 |  | 
| 68 70 | 
             
                def normalize_definition(definition)
         | 
| 69 | 
            -
                  definition.gsub(/{{([^}]*)}}/) do | | 
| 70 | 
            -
                    "\\textbf{\\gls{#{Regexp.last_match[1]. | 
| 71 | 
            +
                  definition.gsub(/{{([^}]*)}}/) do |_match|
         | 
| 72 | 
            +
                    "\\textbf{\\gls{#{Regexp.last_match[1].tr('_', '-')}}}"
         | 
| 71 73 | 
             
                  end
         | 
| 72 74 | 
             
                end
         | 
| 73 75 |  | 
| @@ -1,62 +1,19 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            module Glossarist
         | 
| 4 | 
            -
              class ConceptSource < Model
         | 
| 5 | 
            -
                 | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
                 | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
                 | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
                   | 
| 18 | 
            -
             | 
| 19 | 
            -
                    self.modification = rel["modification"]
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  self.origin = slice_keys(attributes, ref_param_names)
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  remaining_attributes = attributes.dup
         | 
| 25 | 
            -
                  ref_param_names.each { |k| remaining_attributes.delete(k) }
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                  super(remaining_attributes)
         | 
| 28 | 
            -
                end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                def origin=(origin)
         | 
| 31 | 
            -
                  @origin = Citation.new(origin)
         | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                alias_method :ref=, :origin=
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                def to_h
         | 
| 37 | 
            -
                  origin_hash = self.origin.to_h.empty? ? nil : self.origin.to_h
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                  {
         | 
| 40 | 
            -
                    "origin" => origin_hash,
         | 
| 41 | 
            -
                    "type" => type.to_s,
         | 
| 42 | 
            -
                    "status" => status&.to_s,
         | 
| 43 | 
            -
                    "modification" => modification,
         | 
| 44 | 
            -
                  }.compact
         | 
| 45 | 
            -
                end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                private
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                def ref_param_names
         | 
| 50 | 
            -
                  %w[
         | 
| 51 | 
            -
                    ref
         | 
| 52 | 
            -
                    text
         | 
| 53 | 
            -
                    source
         | 
| 54 | 
            -
                    id
         | 
| 55 | 
            -
                    version
         | 
| 56 | 
            -
                    clause
         | 
| 57 | 
            -
                    link
         | 
| 58 | 
            -
                    original
         | 
| 59 | 
            -
                  ]
         | 
| 2 | 
            +
              class ConceptSource < Lutaml::Model::Serializable
         | 
| 3 | 
            +
                attribute :status, :string,
         | 
| 4 | 
            +
                          values: Glossarist::GlossaryDefinition::CONCEPT_SOURCE_STATUSES
         | 
| 5 | 
            +
                attribute :type, :string,
         | 
| 6 | 
            +
                          values: Glossarist::GlossaryDefinition::CONCEPT_SOURCE_TYPES
         | 
| 7 | 
            +
                attribute :origin, Citation
         | 
| 8 | 
            +
                attribute :modification, :string
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                yaml do
         | 
| 11 | 
            +
                  # TODO: change to `map [:ref, :origin], to: :origin
         | 
| 12 | 
            +
                  #       when multiple key mapping is supported in lutaml-model
         | 
| 13 | 
            +
                  map :origin, to: :origin
         | 
| 14 | 
            +
                  map :status, to: :status
         | 
| 15 | 
            +
                  map :type, to: :type
         | 
| 16 | 
            +
                  map :modification, to: :modification
         | 
| 60 17 | 
             
                end
         | 
| 61 18 | 
             
              end
         | 
| 62 19 | 
             
            end
         | 
    
        data/lib/glossarist/config.rb
    CHANGED
    
    | @@ -42,19 +42,19 @@ module Glossarist | |
| 42 42 |  | 
| 43 43 | 
             
                class << self
         | 
| 44 44 | 
             
                  def class_for(name)
         | 
| 45 | 
            -
                     | 
| 45 | 
            +
                    instance.class_for(name)
         | 
| 46 46 | 
             
                  end
         | 
| 47 47 |  | 
| 48 48 | 
             
                  def extension_attributes
         | 
| 49 | 
            -
                     | 
| 49 | 
            +
                    instance.extension_attributes
         | 
| 50 50 | 
             
                  end
         | 
| 51 51 |  | 
| 52 52 | 
             
                  def register_class(class_name, klass)
         | 
| 53 | 
            -
                     | 
| 53 | 
            +
                    instance.register_class(class_name, klass)
         | 
| 54 54 | 
             
                  end
         | 
| 55 55 |  | 
| 56 56 | 
             
                  def register_extension_attributes(attributes)
         | 
| 57 | 
            -
                     | 
| 57 | 
            +
                    instance.register_extension_attributes(attributes)
         | 
| 58 58 | 
             
                  end
         | 
| 59 59 | 
             
                end
         | 
| 60 60 | 
             
              end
         | 
| @@ -1,26 +1,25 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require_relative "expression"
         | 
| 4 | 
            -
            require_relative "../utilities"
         | 
| 5 | 
            -
             | 
| 6 1 | 
             
            module Glossarist
         | 
| 7 2 | 
             
              module Designation
         | 
| 8 3 | 
             
                class Abbreviation < Expression
         | 
| 9 | 
            -
                   | 
| 10 | 
            -
             | 
| 11 | 
            -
                  register_enum :type, Glossarist::GlossaryDefinition::ABBREVIATION_TYPES
         | 
| 4 | 
            +
                  attribute :international, :boolean
         | 
| 5 | 
            +
                  attribute :type, :string, default: -> { "abbreviation" }
         | 
| 12 6 |  | 
| 13 | 
            -
                   | 
| 7 | 
            +
                  Glossarist::GlossaryDefinition::ABBREVIATION_TYPES.each do |name|
         | 
| 8 | 
            +
                    attribute name.to_sym, :boolean
         | 
| 9 | 
            +
                  end
         | 
| 14 10 |  | 
| 15 | 
            -
                   | 
| 16 | 
            -
                     | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 11 | 
            +
                  yaml do
         | 
| 12 | 
            +
                    map :international, to: :international
         | 
| 13 | 
            +
                    map :type, to: :type, render_default: true
         | 
| 14 | 
            +
                    Glossarist::GlossaryDefinition::ABBREVIATION_TYPES.each do |name|
         | 
| 15 | 
            +
                      map name.to_sym, to: name.to_sym
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                  end
         | 
| 20 18 |  | 
| 21 | 
            -
             | 
| 19 | 
            +
                  def self.of_yaml(hash, options = {})
         | 
| 20 | 
            +
                    hash["type"] = "abbreviation" unless hash["type"]
         | 
| 22 21 |  | 
| 23 | 
            -
                    super | 
| 22 | 
            +
                    super
         | 
| 24 23 | 
             
                  end
         | 
| 25 24 | 
             
                end
         | 
| 26 25 | 
             
              end
         | 
| @@ -1,35 +1,36 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            module Glossarist
         | 
| 4 2 | 
             
              module Designation
         | 
| 5 | 
            -
                class Base < Model
         | 
| 6 | 
            -
                   | 
| 7 | 
            -
             | 
| 8 | 
            -
                   | 
| 9 | 
            -
             | 
| 10 | 
            -
                   | 
| 3 | 
            +
                class Base < Lutaml::Model::Serializable
         | 
| 4 | 
            +
                  attribute :designation, :string
         | 
| 5 | 
            +
                  attribute :geographical_area, :string
         | 
| 6 | 
            +
                  attribute :normative_status, :string,
         | 
| 7 | 
            +
                            values: Glossarist::GlossaryDefinition::DESIGNATION_BASE_NORMATIVE_STATUSES
         | 
| 8 | 
            +
                  attribute :type, :string
         | 
| 11 9 |  | 
| 12 | 
            -
                   | 
| 13 | 
            -
             | 
| 10 | 
            +
                  yaml do
         | 
| 11 | 
            +
                    map :type, to: :type
         | 
| 12 | 
            +
                    map :normative_status, to: :normative_status
         | 
| 13 | 
            +
                    map :geographical_area, to: :geographical_area
         | 
| 14 | 
            +
                    map :designation, to: :designation
         | 
| 15 | 
            +
                  end
         | 
| 14 16 |  | 
| 15 | 
            -
                  def self. | 
| 17 | 
            +
                  def self.of_yaml(hash, options = {})
         | 
| 16 18 | 
             
                    type = hash["type"]
         | 
| 17 19 |  | 
| 18 20 | 
             
                    if type.nil? || /\w/ !~ type
         | 
| 19 21 | 
             
                      raise ArgumentError, "designation type is missing"
         | 
| 20 22 | 
             
                    end
         | 
| 21 23 |  | 
| 22 | 
            -
                    designation_subclass = SERIALIZED_TYPES[type]
         | 
| 23 | 
            -
             | 
| 24 24 | 
             
                    if self == Base
         | 
| 25 25 | 
             
                      # called on Base class, delegate it to proper subclass
         | 
| 26 | 
            -
                      SERIALIZED_TYPES[type]. | 
| 26 | 
            +
                      SERIALIZED_TYPES[type].of_yaml(hash)
         | 
| 27 27 | 
             
                    else
         | 
| 28 28 | 
             
                      # called on subclass, instantiate object
         | 
| 29 29 | 
             
                      unless SERIALIZED_TYPES[self] == type
         | 
| 30 30 | 
             
                        raise ArgumentError, "unexpected designation type: #{type}"
         | 
| 31 31 | 
             
                      end
         | 
| 32 | 
            -
             | 
| 32 | 
            +
             | 
| 33 | 
            +
                      super(hash, options)
         | 
| 33 34 | 
             
                    end
         | 
| 34 35 | 
             
                  end
         | 
| 35 36 | 
             
                end
         | 
| @@ -1,24 +1,26 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            require_relative "base"
         | 
| 2 | 
            +
            require_relative "grammar_info"
         | 
| 4 3 |  | 
| 5 4 | 
             
            module Glossarist
         | 
| 6 5 | 
             
              module Designation
         | 
| 7 6 | 
             
                class Expression < Base
         | 
| 8 | 
            -
                   | 
| 9 | 
            -
                   | 
| 10 | 
            -
             | 
| 11 | 
            -
                   | 
| 12 | 
            -
                   | 
| 13 | 
            -
                   | 
| 14 | 
            -
             | 
| 15 | 
            -
                   | 
| 16 | 
            -
             | 
| 7 | 
            +
                  attribute :prefix, :string
         | 
| 8 | 
            +
                  attribute :usage_info, :string
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  attribute :gender, :string
         | 
| 11 | 
            +
                  attribute :plurality, :string
         | 
| 12 | 
            +
                  attribute :part_of_speech, :string
         | 
| 13 | 
            +
                  attribute :grammar_info, GrammarInfo, collection: true
         | 
| 14 | 
            +
                  attribute :type, :string, default: -> { "expression" }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  yaml do
         | 
| 17 | 
            +
                    map :type, to: :type, render_default: true
         | 
| 18 | 
            +
                    map :prefix, to: :prefix
         | 
| 19 | 
            +
                    map :usage_info, to: :usage_info
         | 
| 20 | 
            +
                    map :grammar_info, to: :grammar_info
         | 
| 17 21 | 
             
                  end
         | 
| 18 22 |  | 
| 19 | 
            -
                   | 
| 20 | 
            -
                  #   might be removed in the future.
         | 
| 21 | 
            -
                  def self.from_h(hash)
         | 
| 23 | 
            +
                  def self.of_yaml(hash, options = {})
         | 
| 22 24 | 
             
                    gender = hash.delete("gender") || hash.delete(:gender)
         | 
| 23 25 | 
             
                    number = hash.delete("plurality") || hash.delete(:plurality)
         | 
| 24 26 | 
             
                    part_of_speech = hash.delete("part_of_speech") || hash.delete(:part_of_speech)
         | 
| @@ -31,19 +33,9 @@ module Glossarist | |
| 31 33 | 
             
                      }.compact]
         | 
| 32 34 | 
             
                    end
         | 
| 33 35 |  | 
| 34 | 
            -
                     | 
| 35 | 
            -
                  end
         | 
| 36 | 
            +
                    hash["type"] = "expression" unless hash["type"]
         | 
| 36 37 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
                    {
         | 
| 39 | 
            -
                      "type" => "expression",
         | 
| 40 | 
            -
                      "prefix" => prefix,
         | 
| 41 | 
            -
                      "normative_status" => normative_status,
         | 
| 42 | 
            -
                      "usage_info" => usage_info,
         | 
| 43 | 
            -
                      "designation" => designation,
         | 
| 44 | 
            -
                      "geographical_area" => geographical_area,
         | 
| 45 | 
            -
                      "grammar_info" => grammar_info&.map(&:to_h),
         | 
| 46 | 
            -
                    }.compact
         | 
| 38 | 
            +
                    super(hash, options)
         | 
| 47 39 | 
             
                  end
         | 
| 48 40 | 
             
                end
         | 
| 49 41 | 
             
              end
         | 
| @@ -1,57 +1,41 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require_relative "../utilities"
         | 
| 4 | 
            -
             | 
| 5 1 | 
             
            module Glossarist
         | 
| 6 2 | 
             
              module Designation
         | 
| 7 | 
            -
                class GrammarInfo
         | 
| 8 | 
            -
                   | 
| 9 | 
            -
             | 
| 10 | 
            -
                   | 
| 11 | 
            -
             | 
| 12 | 
            -
                   | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                   | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 3 | 
            +
                class GrammarInfo < Lutaml::Model::Serializable
         | 
| 4 | 
            +
                  attribute :gender, :string,
         | 
| 5 | 
            +
                            values: Glossarist::GlossaryDefinition::GRAMMAR_INFO_GENDERS, collection: true
         | 
| 6 | 
            +
                  attribute :number, :string,
         | 
| 7 | 
            +
                            values: Glossarist::GlossaryDefinition::GRAMMAR_INFO_NUMBERS, collection: true
         | 
| 8 | 
            +
                  attribute :part_of_speech, :string,
         | 
| 9 | 
            +
                            values: Glossarist::GlossaryDefinition::GRAMMAR_INFO_BOOLEAN_ATTRIBUTES
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  yaml do
         | 
| 12 | 
            +
                    map :gender, to: :gender
         | 
| 13 | 
            +
                    map :number, to: :number
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    map :part_of_speech,
         | 
| 16 | 
            +
                        with: { to: :part_of_speech_to_yaml,
         | 
| 17 | 
            +
                                from: :part_of_speech_from_yaml }
         | 
| 18 | 
            +
                    Glossarist::GlossaryDefinition::GRAMMAR_INFO_BOOLEAN_ATTRIBUTES.each do |bool_attr|
         | 
| 19 | 
            +
                      map bool_attr,
         | 
| 20 | 
            +
                          with: { to: :"part_of_speech_#{bool_attr}_to_yaml",
         | 
| 21 | 
            +
                                  from: :"part_of_speech_#{bool_attr}_from_yaml" }
         | 
| 20 22 | 
             
                    end
         | 
| 21 23 | 
             
                  end
         | 
| 22 24 |  | 
| 23 | 
            -
                  def  | 
| 24 | 
            -
                     | 
| 25 | 
            +
                  def part_of_speech_from_yaml(model, value)
         | 
| 26 | 
            +
                    model.part_of_speech = value
         | 
| 25 27 | 
             
                  end
         | 
| 26 28 |  | 
| 27 | 
            -
                  def  | 
| 28 | 
            -
                    {
         | 
| 29 | 
            -
                      "preposition" => preposition?,
         | 
| 30 | 
            -
                      "participle" => participle?,
         | 
| 31 | 
            -
                      "adj" => adj?,
         | 
| 32 | 
            -
                      "verb" => verb?,
         | 
| 33 | 
            -
                      "adverb" => adverb?,
         | 
| 34 | 
            -
                      "noun" => noun?,
         | 
| 35 | 
            -
                      "gender" => gender,
         | 
| 36 | 
            -
                      "number" => number,
         | 
| 37 | 
            -
                    }
         | 
| 38 | 
            -
                  end
         | 
| 29 | 
            +
                  def part_of_speech_to_yaml(model, doc); end
         | 
| 39 30 |  | 
| 40 | 
            -
                   | 
| 31 | 
            +
                  Glossarist::GlossaryDefinition::GRAMMAR_INFO_BOOLEAN_ATTRIBUTES.each do |bool_attr|
         | 
| 32 | 
            +
                    define_method(:"part_of_speech_#{bool_attr}_from_yaml") do |model, value|
         | 
| 33 | 
            +
                      model.public_send("#{bool_attr}=", value)
         | 
| 34 | 
            +
                    end
         | 
| 41 35 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
                     | 
| 45 | 
            -
                      :gender,
         | 
| 46 | 
            -
                      :number,
         | 
| 47 | 
            -
                      :preposition,
         | 
| 48 | 
            -
                      :participle,
         | 
| 49 | 
            -
                      :adj,
         | 
| 50 | 
            -
                      :verb,
         | 
| 51 | 
            -
                      :adverb,
         | 
| 52 | 
            -
                      :noun,
         | 
| 53 | 
            -
                      :part_of_speech,
         | 
| 54 | 
            -
                    ])
         | 
| 36 | 
            +
                    define_method(:"part_of_speech_#{bool_attr}_to_yaml") do |model, doc|
         | 
| 37 | 
            +
                      doc[bool_attr] = model.public_send("#{bool_attr}?")
         | 
| 38 | 
            +
                    end
         | 
| 55 39 | 
             
                  end
         | 
| 56 40 | 
             
                end
         | 
| 57 41 | 
             
              end
         | 
| @@ -1,16 +1,20 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            require_relative "symbol"
         | 
| 2 2 |  | 
| 3 3 | 
             
            module Glossarist
         | 
| 4 4 | 
             
              module Designation
         | 
| 5 5 | 
             
                class GraphicalSymbol < Symbol
         | 
| 6 | 
            -
                   | 
| 7 | 
            -
                   | 
| 6 | 
            +
                  attribute :text, :string
         | 
| 7 | 
            +
                  attribute :image, :string
         | 
| 8 8 |  | 
| 9 | 
            -
                   | 
| 10 | 
            -
                     | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 9 | 
            +
                  yaml do
         | 
| 10 | 
            +
                    map :text, to: :text
         | 
| 11 | 
            +
                    map :image, to: :image
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def self.of_yaml(hash, options = {})
         | 
| 15 | 
            +
                    hash["type"] = "graphical_symbol"
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    super
         | 
| 14 18 | 
             
                  end
         | 
| 15 19 | 
             
                end
         | 
| 16 20 | 
             
              end
         | 
| @@ -1,18 +1,20 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            module Glossarist
         | 
| 4 2 | 
             
              module Designation
         | 
| 5 3 | 
             
                class LetterSymbol < Symbol
         | 
| 6 | 
            -
                   | 
| 7 | 
            -
                   | 
| 8 | 
            -
                   | 
| 4 | 
            +
                  attribute :text, :string
         | 
| 5 | 
            +
                  attribute :language, :string
         | 
| 6 | 
            +
                  attribute :script, :string
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  yaml do
         | 
| 9 | 
            +
                    map :text, to: :text
         | 
| 10 | 
            +
                    map :language, to: :language
         | 
| 11 | 
            +
                    map :script, to: :script
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def self.of_yaml(hash, options = {})
         | 
| 15 | 
            +
                    hash["type"] = "letter_symbol"
         | 
| 9 16 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
                    super.merge(
         | 
| 12 | 
            -
                      "text" => text,
         | 
| 13 | 
            -
                      "language" => language,
         | 
| 14 | 
            -
                      "script" => script,
         | 
| 15 | 
            -
                    )
         | 
| 17 | 
            +
                    super
         | 
| 16 18 | 
             
                  end
         | 
| 17 19 | 
             
                end
         | 
| 18 20 | 
             
              end
         | 
| @@ -1,20 +1,18 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require_relative "base"
         | 
| 4 | 
            -
             | 
| 5 1 | 
             
            module Glossarist
         | 
| 6 2 | 
             
              module Designation
         | 
| 7 3 | 
             
                class Symbol < Base
         | 
| 8 | 
            -
                   | 
| 4 | 
            +
                  attribute :international, :boolean
         | 
| 5 | 
            +
                  attribute :type, :string
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  yaml do
         | 
| 8 | 
            +
                    map :international, to: :international
         | 
| 9 | 
            +
                    map :type, to: :type, render_default: true
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def self.of_yaml(hash, options = {})
         | 
| 13 | 
            +
                    hash["type"] = "symbol" unless hash["type"]
         | 
| 9 14 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
                    {
         | 
| 12 | 
            -
                      "type" => Glossarist::Designation::SERIALIZED_TYPES[self.class],
         | 
| 13 | 
            -
                      "normative_status" => normative_status,
         | 
| 14 | 
            -
                      "geographical_area" => geographical_area,
         | 
| 15 | 
            -
                      "designation" => designation,
         | 
| 16 | 
            -
                      "international" => international,
         | 
| 17 | 
            -
                    }.compact
         | 
| 15 | 
            +
                    super
         | 
| 18 16 | 
             
                  end
         | 
| 19 17 | 
             
                end
         | 
| 20 18 | 
             
              end
         |