edoxen 0.5.0 → 0.8.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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -1
  3. data/.rubocop_todo.yml +1 -1
  4. data/CHANGELOG.md +133 -0
  5. data/CLAUDE.md +10 -6
  6. data/Gemfile +4 -0
  7. data/README.adoc +417 -181
  8. data/TODO.meeting-agenda/02-lutaml-canonical.md +1 -1
  9. data/TODO.meeting-agenda/09-verify-and-release.md +3 -3
  10. data/TODO.meeting-agenda/README.md +2 -2
  11. data/edoxen.gemspec +10 -9
  12. data/lib/edoxen/action.rb +5 -4
  13. data/lib/edoxen/agenda.rb +4 -7
  14. data/lib/edoxen/agenda_item.rb +12 -5
  15. data/lib/edoxen/approval.rb +2 -2
  16. data/lib/edoxen/attendance.rb +29 -0
  17. data/lib/edoxen/body_vocabulary_entry.rb +24 -0
  18. data/lib/edoxen/body_vocabulary_host.rb +40 -0
  19. data/lib/edoxen/cli.rb +186 -108
  20. data/lib/edoxen/consideration.rb +6 -4
  21. data/lib/edoxen/contact.rb +35 -0
  22. data/lib/edoxen/contact_collection.rb +26 -0
  23. data/lib/edoxen/contact_identifier.rb +13 -0
  24. data/lib/edoxen/contact_method.rb +16 -0
  25. data/lib/edoxen/date_time_range.rb +16 -0
  26. data/lib/edoxen/deadline.rb +1 -1
  27. data/lib/edoxen/decision.rb +57 -0
  28. data/lib/edoxen/decision_collection.rb +10 -0
  29. data/lib/edoxen/decision_date.rb +9 -0
  30. data/lib/edoxen/decision_metadata.rb +27 -0
  31. data/lib/edoxen/decision_relation.rb +11 -0
  32. data/lib/edoxen/declaration.rb +25 -0
  33. data/lib/edoxen/entity_ref.rb +74 -0
  34. data/lib/edoxen/enums.rb +129 -8
  35. data/lib/edoxen/error.rb +1 -1
  36. data/lib/edoxen/extension_attribute.rb +78 -0
  37. data/lib/edoxen/host_ref.rb +1 -1
  38. data/lib/edoxen/link_checker.rb +194 -0
  39. data/lib/edoxen/localized_name.rb +16 -0
  40. data/lib/edoxen/localized_string.rb +22 -0
  41. data/lib/edoxen/meeting.rb +42 -36
  42. data/lib/edoxen/meeting_collection.rb +1 -2
  43. data/lib/edoxen/meeting_collection_metadata.rb +4 -2
  44. data/lib/edoxen/meeting_component.rb +37 -0
  45. data/lib/edoxen/meeting_extension.rb +25 -0
  46. data/lib/edoxen/meeting_identifier.rb +1 -1
  47. data/lib/edoxen/meeting_series.rb +26 -0
  48. data/lib/edoxen/minutes.rb +30 -0
  49. data/lib/edoxen/minutes_section.rb +26 -0
  50. data/lib/edoxen/motion.rb +51 -0
  51. data/lib/edoxen/name.rb +29 -0
  52. data/lib/edoxen/officer.rb +19 -0
  53. data/lib/edoxen/officers_host.rb +19 -0
  54. data/lib/edoxen/person.rb +5 -9
  55. data/lib/edoxen/physical_venue.rb +15 -0
  56. data/lib/edoxen/recurrence.rb +27 -0
  57. data/lib/edoxen/recurrence_by_day.rb +10 -0
  58. data/lib/edoxen/reference.rb +1 -1
  59. data/lib/edoxen/reference_data.rb +85 -0
  60. data/lib/edoxen/schema_validator.rb +3 -4
  61. data/lib/edoxen/source_url.rb +4 -4
  62. data/lib/edoxen/statement.rb +21 -0
  63. data/lib/edoxen/structured_identifier.rb +2 -2
  64. data/lib/edoxen/topic.rb +39 -0
  65. data/lib/edoxen/topic_asset.rb +14 -0
  66. data/lib/edoxen/topic_document.rb +16 -0
  67. data/lib/edoxen/venue.rb +79 -0
  68. data/lib/edoxen/venue_collection.rb +18 -0
  69. data/lib/edoxen/venue_validator.rb +74 -0
  70. data/lib/edoxen/version.rb +1 -1
  71. data/lib/edoxen/virtual_venue.rb +15 -0
  72. data/lib/edoxen/vote_record.rb +29 -0
  73. data/lib/edoxen/voting.rb +45 -0
  74. data/lib/edoxen/voting_counts.rb +23 -0
  75. data/lib/edoxen.rb +53 -14
  76. data/schema/edoxen.yaml +1378 -247
  77. data/schema/meeting.yaml +1258 -201
  78. data/sig/edoxen.rbs +581 -1
  79. metadata +82 -21
  80. data/lib/edoxen/_metadata.rb.deprecated +0 -57
  81. data/lib/edoxen/localization.rb +0 -18
  82. data/lib/edoxen/location.rb +0 -15
  83. data/lib/edoxen/meeting_localization.rb +0 -15
  84. data/lib/edoxen/resolution.rb +0 -43
  85. data/lib/edoxen/resolution_collection.rb +0 -10
  86. data/lib/edoxen/resolution_date.rb +0 -11
  87. data/lib/edoxen/resolution_metadata.rb +0 -22
  88. data/lib/edoxen/resolution_relation.rb +0 -11
  89. data/lib/edoxen/resolution_set.rb +0 -17
  90. data/lib/edoxen/schedule_item.rb +0 -16
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.5.0
4
+ version: 0.8.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-01 00:00:00.000000000 Z
11
+ date: 2026-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json_schemer
@@ -52,12 +52,40 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.0'
55
+ - !ruby/object:Gem::Dependency
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
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.1'
55
83
  description: |
56
- Edoxen provides a Ruby library for working with resolution models, allowing
57
- users to create, manipulate, and serialize resolution data in a structured
58
- format. It is built on top of the lutaml-model serialization framework,
59
- which provides a flexible and extensible way to define data models and
60
- 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.
61
89
  email:
62
90
  - open.source@ribose.com
63
91
  executables:
@@ -68,6 +96,7 @@ files:
68
96
  - ".rspec"
69
97
  - ".rubocop.yml"
70
98
  - ".rubocop_todo.yml"
99
+ - CHANGELOG.md
71
100
  - CLAUDE.md
72
101
  - CODE_OF_CONDUCT.md
73
102
  - Gemfile
@@ -87,40 +116,72 @@ files:
87
116
  - edoxen.gemspec
88
117
  - exe/edoxen
89
118
  - lib/edoxen.rb
90
- - lib/edoxen/_metadata.rb.deprecated
91
119
  - lib/edoxen/action.rb
92
120
  - lib/edoxen/agenda.rb
93
121
  - lib/edoxen/agenda_item.rb
94
122
  - lib/edoxen/approval.rb
123
+ - lib/edoxen/attendance.rb
124
+ - lib/edoxen/body_vocabulary_entry.rb
125
+ - lib/edoxen/body_vocabulary_host.rb
95
126
  - lib/edoxen/cli.rb
96
127
  - lib/edoxen/consideration.rb
128
+ - lib/edoxen/contact.rb
129
+ - lib/edoxen/contact_collection.rb
130
+ - lib/edoxen/contact_identifier.rb
131
+ - lib/edoxen/contact_method.rb
97
132
  - lib/edoxen/date_range.rb
133
+ - lib/edoxen/date_time_range.rb
98
134
  - lib/edoxen/deadline.rb
135
+ - lib/edoxen/decision.rb
136
+ - lib/edoxen/decision_collection.rb
137
+ - lib/edoxen/decision_date.rb
138
+ - lib/edoxen/decision_metadata.rb
139
+ - lib/edoxen/decision_relation.rb
140
+ - lib/edoxen/declaration.rb
141
+ - lib/edoxen/entity_ref.rb
99
142
  - lib/edoxen/enums.rb
100
143
  - lib/edoxen/error.rb
144
+ - lib/edoxen/extension_attribute.rb
101
145
  - lib/edoxen/host_ref.rb
102
- - lib/edoxen/localization.rb
103
- - lib/edoxen/location.rb
146
+ - lib/edoxen/link_checker.rb
147
+ - lib/edoxen/localized_name.rb
148
+ - lib/edoxen/localized_string.rb
104
149
  - lib/edoxen/meeting.rb
105
150
  - lib/edoxen/meeting_collection.rb
106
151
  - lib/edoxen/meeting_collection_metadata.rb
152
+ - lib/edoxen/meeting_component.rb
153
+ - lib/edoxen/meeting_extension.rb
107
154
  - lib/edoxen/meeting_identifier.rb
108
- - lib/edoxen/meeting_localization.rb
109
155
  - lib/edoxen/meeting_relation.rb
156
+ - lib/edoxen/meeting_series.rb
157
+ - lib/edoxen/minutes.rb
158
+ - lib/edoxen/minutes_section.rb
159
+ - lib/edoxen/motion.rb
160
+ - lib/edoxen/name.rb
161
+ - lib/edoxen/officer.rb
162
+ - lib/edoxen/officers_host.rb
110
163
  - lib/edoxen/person.rb
164
+ - lib/edoxen/physical_venue.rb
165
+ - lib/edoxen/recurrence.rb
166
+ - lib/edoxen/recurrence_by_day.rb
111
167
  - lib/edoxen/reference.rb
