edoxen 0.3.1 → 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.
@@ -2,11 +2,15 @@
2
2
 
3
3
  module Edoxen
4
4
  # Per-language canonical source URL (e.g. one PDF per language).
5
- # Carries the URL ref, its format, and the ISO 639-3 language_code the URL
6
- # is the canonical source for.
5
+ # Carries the URL ref, its format, the ISO 639-3 language_code the URL
6
+ # is the canonical source for, and an optional `kind` discriminator
7
+ # (agenda_pdf, minutes_pdf, resolutions_pdf, ...) used by the Meeting
8
+ # model. Existing Resolution fixtures without `kind` still parse —
9
+ # the field is optional.
7
10
  class SourceUrl < Lutaml::Model::Serializable
8
11
  attribute :ref, :string
9
12
  attribute :format, :string
10
13
  attribute :language_code, :string
14
+ attribute :kind, :string, values: Enums::SOURCE_URL_KIND
11
15
  end
12
16
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Edoxen
4
- VERSION = "0.3.1"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/edoxen.rb CHANGED
@@ -40,6 +40,22 @@ module Edoxen
40
40
  autoload :ResolutionMetadata, "edoxen/resolution_metadata"
41
41
  autoload :ResolutionCollection, "edoxen/resolution_collection"
42
42
 
43
+ # Meeting / Agenda side. Mirrors edoxen-model/models/meeting*.lutaml.
44
+ autoload :DateRange, "edoxen/date_range"
45
+ autoload :Location, "edoxen/location"
46
+ autoload :Person, "edoxen/person"
47
+ autoload :HostRef, "edoxen/host_ref"
48
+ autoload :ScheduleItem, "edoxen/schedule_item"
49
+ autoload :Deadline, "edoxen/deadline"
50
+ autoload :Reference, "edoxen/reference"
51
+ autoload :AgendaItem, "edoxen/agenda_item"
52
+ autoload :Agenda, "edoxen/agenda"
53
+ autoload :MeetingRelation, "edoxen/meeting_relation"
54
+ autoload :MeetingLocalization, "edoxen/meeting_localization"
55
+ autoload :Meeting, "edoxen/meeting"
56
+ autoload :MeetingCollectionMetadata, "edoxen/meeting_collection_metadata"
57
+ autoload :MeetingCollection, "edoxen/meeting_collection"
58
+
43
59
  # Services.
44
60
  autoload :SchemaValidator, "edoxen/schema_validator"
45
61
  autoload :Cli, "edoxen/cli"
data/schema/edoxen.yaml CHANGED
@@ -207,6 +207,10 @@ $defs:
207
207
  language_code:
208
208
  type: string
209
209
  pattern: "^[a-z]{3}$"
210
+ kind:
211
+ type: string
212
+ description: "Optional discriminator (agenda_pdf, minutes_pdf, ...)."
213
+ enum: [agenda_pdf, minutes_pdf, resolutions_pdf, report_pdf, register_url, landing_page]
210
214
 
211
215
  # ====================================================================
212
216
  # Top-level structures.
@@ -289,6 +293,9 @@ $defs:
289
293
  country_code:
290
294
  type: string
291
295
  description: "ISO 3166-1 alpha-2 country code (2-letter, e.g. DE, FR, JP) of the host country."
296
+ meeting_urn:
297
+ type: string
298
+ description: "URN back-reference to the Meeting that produced this collection."
292
299
 
293
300
  # ====================================================================
294
301
  # Enums. Each is referenced by its $ref name above. The schema
@@ -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.1
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: