edoxen 0.3.0 → 0.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CLAUDE.md +24 -10
  3. data/README.adoc +170 -31
  4. data/TODO.meeting-agenda/01-design-decisions.md +132 -0
  5. data/TODO.meeting-agenda/02-lutaml-canonical.md +61 -0
  6. data/TODO.meeting-agenda/03-ruby-models.md +73 -0
  7. data/TODO.meeting-agenda/04-schema.md +34 -0
  8. data/TODO.meeting-agenda/05-fixtures.md +43 -0
  9. data/TODO.meeting-agenda/06-specs.md +52 -0
  10. data/TODO.meeting-agenda/07-cli.md +55 -0
  11. data/TODO.meeting-agenda/08-docs.md +35 -0
  12. data/TODO.meeting-agenda/09-verify-and-release.md +41 -0
  13. data/TODO.meeting-agenda/10-future-enhancements.md +72 -0
  14. data/TODO.meeting-agenda/README.md +30 -0
  15. data/lib/edoxen/action.rb +0 -6
  16. data/lib/edoxen/agenda.rb +26 -0
  17. data/lib/edoxen/agenda_item.rb +17 -0
  18. data/lib/edoxen/approval.rb +0 -7
  19. data/lib/edoxen/cli.rb +199 -95
  20. data/lib/edoxen/consideration.rb +0 -6
  21. data/lib/edoxen/date_range.rb +11 -0
  22. data/lib/edoxen/deadline.rb +10 -0
  23. data/lib/edoxen/enums.rb +24 -0
  24. data/lib/edoxen/error.rb +32 -2
  25. data/lib/edoxen/host_ref.rb +14 -0
  26. data/lib/edoxen/localization.rb +0 -12
  27. data/lib/edoxen/location.rb +15 -0
  28. data/lib/edoxen/meeting.rb +68 -0
  29. data/lib/edoxen/meeting_collection.rb +26 -0
  30. data/lib/edoxen/meeting_collection_metadata.rb +11 -0
  31. data/lib/edoxen/meeting_identifier.rb +0 -5
  32. data/lib/edoxen/meeting_localization.rb +15 -0
  33. data/lib/edoxen/meeting_relation.rb +12 -0
  34. data/lib/edoxen/person.rb +14 -0
  35. data/lib/edoxen/reference.rb +13 -0
  36. data/lib/edoxen/resolution.rb +21 -12
  37. data/lib/edoxen/resolution_collection.rb +0 -5
  38. data/lib/edoxen/resolution_date.rb +0 -5
  39. data/lib/edoxen/resolution_metadata.rb +5 -9
  40. data/lib/edoxen/resolution_relation.rb +0 -6
  41. data/lib/edoxen/schedule_item.rb +16 -0
  42. data/lib/edoxen/schema_validator.rb +12 -28
  43. data/lib/edoxen/source_url.rb +6 -8
  44. data/lib/edoxen/structured_identifier.rb +0 -5
  45. data/lib/edoxen/url.rb +0 -6
  46. data/lib/edoxen/version.rb +1 -1
  47. data/lib/edoxen.rb +17 -0
  48. data/schema/edoxen.yaml +7 -0
  49. data/schema/meeting.yaml +358 -0
  50. metadata +27 -2
@@ -0,0 +1,358 @@
1
+ ---
2
+ $schema: "http://json-schema.org/draft-07/schema#"
3
+ $id: "https://github.com/metanorma/edoxen/schema/meeting.yaml"
4
+ title: "Edoxen Meeting Schema"
5
+ description: |
6
+ Schema for validating Edoxen Meeting/Agenda YAML files.
7
+
8
+ Mirrors the canonical LutaML information model in
9
+ https://github.com/metanorma/edoxen-model/tree/main/models (meeting*.lutaml,
10
+ agenda*.lutaml, etc.).
11
+
12
+ The root accepts either a single Meeting or a MeetingCollection.
13
+
14
+ Enum lists in this schema are kept in lockstep with
15
+ Edoxen::Enums::* (Meeting side) by
16
+ `spec/edoxen/schema_meeting_enum_sync_spec.rb`.
17
+ type: object
18
+ oneOf:
19
+ - $ref: "#/$defs/MeetingCollection"
20
+ - $ref: "#/$defs/Meeting"
21
+
22
+ $defs:
23
+
24
+ # ====================================================================
25
+ # Reused from schema/edoxen.yaml (re-declared here so this file is
26
+ # self-contained — schema/meeting.yaml does not depend on
27
+ # schema/edoxen.yaml).
28
+ # ====================================================================
29
+
30
+ StructuredIdentifier:
31
+ type: object
32
+ description: "prefix + number identifier. A Meeting carries 1..*."
33
+ additionalProperties: false
34
+ required: [prefix, number]
35
+ properties:
36
+ prefix: { type: string }
37
+ number: { type: string }
38
+
39
+ SourceUrl:
40
+ type: object
41
+ description: "Per-language canonical source URL (PDF, page, register link)."
42
+ additionalProperties: false
43
+ required: [ref]
44
+ properties:
45
+ ref: { type: string }
46
+ format: { type: string }
47
+ language_code:
48
+ type: string
49
+ pattern: "^[a-z]{3}$"
50
+ kind:
51
+ $ref: "#/$defs/SourceUrlKind"
52
+
53
+ # ====================================================================
54
+ # Meeting-side primitive types.
55
+ # ====================================================================
56
+
57
+ DateRange:
58
+ type: object
59
+ description: "Start + end date pair for multi-day meetings."
60
+ additionalProperties: false
61
+ properties:
62
+ start:
63
+ type: string
64
+ format: date
65
+ end:
66
+ type: string
67
+ format: date
68
+
69
+ Location:
70
+ type: object
71
+ description: "Venue geography. Multi-venue meetings carry one Location per venue."
72
+ additionalProperties: false
73
+ properties:
74
+ name: { type: string }
75
+ address: { type: string }
76
+ link: { type: string }
77
+ phone: { type: string }
78
+ note: { type: string }
79
+ lat: { type: number }
80
+ lon: { type: number }
81
+
82
+ Person:
83
+ type: object
84
+ description: "Identity + role + affiliation + contact."
85
+ additionalProperties: false
86
+ properties:
87
+ name: { type: string }
88
+ role: { type: string }
89
+ affiliation: { type: string }
90
+ email: { type: string }
91
+ phone: { type: string }
92
+ orcid: { type: string }
93
+
94
+ HostRef:
95
+ type: object
96
+ description: "Typed reference to an organization that hosts or co-organizes a meeting."
97
+ additionalProperties: false
98
+ required: [ref]
99
+ properties:
100
+ ref: { type: string }
101
+ type:
102
+ $ref: "#/$defs/HostType"
103
+ role: { type: string }
104
+ contact:
105
+ $ref: "#/$defs/Person"
106
+
107
+ ScheduleItem:
108
+ type: object
109
+ description: "One entry in the meeting timetable."
110
+ additionalProperties: false
111
+ properties:
112
+ date:
113
+ type: string
114
+ format: date
115
+ time: { type: string }
116
+ event: { type: string }
117
+ description: { type: string }
118
+ room: { type: string }
119
+
120
+ Deadline:
121
+ type: object
122
+ description: "A time-bound requirement (registration, submission, etc.)."
123
+ additionalProperties: false
124
+ required: [date]
125
+ properties:
126
+ date:
127
+ type: string
128
+ format: date
129
+ description: { type: string }
130
+
131
+ Reference:
132
+ type: object
133
+ description: "Generic document reference (used by AgendaItem.references)."
134
+ additionalProperties: false
135
+ properties:
136
+ ref: { type: string }
137
+ kind: { type: string }
138
+ title: { type: string }
139
+
140
+ # ====================================================================
141
+ # Agenda side.
142
+ # ====================================================================
143
+
144
+ AgendaItem:
145
+ type: object
146
+ description: "One entry on an Agenda."
147
+ additionalProperties: false
148
+ properties:
149
+ label: { type: string }
150
+ kind:
151
+ $ref: "#/$defs/AgendaItemKind"
152
+ title: { type: string }
153
+ description: { type: string }
154
+ references:
155
+ type: array
156
+ items:
157
+ $ref: "#/$defs/Reference"
158
+ outcome:
159
+ $ref: "#/$defs/AgendaItemOutcome"
160
+ resolution_ref:
161
+ type: string
162
+ description: "URN of the resolution this item produced."
163
+
164
+ Agenda:
165
+ type: object
166
+ description: |
167
+ The business-order document of a Meeting. Versioned independently
168
+ of the Meeting via the `status` field (draft, final, amended).
169
+ additionalProperties: false
170
+ properties:
171
+ identifier:
172
+ type: array
173
+ items:
174
+ $ref: "#/$defs/StructuredIdentifier"
175
+ status:
176
+ $ref: "#/$defs/AgendaStatus"
177
+ source_doc: { type: string }
178
+ items:
179
+ type: array
180
+ items:
181
+ $ref: "#/$defs/AgendaItem"
182
+ opening_session:
183
+ $ref: "#/$defs/ScheduleItem"
184
+ closing_session:
185
+ $ref: "#/$defs/ScheduleItem"
186
+
187
+ # ====================================================================
188
+ # Meeting side.
189
+ # ====================================================================
190
+
191
+ MeetingRelation:
192
+ type: object
193
+ description: "Directed link between two meetings."
194
+ additionalProperties: false
195
+ required: [source, destination, type]
196
+ properties:
197
+ source:
198
+ $ref: "#/$defs/StructuredIdentifier"
199
+ destination:
200
+ $ref: "#/$defs/StructuredIdentifier"
201
+ type:
202
+ $ref: "#/$defs/MeetingRelationType"
203
+
204
+ MeetingLocalization:
205
+ type: object
206
+ description: "Per-language content for a Meeting."
207
+ additionalProperties: false
208
+ required: [language_code]
209
+ properties:
210
+ language_code:
211
+ type: string
212
+ pattern: "^[a-z]{3}$"
213
+ script:
214
+ type: string
215
+ pattern: "^[A-Z][a-z]{3}$"
216
+ title: { type: string }
217
+ general_area: { type: string }
218
+ practical_info: { type: string }
219
+
220
+ Meeting:
221
+ type: object
222
+ description: "A single Meeting (event)."
223
+ additionalProperties: false
224
+ required: [identifier, type]
225
+ properties:
226
+ identifier:
227
+ type: array
228
+ minItems: 1
229
+ items:
230
+ $ref: "#/$defs/StructuredIdentifier"
231
+ urn: { type: string }
232
+ ordinal: { type: integer }
233
+ type:
234
+ $ref: "#/$defs/MeetingType"
235
+ status:
236
+ $ref: "#/$defs/MeetingStatus"
237
+ year: { type: integer }
238
+
239
+ date_range:
240
+ $ref: "#/$defs/DateRange"
241
+
242
+ committee: { type: string }
243
+ committee_group: { type: string }
244
+
245
+ venues:
246
+ type: array
247
+ items:
248
+ $ref: "#/$defs/Location"
249
+ general_area: { type: string }
250
+ city: { type: string }
251
+ country_code:
252
+ type: string
253
+ pattern: "^[A-Z]{2}$"
254
+ virtual: { type: boolean }
255
+
256
+ chair: { $ref: "#/$defs/Person" }
257
+ secretary: { $ref: "#/$defs/Person" }
258
+ host: { type: string }
259
+ hosts:
260
+ type: array
261
+ items:
262
+ $ref: "#/$defs/HostRef"
263
+
264
+ source_urls:
265
+ type: array
266
+ items:
267
+ $ref: "#/$defs/SourceUrl"
268
+ landing_url: { type: string }
269
+ registration_url: { type: string }
270
+
271
+ agenda:
272
+ $ref: "#/$defs/Agenda"
273
+ schedule:
274
+ type: array
275
+ items:
276
+ $ref: "#/$defs/ScheduleItem"
277
+ deadlines:
278
+ type: array
279
+ items:
280
+ $ref: "#/$defs/Deadline"
281
+
282
+ localizations:
283
+ type: array
284
+ items:
285
+ $ref: "#/$defs/MeetingLocalization"
286
+ relations:
287
+ type: array
288
+ items:
289
+ $ref: "#/$defs/MeetingRelation"
290
+ resolution_refs:
291
+ type: array
292
+ items: { type: string }
293
+
294
+ MeetingCollectionMetadata:
295
+ type: object
296
+ description: "Display-level metadata for a MeetingCollection."
297
+ additionalProperties: false
298
+ properties:
299
+ title: { type: string }
300
+ source: { type: string }
301
+
302
+ MeetingCollection:
303
+ type: object
304
+ description: "Top-level wrapper for many Meetings in one file."
305
+ additionalProperties: false
306
+ required: [meetings]
307
+ properties:
308
+ metadata:
309
+ $ref: "#/$defs/MeetingCollectionMetadata"
310
+ meetings:
311
+ type: array
312
+ items:
313
+ $ref: "#/$defs/Meeting"
314
+
315
+ # ====================================================================
316
+ # Enums. Each value-list must equal the matching Edoxen::Enums::*
317
+ # frozen array; spec/edoxen/schema_meeting_enum_sync_spec.rb enforces.
318
+ # ====================================================================
319
+
320
+ MeetingType:
321
+ type: string
322
+ description: "Edoxen::Enums::MEETING_TYPE."
323
+ enum: [plenary, working_group, task_group, ad_hoc, joint, conference_session]
324
+
325
+ MeetingStatus:
326
+ type: string
327
+ description: "Edoxen::Enums::MEETING_STATUS."
328
+ enum: [upcoming, completed, cancelled]
329
+
330
+ AgendaStatus:
331
+ type: string
332
+ description: "Edoxen::Enums::AGENDA_STATUS."
333
+ enum: [draft, final, amended, cancelled, superseded]
334
+
335
+ AgendaItemKind:
336
+ type: string
337
+ description: "Edoxen::Enums::AGENDA_ITEM_KIND."
338
+ enum: [numbered, unnumbered, header, opening, closing]
339
+
340
+ AgendaItemOutcome:
341
+ type: string
342
+ description: "Edoxen::Enums::AGENDA_ITEM_OUTCOME."
343
+ enum: [discussed, resolved, deferred, adopted, withdrawn]
344
+
345
+ HostType:
346
+ type: string
347
+ description: "Edoxen::Enums::HOST_TYPE."
348
+ enum: [national_body, liaison, associate, organizer]
349
+
350
+ MeetingRelationType:
351
+ type: string
352
+ description: "Edoxen::Enums::MEETING_RELATION_TYPE."
353
+ enum: [continues_from, continues_to, joint_with, supersedes, superseded_by, rescheduled_from, rescheduled_to]
354
+
355
+ SourceUrlKind:
356
+ type: string
357
+ description: "Edoxen::Enums::SOURCE_URL_KIND."
358
+ enum: [agenda_pdf, minutes_pdf, resolutions_pdf, report_pdf, register_url, landing_page]
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.3.0
4
+ version: 0.5.0
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-06-30 00:00:00.000000000 Z
11
+ date: 2026-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json_schemer
@@ -73,31 +73,56 @@ files:
73
73
  - Gemfile
