edoxen 0.7.2 → 2.1.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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +17 -1
  3. data/.rubocop_todo.yml +1 -1
  4. data/CHANGELOG.md +246 -0
  5. data/README.adoc +308 -153
  6. data/edoxen.gemspec +10 -10
  7. data/lib/edoxen/action.rb +1 -1
  8. data/lib/edoxen/agenda.rb +4 -7
  9. data/lib/edoxen/agenda_item.rb +10 -3
  10. data/lib/edoxen/approval.rb +1 -1
  11. data/lib/edoxen/attendance.rb +16 -10
  12. data/lib/edoxen/body_vocabulary_entry.rb +24 -0
  13. data/lib/edoxen/body_vocabulary_host.rb +29 -0
  14. data/lib/edoxen/cli.rb +117 -120
  15. data/lib/edoxen/component_localization.rb +11 -0
  16. data/lib/edoxen/consideration.rb +2 -2
  17. data/lib/edoxen/contact.rb +24 -0
  18. data/lib/edoxen/contact_identifier.rb +13 -0
  19. data/lib/edoxen/contact_method.rb +16 -0
  20. data/lib/edoxen/decision.rb +69 -0
  21. data/lib/edoxen/decision_collection.rb +10 -0
  22. data/lib/edoxen/decision_date.rb +9 -0
  23. data/lib/edoxen/{resolution_metadata.rb → decision_metadata.rb} +5 -6
  24. data/lib/edoxen/decision_relation.rb +11 -0
  25. data/lib/edoxen/entity_ref.rb +74 -0
  26. data/lib/edoxen/enums.rb +117 -9
  27. data/lib/edoxen/error.rb +1 -1
  28. data/lib/edoxen/extension_attribute.rb +78 -0
  29. data/lib/edoxen/host_ref.rb +1 -1
  30. data/lib/edoxen/link_checker.rb +8 -8
  31. data/lib/edoxen/localization.rb +2 -2
  32. data/lib/edoxen/localization_host.rb +23 -0
  33. data/lib/edoxen/meeting.rb +63 -39
  34. data/lib/edoxen/meeting_collection.rb +1 -2
  35. data/lib/edoxen/meeting_collection_metadata.rb +3 -1
  36. data/lib/edoxen/meeting_component.rb +41 -0
  37. data/lib/edoxen/meeting_extension.rb +25 -0
  38. data/lib/edoxen/meeting_identifier.rb +1 -1
  39. data/lib/edoxen/meeting_localization.rb +6 -1
  40. data/lib/edoxen/meeting_series.rb +21 -0
  41. data/lib/edoxen/minutes.rb +2 -2
  42. data/lib/edoxen/minutes_section.rb +8 -11
  43. data/lib/edoxen/motion.rb +51 -0
  44. data/lib/edoxen/name.rb +29 -0
  45. data/lib/edoxen/officer.rb +19 -0
  46. data/lib/edoxen/officers_host.rb +19 -0
  47. data/lib/edoxen/person.rb +5 -9
  48. data/lib/edoxen/physical_venue.rb +15 -0
  49. data/lib/edoxen/recurrence.rb +27 -0
  50. data/lib/edoxen/recurrence_by_day.rb +10 -0
  51. data/lib/edoxen/reference_data.rb +35 -41
  52. data/lib/edoxen/schema_validator.rb +2 -3
  53. data/lib/edoxen/source_url.rb +3 -3
  54. data/lib/edoxen/structured_identifier.rb +2 -2
  55. data/lib/edoxen/topic.rb +37 -0
  56. data/lib/edoxen/topic_asset.rb +14 -0
  57. data/lib/edoxen/topic_document.rb +16 -0
  58. data/lib/edoxen/venue.rb +80 -0
  59. data/lib/edoxen/venue_validator.rb +56 -0
  60. data/lib/edoxen/version.rb +1 -1
  61. data/lib/edoxen/virtual_venue.rb +15 -0
  62. data/lib/edoxen/vote_record.rb +17 -13
  63. data/lib/edoxen/voting.rb +45 -0
  64. data/lib/edoxen/voting_counts.rb +23 -0
  65. data/lib/edoxen.rb +40 -13
  66. data/schema/edoxen.yaml +792 -145
  67. data/schema/meeting.yaml +600 -142
  68. data/sig/edoxen.rbs +581 -1
  69. metadata +57 -20
  70. data/lib/edoxen/_metadata.rb.deprecated +0 -57
  71. data/lib/edoxen/location.rb +0 -15
  72. data/lib/edoxen/resolution.rb +0 -43
  73. data/lib/edoxen/resolution_collection.rb +0 -10
  74. data/lib/edoxen/resolution_date.rb +0 -11
  75. data/lib/edoxen/resolution_relation.rb +0 -11
  76. data/lib/edoxen/resolution_set.rb +0 -17
  77. data/lib/edoxen/schedule_item.rb +0 -27
  78. data/lib/edoxen/schedule_item_localization.rb +0 -21
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edoxen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-07-02 00:00:00.000000000 Z
11
+ date: 2026-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json_schemer
@@ -54,6 +54,20 @@ dependencies:
54
54
  version: '1.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: unlocodes
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.3'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: iata
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
@@ -67,11 +81,11 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0.1'
69
83
  description: |
