glossarist 2.3.12 → 2.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e764b9c8ec92fdd762fdda65ea36270f6798ffd417547e40bd48c8b88e50521
4
- data.tar.gz: 2ad3ea02fcdc6d374b7e674796ef124473dc02fbfeff8e4d8053a38fe543e5c6
3
+ metadata.gz: 2a0f63a8b75f3e01fdceeaadbadac4359e59721396224ba34932f17b49f631b6
4
+ data.tar.gz: d674b921051ca918c0d08ae57953ae8f7c92c66e57d2ad55ad128a93f8bbcfa0
5
5
  SHA512:
6
- metadata.gz: ee2ea9ab8d52588d84b19aecd860359438e8b929717726bb4f323e2ba37213bb2d39402cd950d0be896f4c4e63a6147a127fd21088cd42f52d99c0c623ccb945
7
- data.tar.gz: 10a6f8eb05fac3d6f87d1092b934793f01ae7ce0a000efc7314d865b4790bf3e14189fa90ef55b58020c40ae882bf1210b02c0ea5626171f7ccc0ef9f207135d
6
+ metadata.gz: abf0fdfa59b35dd22c412e21ba4b84bde7e24aa7e36ddba608deef1d5ead0f6c5f1ae462be05a1c30cfa38ca824471b77ed9b89ef5bfdcacd692e9dc6122cd5b
7
+ data.tar.gz: 937ad7ae0b777b9b882f0806292c2b5578d0c91e1e4b1cc1127c40e4caa51ef662539570f235224e4ebcc61fa9a749bc7a272a88bbf29aece1ba28a4c404220b
data/CLAUDE.md ADDED
@@ -0,0 +1,59 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Build & Test Commands
6
+
7
+ - `bundle install` — install dependencies
8
+ - `bundle exec rspec` — run all tests
9
+ - `bundle exec rspec spec/unit/citation_spec.rb` — run a single test file
10
+ - `bundle exec rspec spec/unit/citation_spec.rb:12` — run a single test by line number
11
+ - `bundle exec rake` — runs `bundle exec rspec` (default rake task)
12
+ - `bundle exec rubocop` — lint
13
+
14
+ ## Architecture
15
+
16
+ Glossarist is a Ruby gem implementing the [Glossarist concept model](https://github.com/glossarist/concept-model) (ISO 10241-1). It provides classes for managing terminology glossaries with multi-language support, serialization to/from YAML, and bibliography integration via Relaton.
17
+
18
+ ### Core Model Hierarchy
19
+
20
+ All model classes use `Lutaml::Model::Serializable` for serialization. Key classes:
21
+
22
+ - **`ManagedConceptCollection`** (`managed_concept_collection.rb`) — top-level enumerable collection of ManagedConcepts. Entry point for loading/saving glossaries via `ConceptManager`.
23
+ - **`ManagedConcept`** (`managed_concept.rb`) — a managed concept with `ManagedConceptData` (groups, localized_concepts map, sources), related concepts, dates, and status. Delegates localization via `add_l10n`/`localization(lang)`.
24
+ - **`Concept`** (`concept.rb`) — base concept with `ConceptData` (definition, terms/designations, notes, examples, sources, dates, language_code). Parent of `LocalizedConcept`.
25
+ - **`LocalizedConcept`** (`localized_concept.rb`) — extends `Concept` with `classification`, `entry_status`, `review_type`.
26
+ - **`ConceptData`** (`concept_data.rb`) — the data payload inside `Concept`: definition, terms, examples, notes, sources, language_code. Uses `DetailedDefinition` collections for definition/examples/notes.
27
+ - **`ManagedConceptData`** (`managed_concept_data.rb`) — the data payload inside `ManagedConcept`: id, localized_concepts hash (lang_code => uuid), groups, sources.
28
+
29
+ ### Designation (STI-like pattern)
30
+
31
+ `Designation::Base` (`designation/base.rb`) uses a self-referencing factory pattern (`of_yaml`) that dispatches to subclasses based on `type` field: `Expression`, `Symbol`, `Abbreviation`, `GraphicalSymbol`, `LetterSymbol`. The mapping is in `SERIALIZED_TYPES`.
32
+
33
+ ### YAML Serialization
34
+
35
+ - **`ConceptManager`** (`concept_manager.rb`) — handles file I/O. Supports two storage formats:
36
+ 1. Separate `concept/` and `localized_concept/` directories (or `localized-concept/` with dashes)
37
+ 2. Grouped: concept + localized concepts in a single YAML stream file
38
+ - Supports both camelCase and snake_case keys in YAML (e.g., `localizedConcepts` / `localized_concepts`) using `%i[key1 key2]` mapping syntax.
39
+ - Also supports V1 format (`concept-*.yaml` files at root level).
40
+
41
+ ### Configuration & Extensibility
42
+
43
+ - **`Config`** (`config.rb`) — singleton that holds registered classes for `:localized_concept` and `:managed_concept`. Allows swapping implementations via `register_class`.
44
+ - **`GlossaryDefinition`** (`glossary_definition.rb`) — loads enum values (concept statuses, source types, etc.) from `config.yml`.
45
+ - A `glossarist.yaml` file in the working directory can register extension attributes.
46
+
47
+ ### Collections
48
+
49
+ `collections/` contains `BibliographyCollection` (extends `Relaton::Db` for bibliography caching), `AssetCollection`, `Collection` (base enumerable), and `DesignationCollection`.
50
+
51
+ ### Dependencies
52
+
53
+ - `lutaml-model` (~> 0.8) — serialization framework (YAML/XML)
54
+ - `relaton` (>= 2.0.0, < 3) — bibliography database integration
55
+ - `thor` — CLI commands (e.g., `glossarist generate_latex`)
56
+
57
+ ## Branch Notes
58
+
59
+ The `lutaml-model-0.8` branch upgrades from an earlier lutaml-model to 0.8, which requires explicit types on all attributes. Some upstream relaton-* gems (cen, ieee) haven't been updated yet; a compatibility patch is in `bibliography_collection.rb` that prepends `RelatonRegistryPatch` to gracefully skip incompatible backends.
data/Gemfile CHANGED
@@ -2,12 +2,32 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "lutaml-model", github: "lutaml/lutaml-model", branch: "main"
6
- gem "pry"
7
- gem "rake"
8
- gem "rspec"
5
+ gemspec
6
+
7
+ gem "canon"
8
+ gem "lutaml-model", github: "lutaml/lutaml-model", ref: "main"
9
+ gem "rake", "~> 13.0"
10
+ gem "rspec", "~> 3.0"
11
+ gem "rubocop"
9
12
  gem "rubocop-performance"
10
13
  gem "rubocop-rake"
11
14
  gem "rubocop-rspec"
12
15
 
16
+ # Use lutaml-model 0.8 compatible branches for all relaton gems.
17
+ # These branches add explicit types to all lutaml-model attributes,
18
+ # which is required by lutaml-model 0.8+.
19
+ # TODO: Remove these once relaton gems release versions with lutaml-model 0.8 support.
20
+ %w[
21
+ relaton relaton-bib relaton-iso
22
+ relaton-3gpp relaton-bipm relaton-bsi relaton-calconnect
23
+ relaton-ccsds relaton-cen relaton-cie relaton-doi relaton-ecma
24
+ relaton-etsi relaton-gb relaton-iana relaton-iec relaton-ieee
25
+ relaton-ietf relaton-iho relaton-isbn relaton-itu relaton-jis
26
+ relaton-nist relaton-oasis relaton-ogc relaton-omg relaton-plateau
27
+ relaton-un relaton-w3c relaton-xsf
28
+ ].each do |g|
29
+ ref = g == "relaton-bib" ? "upd-lutaml-model-to-0-8-0" : "upd-lutaml-model-to-0.8.0"
30
+ gem g, github: "relaton/#{g}", ref: ref
31
+ end
32
+
13
33
  gemspec
data/glossarist.gemspec CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
32
  spec.require_paths = ["lib"]
33
33
 
34
- spec.add_dependency "lutaml-model", "~> 0.7"
35
- spec.add_dependency "relaton", "~> 1.19"
34
+ spec.add_dependency "lutaml-model", "~> 0.8"
35
+ spec.add_dependency "relaton", ">= 2.0.0", "< 3"
36
36
  spec.add_dependency "thor"
37
37
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Glossarist
4
+ module Collections
5
+ class ConceptSourceCollection < TypedCollection
6
+ instances :sources, ConceptSource
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Glossarist
4
+ module Collections
5
+ class DetailedDefinitionCollection < TypedCollection
6
+ instances :definitions, DetailedDefinition
7
+
8
+ private
9
+
10
+ def coerce_other(item)
11
+ case item
12
+ when String then DetailedDefinition.new(content: item)
13
+ else item
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Glossarist
4
+ module Collections
5
+ class LocalizationCollection < Lutaml::Model::Collection
6
+ instances :localized_concepts, LocalizedConcept
7
+
8
+ index_by :language_code
9
+
10
+ def [](lang_code)
11
+ find_by(:language_code, lang_code.to_s)
12
+ end
13
+
14
+ def store(lang_code, localized_concept)
15
+ localized_concept.language_code ||= lang_code.to_s
16
+ push(localized_concept)
17
+ localized_concept
18
+ end
19
+
20
+ def keys
21
+ map(&:language_code)
22
+ end
23
+
24
+ def values
25
+ to_a
26
+ end
27
+
28
+ def each_key(&block)
29
+ keys.each(&block)
30
+ end
31
+
32
+ def each_value(&block)
33
+ values.each(&block)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Glossarist
4
+ module Collections
5
+ class TypedCollection < Lutaml::Model::Collection
6
+ def <<(item)
7
+ push(coerce(item))
8
+ end
9
+
10
+ private
11
+
12
+ def coerce(item)
13
+ return item if item.is_a?(self.class.instance_type)
14
+
15
+ case item
16
+ when Hash then self.class.instance_type.new(item)
17
+ else coerce_other(item)
18
+ end
19
+ end
20
+
21
+ def coerce_other(item)
22
+ item
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,4 +1,14 @@
1
- require_relative "collections/asset_collection"
2
- require_relative "collections/bibliography_collection"
3
- require_relative "collections/collection"
4
- require_relative "collections/designation_collection"
1
+ # frozen_string_literal: true
2
+
3
+ module Glossarist
4
+ module Collections
5
+ autoload :AssetCollection, "glossarist/collections/asset_collection"
6
+ autoload :BibliographyCollection, "glossarist/collections/bibliography_collection"
7
+ autoload :Collection, "glossarist/collections/collection"
8
+ autoload :ConceptSourceCollection, "glossarist/collections/concept_source_collection"
9
+ autoload :DesignationCollection, "glossarist/collections/designation_collection"
10
+ autoload :DetailedDefinitionCollection, "glossarist/collections/detailed_definition_collection"
11
+ autoload :LocalizationCollection, "glossarist/collections/localization_collection"
12
+ autoload :TypedCollection, "glossarist/collections/typed_collection"
13
+ end
14
+ end
@@ -3,16 +3,21 @@ module Glossarist
3
3
  include Glossarist::Utilities::CommonFunctions
4
4
 
5
5
  attribute :dates, ConceptDate, collection: true
6
- attribute :definition, DetailedDefinition, collection: true,
7
- initialize_empty: true
8
- attribute :examples, DetailedDefinition, collection: true,
9
- initialize_empty: true
6
+ attribute :definition, DetailedDefinition,
7
+ collection: Collections::DetailedDefinitionCollection,
8
+ initialize_empty: true
9
+ attribute :examples, DetailedDefinition,
10
+ collection: Collections::DetailedDefinitionCollection,
11
+ initialize_empty: true
10
12
  attribute :id, :string
11
13
  attribute :lineage_source_similarity, :integer
12
- attribute :notes, DetailedDefinition, collection: true,
13
- initialize_empty: true
14
+ attribute :notes, DetailedDefinition,
15
+ collection: Collections::DetailedDefinitionCollection,
16
+ initialize_empty: true
14
17
  attribute :release, :string
15
- attribute :sources, ConceptSource, collection: true
18
+ attribute :sources, ConceptSource,
19
+ collection: Collections::ConceptSourceCollection,
20
+ initialize_empty: true
16
21
  attribute :terms, Designation::Base, collection: true
17
22
  attribute :related, RelatedConcept, collection: true
18
23
  attribute :domain, :string
@@ -48,7 +48,7 @@ module Glossarist
48
48
  end
49
49
 
50
50
  def load_concept_from_file(filename)
51
- mixed_hashes = YAML.load_stream(File.read(filename))
51
+ mixed_hashes = YAML.load_stream(File.read(filename, encoding: "utf-8"))
52
52
  concepts = []
53
53
 
54
54
  concept_hashes, localized_concept_hashes =
@@ -78,7 +78,7 @@ module Glossarist
78
78
 
79
79
  concept_hash = if localized_concept_hashes.empty?
80
80
  Psych.safe_load(
81
- File.read(localized_concept_path(id)),
81
+ File.read(localized_concept_path(id), encoding: "utf-8"),
82
82
  permitted_classes: [Date, Time],
83
83
  )
84
84
  else
@@ -103,11 +103,11 @@ module Glossarist
103
103
  FileUtils.mkdir_p(localized_concept_dir)
104
104
 
105
105
  filename = File.join(concept_dir, "#{concept.uuid}.yaml")
106
- File.write(filename, concept.to_yaml)
106
+ File.write(filename, concept.to_yaml, encoding: "utf-8")
107
107
 
108
108
  concept.localized_concepts.each do |lang, uuid|
109
109
  filename = File.join(localized_concept_dir, "#{uuid}.yaml")
110
- File.write(filename, concept.localization(lang).to_yaml)
110
+ File.write(filename, concept.localization(lang).to_yaml, encoding: "utf-8")
111
111
  end
112
112
  end
113
113
 
@@ -126,7 +126,7 @@ module Glossarist
126
126
  content << concept.localization(lang).to_yaml
127
127
  end
128
128
 
129
- File.write(filename, content.join("\n"))
129
+ File.write(filename, content.join("\n"), encoding: "utf-8")
130
130
  end
131
131
 
132
132
  def concepts_glob
@@ -1,18 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # (c) Copyright 2021 Ribose Inc.
4
- #
5
-
6
- require_relative "designation/base"
7
- require_relative "designation/expression"
8
- require_relative "designation/abbreviation"
9
- require_relative "designation/grammar_info"
10
- require_relative "designation/symbol"
11
- require_relative "designation/graphical_symbol"
12
- require_relative "designation/letter_symbol"
13
-
14
3
  module Glossarist
15
4
  module Designation
5
+ autoload :Base, "glossarist/designation/base"
6
+ autoload :Expression, "glossarist/designation/expression"
7
+ autoload :Abbreviation, "glossarist/designation/abbreviation"
8
+ autoload :GrammarInfo, "glossarist/designation/grammar_info"
9
+ autoload :Symbol, "glossarist/designation/symbol"
10
+ autoload :GraphicalSymbol, "glossarist/designation/graphical_symbol"
11
+ autoload :LetterSymbol, "glossarist/designation/letter_symbol"
12
+
16
13
  # Bi-directional class-to-string mapping for STI-like serialization.
17
14
  SERIALIZED_TYPES = {
18
15
  Expression => "expression",
@@ -1,9 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Glossarist
2
4
  class Error < StandardError
3
5
  end
4
6
  end
5
-
6
- require_relative "error/invalid_type_error"
7
- require_relative "error/invalid_language_code_error"
8
- require_relative "error/parse_error"
9
- require_relative "error/cache_version_mismatch_error"
@@ -6,7 +6,9 @@ module Glossarist
6
6
  attribute :localized_concepts, :hash
7
7
  attribute :groups, :string, collection: true
8
8
  attribute :sources, ConceptSource, collection: true
9
- attribute :localizations, :hash, collection: true, default: -> { {} }
9
+ attribute :localizations, LocalizedConcept,
10
+ collection: Collections::LocalizationCollection,
11
+ initialize_empty: true
10
12
 
11
13
  yaml do
12
14
  map %i[id identifier], to: :id,
@@ -28,11 +30,9 @@ module Glossarist
28
30
  end
29
31
 
30
32
  def localizations_from_yaml(model, value)
31
- model.localizations ||= {}
32
-
33
33
  value.each do |localized_concept_hash|
34
34
  localized_concept = Glossarist::LocalizedConcept.of_yaml(localized_concept_hash)
35
- model.localizations[localized_concept.language_code] = localized_concept
35
+ model.localizations.store(localized_concept.language_code, localized_concept)
36
36
  end
37
37
  end
38
38
 
@@ -1,4 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "utilities/common_functions"
4
- require_relative "utilities/uuid"
3
+ module Glossarist
4
+ module Utilities
5
+ autoload :CommonFunctions, "glossarist/utilities/common_functions"
6
+ autoload :UUID, "glossarist/utilities/uuid"
7
+ end
8
+ end
@@ -4,5 +4,5 @@
4
4
  #
5
5
 
6
6
  module Glossarist
7
- VERSION = "2.3.12"
7
+ VERSION = "2.5.0"
8
8
  end
data/lib/glossarist.rb CHANGED
@@ -7,35 +7,40 @@ require "psych"
7
7
  require "thor"
8
8
  require "lutaml/model"
9
9
 
10
- require_relative "glossarist/utilities"
11
- require_relative "glossarist/version"
12
10
  require_relative "glossarist/glossary_definition"
13
11
 
14
- require_relative "glossarist/designation"
15
- require_relative "glossarist/asset"
16
- require_relative "glossarist/locality"
17
- require_relative "glossarist/custom_locality"
18
- require_relative "glossarist/citation"
19
- require_relative "glossarist/collection"
20
- require_relative "glossarist/concept_date"
21
- require_relative "glossarist/concept_manager"
22
- require_relative "glossarist/concept_set"
23
- require_relative "glossarist/concept_source"
24
- require_relative "glossarist/detailed_definition"
25
- require_relative "glossarist/related_concept"
26
- require_relative "glossarist/concept_data"
27
- require_relative "glossarist/concept"
28
- require_relative "glossarist/localized_concept"
29
- require_relative "glossarist/managed_concept_data"
30
- require_relative "glossarist/managed_concept"
31
- require_relative "glossarist/managed_concept_collection"
32
- require_relative "glossarist/non_verb_rep"
12
+ module Glossarist
13
+ autoload :Asset, "glossarist/asset"
14
+ autoload :Citation, "glossarist/citation"
15
+ autoload :Collection, "glossarist/collection"
16
+ autoload :Concept, "glossarist/concept"
17
+ autoload :ConceptData, "glossarist/concept_data"
18
+ autoload :ConceptDate, "glossarist/concept_date"
19
+ autoload :ConceptManager, "glossarist/concept_manager"
20
+ autoload :ConceptSet, "glossarist/concept_set"
21
+ autoload :ConceptSource, "glossarist/concept_source"
22
+ autoload :Config, "glossarist/config"
23
+ autoload :CustomLocality, "glossarist/custom_locality"
24
+ autoload :DetailedDefinition, "glossarist/detailed_definition"
25
+ autoload :Designation, "glossarist/designation"
26
+ autoload :Error, "glossarist/error"
27
+ autoload :InvalidTypeError, "glossarist/error/invalid_type_error"
28
+ autoload :InvalidLanguageCodeError, "glossarist/error/invalid_language_code_error"
29
+ autoload :ParseError, "glossarist/error/parse_error"
30
+ autoload :CacheVersionMismatchError, "glossarist/error/cache_version_mismatch_error"
31
+ autoload :Locality, "glossarist/locality"
32
+ autoload :LocalizedConcept, "glossarist/localized_concept"
33
+ autoload :ManagedConcept, "glossarist/managed_concept"
34
+ autoload :ManagedConceptCollection, "glossarist/managed_concept_collection"
35
+ autoload :ManagedConceptData, "glossarist/managed_concept_data"
36
+ autoload :NonVerbRep, "glossarist/non_verb_rep"
37
+ autoload :RelatedConcept, "glossarist/related_concept"
38
+ autoload :Utilities, "glossarist/utilities"
39
+ end
33
40
 
41
+ require_relative "glossarist/version"
34
42
  require_relative "glossarist/collections"
35
43
 
36
- require_relative "glossarist/config"
37
- require_relative "glossarist/error"
38
-
39
44
  module Glossarist
40
45
  def self.configure
41
46
  config = Glossarist::Config.instance
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glossarist
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.12
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-04-06 00:00:00.000000000 Z
11
+ date: 2026-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model
@@ -16,28 +16,34 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.7'
19
+ version: '0.8'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.7'
26
+ version: '0.8'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: relaton
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.0
34
+ - - "<"
32
35
  - !ruby/object:Gem::Version
33
- version: '1.19'
36
+ version: '3'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.0.0
44
+ - - "<"
39
45
  - !ruby/object:Gem::Version
40
- version: '1.19'
46
+ version: '3'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: thor
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -68,6 +74,7 @@ files:
68
74
  - ".rspec"
69
75
  - ".rubocop.yml"
70
76
  - ".rubocop_todo.yml"
77
+ - CLAUDE.md
71
78
  - Gemfile
72
79
  - LICENSE.txt
73
80
  - README.adoc
@@ -83,7 +90,11 @@ files:
83
90
  - lib/glossarist/collections/asset_collection.rb
84
91
  - lib/glossarist/collections/bibliography_collection.rb
85
92
  - lib/glossarist/collections/collection.rb
93
+ - lib/glossarist/collections/concept_source_collection.rb
86
94
  - lib/glossarist/collections/designation_collection.rb
95
+ - lib/glossarist/collections/detailed_definition_collection.rb
96
+ - lib/glossarist/collections/localization_collection.rb
97
+ - lib/glossarist/collections/typed_collection.rb
87
98
  - lib/glossarist/concept.rb
88
99
  - lib/glossarist/concept_data.rb
89
100
  - lib/glossarist/concept_date.rb