74
74
  - README.adoc
75
75
  - Rakefile
76
+ - TODO.meeting-agenda/01-design-decisions.md
77
+ - TODO.meeting-agenda/02-lutaml-canonical.md
78
+ - TODO.meeting-agenda/03-ruby-models.md
79
+ - TODO.meeting-agenda/04-schema.md
80
+ - TODO.meeting-agenda/05-fixtures.md
81
+ - TODO.meeting-agenda/06-specs.md
82
+ - TODO.meeting-agenda/07-cli.md
83
+ - TODO.meeting-agenda/08-docs.md
84
+ - TODO.meeting-agenda/09-verify-and-release.md
85
+ - TODO.meeting-agenda/10-future-enhancements.md
86
+ - TODO.meeting-agenda/README.md
76
87
  - edoxen.gemspec
77
88
  - exe/edoxen
78
89
  - lib/edoxen.rb
79
90
  - lib/edoxen/_metadata.rb.deprecated
80
91
  - lib/edoxen/action.rb
92
+ - lib/edoxen/agenda.rb
93
+ - lib/edoxen/agenda_item.rb
81
94
  - lib/edoxen/approval.rb
82
95
  - lib/edoxen/cli.rb
83
96
  - lib/edoxen/consideration.rb
97
+ - lib/edoxen/date_range.rb
98
+ - lib/edoxen/deadline.rb
84
99
  - lib/edoxen/enums.rb