70
- Edoxen provides a Ruby library for working with resolution models, allowing
71
- users to create, manipulate, and serialize resolution data in a structured
72
- format. It is built on top of the lutaml-model serialization framework,
73
- which provides a flexible and extensible way to define data models and
74
- serialize them to YAML or JSON formats.
84
+ Edoxen provides a Ruby library for working with a generic meeting/decision
85
+ model, allowing users to create, manipulate, and serialize meeting, agenda,
86
+ motion, voting, and decision data in a structured format. Built on top of
87
+ the lutaml-model serialization framework, with profile-based customization
88
+ (ISO 8601-2 §15) for domain-specific extensions.
75
89
  email:
76
90
  - open.source@ribose.com
77
91
  executables:
@@ -82,6 +96,7 @@ files:
82
96
  - ".rspec"
83
97
  - ".rubocop.yml"
84
98
  - ".rubocop_todo.yml"
99
+ - CHANGELOG.md
85
100
  - CLAUDE.md
86
101
  - CODE_OF_CONDUCT.md
87
102
  - Gemfile
@@ -101,47 +116,69 @@ files:
101
116
  - edoxen.gemspec
102
117
  - exe/edoxen
103
118
  - lib/edoxen.rb
104
- - lib/edoxen/_metadata.rb.deprecated
105
119
  - lib/edoxen/action.rb
106
120
  - lib/edoxen/agenda.rb
107
121
  - lib/edoxen/agenda_item.rb
108
122
  - lib/edoxen/approval.rb
109
123
  - lib/edoxen/attendance.rb
124
+ - lib/edoxen/body_vocabulary_entry.rb
125
+ - lib/edoxen/body_vocabulary_host.rb
110
126
  - lib/edoxen/cli.rb
127
+ - lib/edoxen/component_localization.rb
111
128
  - lib/edoxen/consideration.rb
129
+ - lib/edoxen/contact.rb
130
+ - lib/edoxen/contact_identifier.rb
131
+ - lib/edoxen/contact_method.rb
112
132
  - lib/edoxen/date_range.rb
113
133
  - lib/edoxen/deadline.rb
134
+ - lib/edoxen/decision.rb
135
+ - lib/edoxen/decision_collection.rb
136
+ - lib/edoxen/decision_date.rb
137
+ - lib/edoxen/decision_metadata.rb
138
+ - lib/edoxen/decision_relation.rb
139
+ - lib/edoxen/entity_ref.rb
114
140
  - lib/edoxen/enums.rb
115
141
  - lib/edoxen/error.rb
142
+ - lib/edoxen/extension_attribute.rb
116
143
  - lib/edoxen/host_ref.rb
117
144
  - lib/edoxen/link_checker.rb
118
145
  - lib/edoxen/localization.rb
119
- - lib/edoxen/location.rb
146
+ - lib/edoxen/localization_host.rb
120
147
  - lib/edoxen/meeting.rb
121
148
  - lib/edoxen/meeting_collection.rb
122
149
  - lib/edoxen/meeting_collection_metadata.rb
150
+ - lib/edoxen/meeting_component.rb
151
+ - lib/edoxen/meeting_extension.rb
123
152
  - lib/edoxen/meeting_identifier.rb
124
153
  - lib/edoxen/meeting_localization.rb
125
154
  - lib/edoxen/meeting_relation.rb
155
+ - lib/edoxen/meeting_series.rb
126
156
  - lib/edoxen/minutes.rb
127
157
  - lib/edoxen/minutes_section.rb
158
+ - lib/edoxen/motion.rb
159
+ - lib/edoxen/name.rb
160
+ - lib/edoxen/officer.rb
161
+ - lib/edoxen/officers_host.rb
128
162
  - lib/edoxen/person.rb
163
+ - lib/edoxen/physical_venue.rb
164
+ - lib/edoxen/recurrence.rb
165
+ - lib/edoxen/recurrence_by_day.rb
129
166
  - lib/edoxen/reference.rb
130
167
  - lib/edoxen/reference_data.rb
131
- - lib/edoxen/resolution.rb
132
- - lib/edoxen/resolution_collection.rb
133
- - lib/edoxen/resolution_date.rb
134
- - lib/edoxen/resolution_metadata.rb
135
- - lib/edoxen/resolution_relation.rb
136
- - lib/edoxen/resolution_set.rb
137
- - lib/edoxen/schedule_item.rb
138
- - lib/edoxen/schedule_item_localization.rb
139
168
  - lib/edoxen/schema_validator.rb
140
169
  - lib/edoxen/source_url.rb
141
170
  - lib/edoxen/structured_identifier.rb
171
+ - lib/edoxen/topic.rb
172
+ - lib/edoxen/topic_asset.rb
173
+ - lib/edoxen/topic_document.rb
142
174
  - lib/edoxen/url.rb
175
+ - lib/edoxen/venue.rb
176
+ - lib/edoxen/venue_validator.rb
143
177
  - lib/edoxen/version.rb
178
+ - lib/edoxen/virtual_venue.rb
144
179
  - lib/edoxen/vote_record.rb
180
+ - lib/edoxen/voting.rb
181
+ - lib/edoxen/voting_counts.rb
145
182
  - schema/edoxen.yaml
146
183
  - schema/meeting.yaml
147
184
  - sig/edoxen.rbs
@@ -152,6 +189,7 @@ metadata:
152
189
  homepage_uri: https://github.com/metanorma/edoxen
153
190
  source_code_uri: https://github.com/metanorma/edoxen
154
191
  changelog_uri: https://github.com/metanorma/edoxen
192
+ rubygems_mfa_required: 'true'
155
193
  post_install_message:
156
194
  rdoc_options: []
157
195
  require_paths:
@@ -160,7 +198,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
198
  requirements:
161
199
  - - ">="
162
200
  - !ruby/object:Gem::Version
163
- version: 3.0.0
201
+ version: 3.1.0
164
202
  required_rubygems_version: !ruby/object:Gem::Requirement
165
203
  requirements:
166
204
  - - ">="
@@ -170,6 +208,5 @@ requirements: []
170
208
  rubygems_version: 3.5.22
171
209
  signing_key:
172
210
  specification_version: 4
