glossarist 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
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