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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/.rubocop_todo.yml +65 -0
  4. data/README.adoc +2 -2
  5. data/config.yml +1 -1
  6. data/glossarist.gemspec +1 -0
  7. data/lib/glossarist/asset.rb +4 -9
  8. data/lib/glossarist/citation.rb +73 -41
  9. data/lib/glossarist/collection.rb +2 -11
  10. data/lib/glossarist/collections/asset_collection.rb +0 -3
  11. data/lib/glossarist/collections/bibliography_collection.rb +1 -1
  12. data/lib/glossarist/concept.rb +67 -206
  13. data/lib/glossarist/concept_data.rb +66 -0
  14. data/lib/glossarist/concept_date.rb +7 -11
  15. data/lib/glossarist/concept_manager.rb +19 -29
  16. data/lib/glossarist/concept_set.rb +6 -4
  17. data/lib/glossarist/concept_source.rb +15 -58
  18. data/lib/glossarist/config.rb +4 -4
  19. data/lib/glossarist/designation/abbreviation.rb +15 -16
  20. data/lib/glossarist/designation/base.rb +16 -15
  21. data/lib/glossarist/designation/expression.rb +18 -26
  22. data/lib/glossarist/designation/grammar_info.rb +29 -45
  23. data/lib/glossarist/designation/graphical_symbol.rb +12 -8
  24. data/lib/glossarist/designation/letter_symbol.rb +13 -11
  25. data/lib/glossarist/designation/symbol.rb +11 -13
  26. data/lib/glossarist/designation.rb +3 -3
  27. data/lib/glossarist/detailed_definition.rb +6 -24
  28. data/lib/glossarist/error.rb +4 -4
  29. data/lib/glossarist/glossary_definition.rb +6 -3
  30. data/lib/glossarist/localized_concept.rb +17 -62
  31. data/lib/glossarist/managed_concept.rb +74 -146
  32. data/lib/glossarist/managed_concept_collection.rb +15 -24
  33. data/lib/glossarist/managed_concept_data.rb +47 -0
  34. data/lib/glossarist/non_verb_rep.rb +10 -13
  35. data/lib/glossarist/related_concept.rb +14 -21
  36. data/lib/glossarist/utilities/uuid.rb +10 -5
  37. data/lib/glossarist/utilities.rb +0 -2
  38. data/lib/glossarist/version.rb +1 -1
  39. data/lib/glossarist.rb +10 -9
  40. metadata +23 -13
  41. data/lib/glossarist/model.rb +0 -40
  42. data/lib/glossarist/utilities/boolean_attributes.rb +0 -35
  43. data/lib/glossarist/utilities/enum/class_methods.rb +0 -99
  44. data/lib/glossarist/utilities/enum/enum_collection.rb +0 -45
  45. data/lib/glossarist/utilities/enum/instance_methods.rb +0 -55
  46. data/lib/glossarist/utilities/enum.rb +0 -21
  47. data/lib/glossarist/v1_reader.rb +0 -28
@@ -21,12 +21,13 @@ module Glossarist
21
21
  #
22
22
  # See RFC 4122 for details of UUID at: https://www.ietf.org/rfc/rfc4122.txt
23
23
  def self.uuid_from_hash(hash_class, namespace, name)
24
- if hash_class == Digest::MD5 || hash_class == OpenSSL::Digest::MD5
24
+ if [Digest::MD5, OpenSSL::Digest::MD5].include?(hash_class)
25
25
  version = 3
26
- elsif hash_class == Digest::SHA1 || hash_class == OpenSSL::Digest::SHA1
26
+ elsif [Digest::SHA1, OpenSSL::Digest::SHA1].include?(hash_class)
27
27
  version = 5
28
28
  else
29
- raise ArgumentError, "Expected OpenSSL::Digest::SHA1 or OpenSSL::Digest::MD5, got #{hash_class.name}."
29
+ raise ArgumentError,
30
+ "Expected OpenSSL::Digest::SHA1 or OpenSSL::Digest::MD5, got #{hash_class.name}."
30
31
  end
31
32
 
32
33
  uuid_namespace = pack_uuid_namespace(namespace)
@@ -58,12 +59,16 @@ module Glossarist
58
59
  end
59
60
 
60
61
  def self.pack_uuid_namespace(namespace)
61
- if [DNS_NAMESPACE, OID_NAMESPACE, URL_NAMESPACE, X500_NAMESPACE].include?(namespace)
62
+ if [DNS_NAMESPACE, OID_NAMESPACE, URL_NAMESPACE,
63
+ X500_NAMESPACE].include?(namespace)
62
64
  namespace
63
65
  else
64
66
  match_data = namespace.match(/\A(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})\z/)
65
67
 
66
- raise ArgumentError, "Only UUIDs are valid namespace identifiers" unless match_data.present?
68
+ unless match_data.present?
69
+ raise ArgumentError,
70
+ "Only UUIDs are valid namespace identifiers"
71
+ end
67
72
 
68
73
  match_data.captures.map { |s| s.to_i(16) }.pack("NnnnnN")
69
74
  end
@@ -1,6 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "utilities/enum"
4
- require_relative "utilities/boolean_attributes"
5
3
  require_relative "utilities/common_functions"
6
4
  require_relative "utilities/uuid"
@@ -4,5 +4,5 @@
4
4
  #
5
5
 
6
6
  module Glossarist
7
- VERSION = "2.3.0"
7
+ VERSION = "2.3.1"
8
8
  end
data/lib/glossarist.rb CHANGED
@@ -5,28 +5,29 @@
5
5
 
6
6
  require "psych"
7
7
  require "thor"
8
+ require "lutaml/model"
8
9
 
9
10
  require_relative "glossarist/utilities"
10
11
  require_relative "glossarist/version"
11
12
  require_relative "glossarist/glossary_definition"
12
13
 
14
+ require_relative "glossarist/designation"
13
15
  require_relative "glossarist/asset"
14
- require_relative "glossarist/model"
15
- require_relative "glossarist/concept_date"
16
- require_relative "glossarist/detailed_definition"
17
- require_relative "glossarist/related_concept"
18
16
  require_relative "glossarist/citation"
17
+ require_relative "glossarist/collection"
18
+ require_relative "glossarist/concept_date"
19
+ require_relative "glossarist/concept_manager"
19
20
  require_relative "glossarist/concept_set"
20
21
  require_relative "glossarist/concept_source"
21
- require_relative "glossarist/collection"
22
- require_relative "glossarist/designation"
22
+ require_relative "glossarist/detailed_definition"
23
+ require_relative "glossarist/related_concept"
24
+ require_relative "glossarist/concept_data"
23
25
  require_relative "glossarist/concept"
24
26
  require_relative "glossarist/localized_concept"
25
- require_relative "glossarist/managed_concept_collection"
26
- require_relative "glossarist/concept_manager"
27
+ require_relative "glossarist/managed_concept_data"
27
28
  require_relative "glossarist/managed_concept"
29
+ require_relative "glossarist/managed_concept_collection"
28
30
  require_relative "glossarist/non_verb_rep"
29
- require_relative "glossarist/v1_reader"
30
31
 
31
32
  require_relative "glossarist/collections"
32
33
 
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glossarist
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-19 00:00:00.000000000 Z
11
+ date: 2025-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lutaml-model
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.5.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.5.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: relaton
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,7 +52,7 @@ dependencies:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
- description:
55
+ description:
42
56
  email:
43
57
  - open.source@ribose.com
44
58
  executables:
@@ -53,6 +67,7 @@ files:
53
67
  - ".hound.yml"
54
68
  - ".rspec"
55
69
  - ".rubocop.yml"
70
+ - ".rubocop_todo.yml"
56
71
  - Gemfile
57
72
  - LICENSE.txt
58
73
  - README.adoc
@@ -70,6 +85,7 @@ files:
70
85
  - lib/glossarist/collections/collection.rb
71
86
  - lib/glossarist/collections/designation_collection.rb
72
87
  - lib/glossarist/concept.rb
88
+ - lib/glossarist/concept_data.rb
73
89
  - lib/glossarist/concept_date.rb
74
90
  - lib/glossarist/concept_manager.rb
75
91
  - lib/glossarist/concept_set.rb
@@ -92,18 +108,12 @@ files:
92
108
  - lib/glossarist/localized_concept.rb
93
109
  - lib/glossarist/managed_concept.rb
94
110
  - lib/glossarist/managed_concept_collection.rb
95
- - lib/glossarist/model.rb
111
+ - lib/glossarist/managed_concept_data.rb
96
112
  - lib/glossarist/non_verb_rep.rb
97
113
  - lib/glossarist/related_concept.rb
98
114
  - lib/glossarist/utilities.rb
99
- - lib/glossarist/utilities/boolean_attributes.rb
100
115
  - lib/glossarist/utilities/common_functions.rb
101
- - lib/glossarist/utilities/enum.rb
102
- - lib/glossarist/utilities/enum/class_methods.rb
103
- - lib/glossarist/utilities/enum/enum_collection.rb
104
- - lib/glossarist/utilities/enum/instance_methods.rb
105
116
  - lib/glossarist/utilities/uuid.rb
106
- - lib/glossarist/v1_reader.rb
107
117
  - lib/glossarist/version.rb
108
118
  homepage: https://github.com/glossarist/glossarist-ruby
109
119
  licenses:
@@ -112,7 +122,7 @@ metadata:
112
122
  homepage_uri: https://github.com/glossarist/glossarist-ruby
113
123
  source_code_uri: https://github.com/glossarist/glossarist-ruby
114
124
  bug_tracker_uri: https://github.com/glossarist/glossarist-ruby/issues
115
- post_install_message:
125
+ post_install_message:
116
126
  rdoc_options: []
117
127
  require_paths:
118
128
  - lib
@@ -128,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
138
  version: '0'
129
139
  requirements: []
130
140
  rubygems_version: 3.3.27
131
- signing_key:
141
+ signing_key:
132
142
  specification_version: 4
133
143
  summary: Concept models for terminology glossaries conforming ISO 10241-1.
134
144
  test_files: []
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # (c) Copyright 2021 Ribose Inc.
4
- #
5
-
6
- module Glossarist
7
- class Model
8
- def self.new(params = {})
9
- return params if params.is_a?(self)
10
-
11
- super
12
- end
13
-
14
- def initialize(attributes = {})
15
- attributes.each_pair { |k, v| set_attribute(k, v) }
16
- end
17
-
18
- def set_attribute(name, value)
19
- public_send("#{name}=", value)
20
- rescue NoMethodError
21
- if Config.extension_attributes.include?(name)
22
- extension_attributes[name] = value
23
- elsif name.match?(/[A-Z]/) # adding support for camel case
24
- name = snake_case(name.to_s).to_sym
25
- retry
26
- else
27
- raise ArgumentError, "#{self.class.name} does not have " +
28
- "attribute #{name} defined or the attribute is read only."
29
- end
30
- end
31
-
32
- def self.from_h(hash)
33
- new(hash)
34
- end
35
-
36
- def snake_case(str)
37
- str.gsub(/([A-Z])/) { "_#{$1.downcase}" }
38
- end
39
- end
40
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Glossarist
4
- module Utilities
5
- module BooleanAttributes
6
- def self.included(base)
7
- base.extend(ClassMethods)
8
- end
9
-
10
- def self.extended(base)
11
- base.extend(ClassMethods)
12
- end
13
-
14
- module ClassMethods
15
- def register_boolean_attributes(attributes)
16
- attributes.each do |attribute|
17
- register_boolean_attribute(attribute)
18
- end
19
- end
20
-
21
- def register_boolean_attribute(attribute)
22
- attr_reader attribute
23
-
24
- define_method("#{attribute}=") do |value|
25
- instance_variable_set("@#{attribute}", !!value)
26
- end
27
-
28
- define_method("#{attribute}?") do
29
- !!instance_variable_get("@#{attribute}")
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,99 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "set"
4
-
5
- module Glossarist
6
- module Utilities
7
- module Enum
8
- module ClassMethods
9
- def add_inheritable_attribute(attribute)
10
- @inheritable_attributes ||= Set[:inheritable_attributes]
11
- @inheritable_attributes << attribute
12
- end
13
-
14
- def inherited(subclass)
15
- @inheritable_attributes.each do |inheritable_attribute|
16
- instance_var = "@#{inheritable_attribute}"
17
- subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
18
- end
19
- end
20
-
21
- def enums
22
- @enums ||= EnumCollection.new
23
- end
24
-
25
- def register_enum(name, values, options = {})
26
- values = standardize_values(values)
27
-
28
- enums.add(name, values, options)
29
-
30
- add_inheritable_attribute(:enums)
31
- register_type_accessor(name)
32
-
33
- values.each do |value|
34
- register_check_method(name, value)
35
- register_set_method(name, value)
36
- end
37
- end
38
-
39
- def registered_enums
40
- enums.registered_enums
41
- end
42
-
43
- def valid_types(name)
44
- enums.valid_types(name)
45
- end
46
-
47
- def type_options(name)
48
- enums.type_options(name)
49
- end
50
-
51
- def register_type_reader(name)
52
- define_method(name) do
53
- if self.class.type_options(name)[:multiple]
54
- selected_type[name].map(&:to_s)
55
- else
56
- selected_type[name].first&.to_s
57
- end
58
- end
59
- end
60
-
61
- def register_type_writer(name)
62
- define_method("#{name}=") do |type|
63
- select_type(name, type)
64
- end
65
- end
66
-
67
- # Adds a reader and writer for the type name given.
68
- def register_type_accessor(name)
69
- register_type_reader(name)
70
- register_type_writer(name)
71
- end
72
-
73
- def register_check_method(name, value)
74
- define_method("#{value}?") do
75
- !!selected_type[name]&.include?(value.to_sym)
76
- end
77
- end
78
-
79
- def register_set_method(name, value)
80
- define_method("#{value}=") do |input|
81
- if input
82
- select_type(name, value)
83
- else
84
- deselect_type(name, value)
85
- end
86
- end
87
- end
88
-
89
- def standardize_values(values)
90
- if values.is_a?(Array)
91
- values.map(&:to_sym)
92
- else
93
- [values.to_sym]
94
- end
95
- end
96
- end
97
- end
98
- end
99
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Glossarist
4
- module Utilities
5
- module Enum
6
- class EnumCollection
7
- include Enumerable
8
-
9
- def initialize
10
- @collection = {}
11
- end
12
-
13
- def add(name, values, options = {})
14
- @collection[name] = { registered_values: values, options: options }
15
- end
16
-
17
- def each(&block)
18
- if block_given?
19
- @collection.each do |object|
20
- block.call(object)
21
- end
22
- else
23
- enum_for(:each)
24
- end
25
- end
26
-
27
- def registered_enums
28
- @collection&.keys || []
29
- end
30
-
31
- def valid_types(name)
32
- @collection[name][:registered_values]
33
- end
34
-
35
- def type_options(name)
36
- @collection[name][:options]
37
- end
38
-
39
- def [](name)
40
- @collection[name]
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Glossarist
4
- module Utilities
5
- module Enum
6
- module InstanceMethods
7
- def selected_type
8
- initialize_selected_type if @selected_type.nil?
9
-
10
- @selected_type
11
- end
12
-
13
- def select_type(type_name, values)
14
- values = if values.is_a?(Array)
15
- values
16
- else
17
- [values]
18
- end
19
-
20
- values.each do |value|
21
- select_type_value(type_name, value)
22
- end
23
- end
24
-
25
- def deselect_type(type_name, value)
26
- selected_type[type_name].delete(value)
27
- end
28
-
29
- private
30
-
31
- def select_type_value(type_name, value)
32
- if !value
33
- selected_type[type_name].clear
34
- elsif self.class.valid_types(type_name).include?(value.to_sym)
35
- selected_type[type_name].clear unless self.class.type_options(type_name)[:multiple]
36
- selected_type[type_name] << value.to_sym
37
- else
38
- raise(
39
- Glossarist::InvalidTypeError,
40
- "`#{value}` is not a valid #{type_name}. Supported #{type_name} are #{self.class.enums[type_name][:registered_values].to_a.join(", ")}"
41
- )
42
- end
43
- end
44
-
45
- def initialize_selected_type
46
- @selected_type = {}
47
-
48
- self.class.registered_enums.each do |type|
49
- @selected_type[type] = []
50
- end
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "enum/enum_collection"
4
- require_relative "enum/class_methods"
5
- require_relative "enum/instance_methods"
6
-
7
- module Glossarist
8
- module Utilities
9
- module Enum
10
- def self.included(base)
11
- base.include(InstanceMethods)
12
- base.extend(ClassMethods)
13
- end
14
-
15
- def self.extended(base)
16
- base.include(InstanceMethods)
17
- base.extend(ClassMethods)
18
- end
19
- end
20
- end
21
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Glossarist
4
- # An adapter to read concepts in V1 format, converts them to v2 format and
5
- # load into glossarist concept model.
6
- class V1Reader
7
- def self.load_concept_from_file(filename)
8
- new.load_concept_from_file(filename)
9
- end
10
-
11
- def load_concept_from_file(filename)
12
- concept_hash = Psych.safe_load(File.read(filename), permitted_classes: [Date, Time])
13
- Config.class_for(:managed_concept).new(generate_v2_concept_hash(concept_hash))
14
- end
15
-
16
- private
17
-
18
- def generate_v2_concept_hash(concept_hash)
19
- v2_concept = { "groups" => concept_hash["groups"] }
20
- v2_concept["data"] = {
21
- "identifier" => concept_hash["termid"],
22
- "localized_concepts" => concept_hash.values.grep(Hash),
23
- }
24
-
25
- v2_concept
26
- end
27
- end
28
- end