173
- summary: Edoxen is a set of information models used for representing resolution and
174
- decision information.
211
+ summary: Edoxen is a generic information model for meetings, agendas, and decisions.
175
212
  test_files: []
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "lutaml/model"
4
- require_relative "resolution_date"
5
- require_relative "url"
6
- require_relative "localization"
7
-
8
- module Edoxen
9
- # A per-language source-URL record. Carries the URL ref, its format
10
- # (pdf, html, ...), and the language_code (ISO 639-3) for which the
11
- # URL is the canonical source.
12
- class SourceUrl < Lutaml::Model::Serializable
13
- attribute :ref, :string
14
- attribute :format, :string
15
- attribute :language_code, :string
16
-
17
- key_value do
18
- map "ref", to: :ref
19
- map "format", to: :format
20
- map "language_code", to: :language_code
21
- end
22
- end
23
-
24
- class Metadata < Lutaml::Model::Serializable
25
- attribute :title, :string
26
- attribute :identifier, :string
27
- attribute :dates, ResolutionDate, collection: true
28
- attribute :source, :string
29
- attribute :venue, :string
30
- attribute :chair, :string
31
- attribute :urls, Url, collection: true
32
-
33
- # OIML extensions — see TODO.complete/14 for the glossarist-style
34
- # i18n model. `title_localized` carries the per-language title
35
- # parallel to Resolution#localizations. `source_urls` carries the
36
- # per-language PDF URLs. `city`/`country_code` carry the IATA /
37
- # ISO 3166-1 alpha-2 codes for the host venue.
38
- attribute :title_localized, Localization, collection: true
39
- attribute :source_urls, SourceUrl, collection: true
40
- attribute :city, :string
41
- attribute :country_code, :string
42
-
43
- key_value do
44
- map "title", to: :title
45
- map "identifier", to: :identifier
46
- map "dates", to: :dates
47
- map "source", to: :source
48
- map "venue", to: :venue
49
- map "chair", to: :chair
50
- map "urls", to: :urls
51
- map "title_localized", to: :title_localized
52
- map "source_urls", to: :source_urls
53
- map "city", to: :city
54
- map "country_code", to: :country_code
55
- end
56
- end
57
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # Venue geography. Multi-venue meetings (e.g., a plenary week with
5
- # different hotels) carry one Location per venue.
6
- class Location < Lutaml::Model::Serializable
7
- attribute :name, :string
8
- attribute :address, :string
9
- attribute :link, :string
10
- attribute :phone, :string
11
- attribute :note, :string
12
- attribute :lat, :float
13
- attribute :lon, :float
14
- end
15
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # A formal Resolution. Language-agnostic admin fields live here; every
5
- # translatable field is wrapped inside `localizations[]` (one entry per
6
- # available language; at least one is required by the schema).
7
- #
8
- # Wire names follow lutaml-model's default convention: each declared
9
- # attribute serializes to its snake_case name on the wire. Override
10
- # with an explicit `key_value do; map "wire", to: :attr; end` block
11
- # only when the wire name differs.
12
- class Resolution < Lutaml::Model::Serializable
13
- attribute :identifier, StructuredIdentifier, collection: true
14
- attribute :type, :string, values: Enums::RESOLUTION_TYPE
15
- attribute :doi, :string
16
- attribute :urn, :string
17
- attribute :agenda_item, :string
18
- attribute :dates, ResolutionDate, collection: true
19
- attribute :categories, :string, collection: true
20
- attribute :meeting, MeetingIdentifier
21
- attribute :relations, ResolutionRelation, collection: true
22
- attribute :urls, Url, collection: true
23
- attribute :localizations, Localization, collection: true
24
-
25
- # Lookup by ISO 639-3 language code. Returns nil when no exact match
26
- # exists and `fallback:` is false (the default); returns the first
27
- # localization otherwise. Keeps the language-preference policy in
28
- # one place so callers stop reimplementing `find { |l| ... }`.
29
- def in_language(code, fallback: false)
30
- match = localizations&.find { |loc| loc.language_code == code.to_s }
31
- return match if match
32
-
33
- fallback ? localizations&.first : nil
34
- end
35
-
36
- # The canonical rendering — English when available, else the first
37
- # declared localization. Mirrors the glossarist LocalizedConcept
38
- # "preferred language" notion.
39
- def primary_localization
40
- in_language("eng", fallback: true)
41
- end
42
- end
43
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # Top-level container for a published resolution collection: metadata
5
- # plus the list of resolutions.
6
- class ResolutionCollection < Lutaml::Model::Serializable
7
- attribute :metadata, ResolutionMetadata
8
- attribute :resolutions, Resolution, collection: true
9
- end
10
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # Date with semantic kind (adoption, drafted, discussed).
5
- # ResolutionDate is the only carrier of a *typed* date in the model —
6
- # plain `Date` in lutaml-model has no semantic context.
7
- class ResolutionDate < Lutaml::Model::Serializable
8
- attribute :date, :date
9
- attribute :type, :string, values: Enums::RESOLUTION_DATE_TYPE
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # Directed relation between two resolutions, identified by their
5
- # StructuredIdentifier (prefix + number).
6
- class ResolutionRelation < Lutaml::Model::Serializable
7
- attribute :source, StructuredIdentifier
8
- attribute :destination, StructuredIdentifier
9
- attribute :type, :string, values: Enums::RESOLUTION_RELATION_TYPE
10
- end
11
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "lutaml/model"
4
- require_relative "metadata"
5
- require_relative "resolution"
6
-
7
- module Edoxen
8
- class ResolutionSet < Lutaml::Model::Serializable
9
- attribute :metadata, Metadata
10
- attribute :resolutions, Resolution, collection: true
11
-
12
- key_value do
13
- map "metadata", to: :metadata
14
- map "resolutions", to: :resolutions
15
- end
16
- end
17
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # One entry in the meeting timetable. Structural fields (date, time,
5
- # room) are language-agnostic; per-language content (event name,
6
- # description) lives in `localizations[]`. Mirrors the glossarist
7
- # LocalizedConcept pattern.
8
- class ScheduleItem < Lutaml::Model::Serializable
9
- attribute :date, :date
10
- attribute :time, :string
11
- attribute :event, :string
12
- attribute :description, :string
13
- attribute :room, :string
14
- attribute :localizations, ScheduleItemLocalization, collection: true
15
-
16
- def in_language(code, fallback: false)
17
- match = localizations&.find { |loc| loc.language_code == code.to_s }
18
- return match if match
19
-
20
- fallback ? localizations&.first : nil
21
- end
22
-
23
- def primary_localization
24
- in_language("eng", fallback: true)
25
- end
26
- end
27
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # Per-language content for a ScheduleItem. Mirrors the glossarist
5
- # LocalizedConcept pattern: structural fields (date, time, room) live
6
- # on the parent ScheduleItem; per-language content (event name,
7
- # description) lives here.
8
- class ScheduleItemLocalization < Lutaml::Model::Serializable
9
- attribute :language_code, :string
10
- attribute :script, :string
11
- attribute :event, :string
12
- attribute :description, :string
13
-
14
- key_value do
15
- map "language_code", to: :language_code
16
- map "script", to: :script
17
- map "event", to: :event
18
- map "description", to: :description
19
- end
20
- end
21
- end