112
- - lib/edoxen/resolution.rb
113
- - lib/edoxen/resolution_collection.rb
114
- - lib/edoxen/resolution_date.rb
115
- - lib/edoxen/resolution_metadata.rb
116
- - lib/edoxen/resolution_relation.rb
117
- - lib/edoxen/resolution_set.rb
118
- - lib/edoxen/schedule_item.rb
168
+ - lib/edoxen/reference_data.rb
119
169
  - lib/edoxen/schema_validator.rb
120
170
  - lib/edoxen/source_url.rb
171
+ - lib/edoxen/statement.rb
121
172
  - lib/edoxen/structured_identifier.rb
173
+ - lib/edoxen/topic.rb
174
+ - lib/edoxen/topic_asset.rb
175
+ - lib/edoxen/topic_document.rb
122
176
  - lib/edoxen/url.rb
177
+ - lib/edoxen/venue.rb
178
+ - lib/edoxen/venue_collection.rb
179
+ - lib/edoxen/venue_validator.rb
123
180
  - lib/edoxen/version.rb
181
+ - lib/edoxen/virtual_venue.rb
182
+ - lib/edoxen/vote_record.rb
183
+ - lib/edoxen/voting.rb
184
+ - lib/edoxen/voting_counts.rb
124
185
  - schema/edoxen.yaml
125
186
  - schema/meeting.yaml
126
187
  - sig/edoxen.rbs
@@ -131,6 +192,7 @@ metadata:
131
192
  homepage_uri: https://github.com/metanorma/edoxen
132
193
  source_code_uri: https://github.com/metanorma/edoxen
133
194
  changelog_uri: https://github.com/metanorma/edoxen
195
+ rubygems_mfa_required: 'true'
134
196
  post_install_message:
135
197
  rdoc_options: []
136
198
  require_paths:
@@ -139,7 +201,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
201
  requirements:
140
202
  - - ">="
141
203
  - !ruby/object:Gem::Version
142
- version: 3.0.0
204
+ version: 3.1.0
143
205
  required_rubygems_version: !ruby/object:Gem::Requirement
144
206
  requirements:
145
207
  - - ">="
@@ -149,6 +211,5 @@ requirements: []
149
211
  rubygems_version: 3.5.22
150
212
  signing_key:
151
213
  specification_version: 4
152
- summary: Edoxen is a set of information models used for representing resolution and
153
- decision information.
214
+ summary: Edoxen is a generic information model for meetings, agendas, and decisions.
154
215
  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,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # A monolingual rendering of a Resolution. Mirrors the glossarist
5
- # LocalizedConcept pattern: language-agnostic fields live on the
6
- # parent Resolution; per-language content lives here.
7
- class Localization < Lutaml::Model::Serializable
8
- attribute :language_code, :string
9
- attribute :script, :string
10
- attribute :title, :string
11
- attribute :subject, :string
12
- attribute :message, :string
13
- attribute :considering, :string
14
- attribute :considerations, Consideration, collection: true
15
- attribute :approvals, Approval, collection: true
16
- attribute :actions, Action, collection: true
17
- end
18
- 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,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # Per-language content for a Meeting. Mirrors the glossarist
5
- # pattern used by `Localization` for Resolutions: language-agnostic
6
- # admin fields live on the parent Meeting; per-language content
7
- # lives here.
8
- class MeetingLocalization < Lutaml::Model::Serializable
9
- attribute :language_code, :string
10
- attribute :script, :string
11
- attribute :title, :string
12
- attribute :general_area, :string
13
- attribute :practical_info, :string
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,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # Collection-level metadata: the title (string for default / single-language
5
- # collections, or `title_localized[]` for multilingual), the meeting date,
6
- # the source secretariat, per-language source PDFs, and the host venue.
7
- class ResolutionMetadata < Lutaml::Model::Serializable
8
- attribute :title, :string
9
- attribute :title_localized, Localization, collection: true
10
- attribute :date, :date
11
- attribute :source, :string
12
- attribute :source_urls, SourceUrl, collection: true
13
- attribute :city, :string
14
- attribute :country_code, :string
15
-
16
- # URN back-reference to the Meeting that produced this collection.
17
- # Join key for the Meeting ↔ ResolutionCollection link. Optional —
18
- # collections without a parent meeting (e.g., ad-hoc resolution
19
- # sets) simply omit it.
20
- attribute :meeting_urn, :string
21
- end
22
- 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,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edoxen
4
- # One entry in a meeting timetable. Structural fields (date, time,
5
- # room) are language-agnostic; descriptive fields (event,
6
- # description) live here as plain strings in v1 — see
7
- # TODO.meeting-agenda/10-future-enhancements.md P2.1 for per-item
8
- # localization.
9
- class ScheduleItem < Lutaml::Model::Serializable
10
- attribute :date, :date
11
- attribute :time, :string
12
- attribute :event, :string
13
- attribute :description, :string
14
- attribute :room, :string
15
- end
16
- end