85
100
  - lib/edoxen/error.rb
101
+ - lib/edoxen/host_ref.rb
86
102
  - lib/edoxen/localization.rb
103
+ - lib/edoxen/location.rb
87
104
  - lib/edoxen/meeting.rb
105
+ - lib/edoxen/meeting_collection.rb
106
+ - lib/edoxen/meeting_collection_metadata.rb
88
107
  - lib/edoxen/meeting_identifier.rb
108
+ - lib/edoxen/meeting_localization.rb
109
+ - lib/edoxen/meeting_relation.rb
110
+ - lib/edoxen/person.rb
111
+ - lib/edoxen/reference.rb
89
112
  - lib/edoxen/resolution.rb
90
113
  - lib/edoxen/resolution_collection.rb
91
114
  - lib/edoxen/resolution_date.rb
92
115
  - lib/edoxen/resolution_metadata.rb
93
116
  - lib/edoxen/resolution_relation.rb
94
117
  - lib/edoxen/resolution_set.rb
118
+ - lib/edoxen/schedule_item.rb
95
119
  - lib/edoxen/schema_validator.rb
96
120
  - lib/edoxen/source_url.rb
97
121
  - lib/edoxen/structured_identifier.rb
98
122
  - lib/edoxen/url.rb
99
123
  - lib/edoxen/version.rb
100
124
  - schema/edoxen.yaml
125
+ - schema/meeting.yaml
101
126
  - sig/edoxen.rbs
102
127
  homepage: https://github.com/metanorma/edoxen
103
128
  licenses: