edoxen 0.1.2 → 0.3.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.
data/schema/edoxen.yaml CHANGED
@@ -1,57 +1,32 @@
1
- # yaml-language-server: $schema=http://json-schema.org/draft-07/schema
2
1
  ---
3
2
  $schema: "http://json-schema.org/draft-07/schema#"
4
3
  $id: "https://github.com/metanorma/edoxen/schema/edoxen.yaml"
5
- title: "Edoxen Resolution Set Schema"
6
- description: "Schema for validating Edoxen resolution set YAML files"
4
+ title: "Edoxen Resolution Collection Schema"
5
+ description: |
6
+ Schema for validating Edoxen ResolutionCollection YAML files.
7
+
8
+ Mirrors the canonical LutaML information model in
9
+ https://github.com/metanorma/edoxen-model/tree/main/models .
10
+
11
+ The enum constants declared under `$defs` (ActionType,
12
+ ConsiderationType, ApprovalType, ApprovalDegree, ResolutionType,
13
+ ResolutionDateType, ResolutionRelationType, UrlKind) are the
14
+ authoritative wire values. `spec/edoxen/schema_enum_sync_spec.rb`
15
+ asserts each one is character-for-character identical to the
16
+ corresponding `Edoxen::Enums::*` frozen array.
17
+
18
+ Trade-off: json_schemer's `valid_values` is not populated when an
19
+ `enum` is reached via `$ref`, so the validator's enum-violation
20
+ message degrades to "value ... is not one of: (see schema)". This
21
+ is documented in `Edoxen::SchemaValidator#format_message`.
7
22
  type: object
23
+ additionalProperties: false
8
24
 
9
25
  properties:
10
26
  metadata:
11
- type: object
12
- description: "Metadata about the resolution set"
13
- properties:
14
- title:
15
- type: string
16
- description: "Title of the resolution set"
17
- identifier:
18
- type: string
19
- description: "Identifier for the resolution set (e.g., '2019-01')"
20
- dates:
21
- type: array
22
- description: "Array of dates related to the set"
23
- items:
24
- $ref: "#/$defs/ComplexDate"
25
- source:
26
- type: string
27
- description: "Source organization or secretariat"
28
- venue:
29
- type: string
30
- description: "Meeting venue"
31
- chair:
32
- type: string
33
- description: "Meeting chair"
34
- attendees:
35
- type: array
36
- items:
37
- type: string
38
- description: "List of attendees"
39
- apologies:
40
- type: array
41
- items:
42
- type: string
43
- description: "List of apologies"
44
- urls:
45
- type: array
46
- items:
47
- $ref: "#/$defs/Url"
48
- description: "Array of URLs related to the resolution set"
49
-
50
- additionalProperties: false
51
-
27
+ $ref: "#/$defs/ResolutionMetadata"
52
28
  resolutions:
53
29
  type: array
54
- description: "Array of resolutions"
55
30
  items:
56
31
  $ref: "#/$defs/Resolution"
57
32
 
@@ -59,363 +34,349 @@ required:
59
34
  - resolutions
60
35
 
61
36
  $defs:
62
- Resolution:
63
- type: object
64
- description: "A single resolution"
65
- properties:
66
- identifier:
67
- oneOf:
68
- - type: string
69
- - type: integer
70
- description: "Resolution identifier (e.g., '2019-01' or 1)"
71
-
72
- title:
73
- type: string
74
- description: "Resolution title"
75
-
76
- type:
77
- type: string
78
- enum:
79
- - "resolution"
80
- - "recommendation"
81
- - "decision"
82
- - "declaration"
83
- description: "Type of resolution"
84
-
85
- categories:
86
- type: array
87
- items:
88
- type: string
89
- description: "Resolution categories"
90
-
91
- subject:
92
- type: string
93
- description: "Subject or scope of the resolution"
94
37
 
95
- dates:
96
- type: array
97
- items:
98
- $ref: "#/$defs/ComplexDate"
99
- description: "Array of relevant dates with start/end structure"
38
+ # ====================================================================
39
+ # Identifiers and references.
40
+ # ====================================================================
100
41
 
101
- message:
42
+ StructuredIdentifier:
43
+ type: object
44
+ description: "A resolution identifier (prefix + number). A Resolution may carry 1..* of these."
45
+ additionalProperties: false
46
+ required: [prefix, number]
47
+ properties:
48
+ prefix:
102
49
  type: string
103
- description: "Resolution message"
104
-
105
- considering:
50
+ description: "Authority prefix, e.g. 'ISO', 'OIML', 'CIML'."
51
+ number:
106
52
  type: string
107
- description: "Considering clause"
108
-
109
- considerations:
110
- type: array
111
- items:
112
- $ref: "#/$defs/Consideration"
113
- description: "Array of considerations leading to the resolution"
114
-
115
- approvals:
116
- type: array
117
- items:
118
- $ref: "#/$defs/Approval"
119
- description: "Approval information"
120
-
121
- actions:
122
- type: array
123
- items:
124
- $ref: "#/$defs/Action"
125
- description: "Actions taken in the resolution"
126
-
127
- urls:
128
- type: array
129
- items:
130
- $ref: "#/$defs/Url"
131
- description: "Array of URLs related to the resolution"
132
-
133
- meeting:
134
- $ref: "#/$defs/MeetingIdentifier"
135
- description: "Meeting information"
53
+ description: "Resolution number issued under that prefix."
136
54
 
137
- relations:
138
- type: array
139
- items:
140
- $ref: "#/$defs/ResolutionRelations"
141
- description: "Relations to other resolutions"
142
-
143
- additionalProperties: false
144
- required:
145
- - subject
146
- - identifier
147
- - actions
148
-
149
- ComplexDate:
55
+ MeetingIdentifier:
150
56
  type: object
151
- description: "Date with start and end"
57
+ description: "Identifies the meeting a Resolution belongs to."
58
+ additionalProperties: false
152
59
  properties:
153
- start:
60
+ venue:
154
61
  type: string
155
- format: date
156
- description: "Start date or single date if no end date"
157
- end:
62
+ description: "Meeting venue name (free text)."
63
+ date:
158
64
  type: string
159
65
  format: date
160
- description: "End date (optional)"
161
- kind:
162
- type: string
163
- enum:
164
- - "enactment"
165
- - "ballot"
166
- - "effective"
167
- - "decision"
168
- - "meeting"
169
- description: "Kind of date (e.g., enactment, ballot, effective)"
170
- required:
171
- - kind
172
- additionalProperties: false
66
+ description: "Meeting date."
173
67
 
174
68
  Url:
175
69
  type: object
176
- description: "URL with kind and reference"
70
+ description: "URL with a kind (access / report) and an optional format hint."
71
+ additionalProperties: false
72
+ required: [kind, ref]
177
73
  properties:
178
74
  kind:
179
- type: string
180
- enum:
181
- - "access"
182
- - "report"
183
- description: "Kind of URL (e.g., access, report)"
75
+ $ref: "#/$defs/UrlKind"
184
76
  ref:
185
77
  type: string
186
- description: "Reference URL"
187
78
  format:
188
79
  type: string
189
- description: "Format of the URL (e.g., 'html', 'pdf')"
190
- additionalProperties: false
191
80
 
192
- Consideration:
81
+ ResolutionRelation:
193
82
  type: object
194
- description: "A consideration leading to a resolution"
83
+ description: "Directed relation between two resolutions identified by their StructuredIdentifier."
84
+ additionalProperties: false
85
+ required: [source, destination, type]
195
86
  properties:
87
+ source:
88
+ $ref: "#/$defs/StructuredIdentifier"
89
+ destination:
90
+ $ref: "#/$defs/StructuredIdentifier"
196
91
  type:
197
- type: string
198
- enum:
199
- - "acknowledging"
200
- - "following"
201
- - "basing"
202
- - "considering"
203
- - "identifying"
204
- - "according"
205
- - "noting"
206
- - "recalling"
207
- - "recognises"
208
- - "recognising"
209
- - "recognizing"
210
- description: "Type of consideration"
92
+ $ref: "#/$defs/ResolutionRelationType"
211
93
 
212
- dates:
213
- type: array
214
- items:
215
- $ref: "#/$defs/ComplexDate"
94
+ # ====================================================================
95
+ # Date carriers.
96
+ # ====================================================================
216
97
 
217
- message:
98
+ ResolutionDate:
99
+ type: object
100
+ description: "Date with semantic kind (adoption / drafted / discussed)."
101
+ additionalProperties: false
102
+ required: [date, type]
103
+ properties:
104
+ date:
218
105
  type: string
219
- description: "Consideration text"
106
+ format: date
107
+ description: "The date itself."
108
+ type:
109
+ $ref: "#/$defs/ResolutionDateType"
220
110
 
221
- subject:
222
- type: string
223
- description: "Subject of the consideration"
111
+ # ====================================================================
112
+ # Per-localization sub-structures. Each is owned by exactly one
113
+ # Language; the language_code discriminator lives on Localization.
114
+ # ====================================================================
224
115
 
225
- required:
226
- - type
227
- - message
116
+ Action:
117
+ type: object
118
+ description: "A verb + one effective date + human-readable message."
228
119
  additionalProperties: false
120
+ required: [type, message, date_effective]
121
+ properties:
122
+ type:
123
+ $ref: "#/$defs/ActionType"
124
+ date_effective:
125
+ $ref: "#/$defs/ResolutionDate"
126
+ message:
127
+ type: string
229
128
 
230
129
  Approval:
231
130
  type: object
232
- description: "Approval information for a resolution"
131
+ description: "Approval record: vote type, consensus degree, date, message."
132
+ additionalProperties: false
133
+ required: [type, degree, date]
233
134
  properties:
234
135
  type:
235
- type: string
236
- enum:
237
- - "affirmative"
238
- - "negative"
239
- description: "Type of approval"
240
-
136
+ $ref: "#/$defs/ApprovalType"
241
137
  degree:
242
- type: string
243
- enum:
244
- - "unanimous"
245
- - "majority"
246
- - "minority"
247
- description: "Degree of approval"
248
-
138
+ $ref: "#/$defs/ApprovalDegree"
139
+ date:
140
+ $ref: "#/$defs/ResolutionDate"
249
141
  message:
250
142
  type: string
251
- description: "Approval details"
252
-
253
- additionalProperties: false
254
143
 
255
- Action:
144
+ Consideration:
256
145
  type: object
257
- description: "An action taken in a resolution"
258
- required:
259
- - type
260
- - message
146
+ description: "The basis for a Resolution: a verb + one effective date + reasoning."
147
+ additionalProperties: false
148
+ required: [type, message, date_effective]
261
149
  properties:
262
150
  type:
263
- type: string
264
- enum:
265
- - "accepts"
266
- - "acknowledges"
267
- - "adoption"
268
- - "adopts"
269
- - "agrees"
270
- - "allocates"
271
- - "appoints"
272
- - "appreciates"
273
- - "appreciation"
274
- - "approves"
275
- - "asks"
276
- - "assigns"
277
- - "chairs"
278
- - "communicating"
279
- - "confirms"
280
- - "considers"
281
- - "consults"
282
- - "creates"
283
- - "decides"
284
- - "defines"
285
- - "delegates"
286
- - "delivering"
287
- - "directs"
288
- - "disbands"
289
- - "drafting"
290
- - "elects"
291
- - "empowers"
292
- - "encourages"
293
- - "endorses"
294
- - "estabilishes"
295
- - "establishes"
296
- - "gathering"
297
- - "identifies"
298
- - "instructs"
299
- - "investigates"
300
- - "nominates"
301
- - "notes"
302
- - "notifies"
303
- - "recognises"
304
- - "recognizes"
305
- - "reminds"
306
- - "recommends"
307
- - "registers"
308
- - "regrets"
309
- - "request"
310
- - "replaces"
311
- - "requests"
312
- - "resolves"
313
- - "restates"
314
- - "scopes"
315
- - "secures"
316
- - "sends"
317
- - "supports"
318
- - "thanks"
319
- - "welcomes"
320
- - "withdraws"
321
- description: "Type of action"
322
-
323
- dates:
324
- type: array
325
- items:
326
- $ref: "#/$defs/ComplexDate"
327
- description: "Dates of the action"
328
-
151
+ $ref: "#/$defs/ConsiderationType"
152
+ date_effective:
153
+ $ref: "#/$defs/ResolutionDate"
329
154
  message:
330
155
  type: string
331
- description: "Action text"
332
156
 
157
+ Localization:
158
+ type: object
159
+ description: |
160
+ A monolingual rendering of a Resolution. Mirrors the glossarist
161
+ LocalizedConcept pattern: language-agnostic fields live on the
162
+ parent Resolution; per-language content lives here.
163
+ additionalProperties: false
164
+ required: [language_code]
165
+ properties:
166
+ language_code:
167
+ type: string
168
+ pattern: "^[a-z]{3}$"
169
+ description: "ISO 639-3 three-letter language code (eng, fra, deu, spa, jpn, ...)."
170
+ script:
171
+ type: string
172
+ pattern: "^[A-Z][a-z]{3}$"
173
+ description: "ISO 15924 four-letter script code (Latn, Cyrl, Hant, Arab)."
174
+ title:
175
+ type: string
333
176
  subject:
334
177
  type: string
335
- description: "Subject of the action"
336
-
337
- degree:
178
+ message:
338
179
  type: string
339
- description: "Degree of the action"
340
- enum:
341
- - "unanimous"
342
- - "majority"
343
- - "minority"
344
-
345
- additionalProperties: false
346
-
347
- MeetingIdentifier:
348
- type: object
349
- description: "Meeting identification information"
350
- properties:
351
- venue:
180
+ considering:
352
181
  type: string
353
- description: "Meeting venue"
354
-
355
- dates:
182
+ considerations:
356
183
  type: array
357
- description: "Meeting dates"
358
184
  items:
359
- $ref: "#/$defs/ComplexDate"
360
-
361
- identifier:
362
- type: string
363
- description: "Meeting identifier"
364
-
365
- additionalProperties: false
185
+ $ref: "#/$defs/Consideration"
186
+ approvals:
187
+ type: array
188
+ items:
189
+ $ref: "#/$defs/Approval"
190
+ actions:
191
+ type: array
192
+ items:
193
+ $ref: "#/$defs/Action"
366
194
 
367
- ResolutionRelations:
195
+ SourceUrl:
368
196
  type: object
369
- description: "Relation between resolutions"
197
+ description: "Per-language canonical source URL (e.g. one PDF per language)."
198
+ additionalProperties: false
199
+ required: [ref, format, language_code]
370
200
  properties:
371
- type:
201
+ ref:
372
202
  type: string
373
- enum:
374
- - "supersedes"
375
- - "amends"
376
- - "references"
377
- - "replaces"
378
- - "updates"
379
- description: "Type of relation"
380
-
381
- target:
203
+ description: "The URL string."
204
+ format:
382
205
  type: string
383
- description: "Target resolution identifier"
384
-
385
- description:
206
+ description: "Document format, e.g. 'pdf', 'html'."
207
+ language_code:
386
208
  type: string
387
- description: "Description of the relation"
209
+ pattern: "^[a-z]{3}$"
388
210
 
389
- additionalProperties: false
211
+ # ====================================================================
212
+ # Top-level structures.
213
+ # ====================================================================
390
214
 
391
- StructuredIdentifier:
215
+ Resolution:
392
216
  type: object
393
- description: "Structured identifier with prefix and number"
217
+ description: |
218
+ A formal Resolution. Language-agnostic admin fields live here;
219
+ every translatable field is wrapped inside `localizations[]`
220
+ (one entry per available language; at least one is required).
221
+ additionalProperties: false
222
+ required: [identifier, localizations]
394
223
  properties:
395
- prefix:
224
+ identifier:
225
+ type: array
226
+ minItems: 1
227
+ items:
228
+ $ref: "#/$defs/StructuredIdentifier"
229
+ type:
230
+ $ref: "#/$defs/ResolutionType"
231
+ doi:
396
232
  type: string
397
- description: "Identifier prefix"
398
-
399
- number:
400
- oneOf:
401
- - type: string
402
- - type: integer
403
- description: "Identifier number"
404
-
405
- additionalProperties: false
233
+ urn:
234
+ type: string
235
+ agenda_item:
236
+ type: string
237
+ dates:
238
+ type: array
239
+ items:
240
+ $ref: "#/$defs/ResolutionDate"
241
+ categories:
242
+ type: array
243
+ items:
244
+ type: string
245
+ meeting:
246
+ $ref: "#/$defs/MeetingIdentifier"
247
+ relations:
248
+ type: array
249
+ items:
250
+ $ref: "#/$defs/ResolutionRelation"
251
+ urls:
252
+ type: array
253
+ items:
254
+ $ref: "#/$defs/Url"
255
+ localizations:
256
+ type: array
257
+ minItems: 1
258
+ items:
259
+ $ref: "#/$defs/Localization"
406
260
 
407
- SubjectBody:
261
+ ResolutionMetadata:
408
262
  type: object
409
- description: "Subject body information"
263
+ description: "Collection-level metadata (title, meeting date, source, source URLs, host venue)."
264
+ additionalProperties: false
410
265
  properties:
411
- name:
266
+ title:
412
267
  type: string
413
- description: "Name of the subject body"
414
-
415
- address:
268
+ description: "Default title (no language). For multilingual, use `title_localized[]`."
269
+ title_localized:
270
+ type: array
271
+ items:
272
+ $ref: "#/$defs/Localization"
273
+ description: "Per-language title records (parallel pattern to Resolution#localizations)."
274
+ date:
416
275
  type: string
417
- description: "Address of the subject body"
418
-
419
- additionalProperties: false
420
-
421
- additionalProperties: false
276
+ format: date
277
+ description: "Meeting date."
278
+ source:
279
+ type: string
280
+ description: "Source organization / secretariat that issued the collection."
281
+ source_urls:
282
+ type: array
283
+ items:
284
+ $ref: "#/$defs/SourceUrl"
285
+ description: "Canonical URLs to the source PDFs in each available language."
286
+ city:
287
+ type: string
288
+ description: "IATA city code (3-letter, e.g. BER, CPT, PAR) of the host city."
289
+ country_code:
290
+ type: string
291
+ description: "ISO 3166-1 alpha-2 country code (2-letter, e.g. DE, FR, JP) of the host country."
292
+
293
+ # ====================================================================
294
+ # Enums. Each is referenced by its $ref name above. The schema
295
+ # <-> Ruby enum sync spec asserts each value-list matches the
296
+ # corresponding Edoxen::Enums::* frozen array.
297
+ # ====================================================================
298
+
299
+ ActionType:
300
+ type: string
301
+ description: "Edoxen::Enums::ACTION_TYPE — LUTAML action.lutaml (deduped)."
302
+ enum:
303
+ - adopts
304
+ - thanks
305
+ - approves
306
+ - decides
307
+ - declares
308
+ - asks
309
+ - invites
310
+ - resolves
311
+ - confirms
312
+ - welcomes
313
+ - recommends
314
+ - requests
315
+ - congratulates
316
+ - instructs
317
+ - urges
318
+ - appoints
319
+ - calls-upon
320
+ - encourages
321
+ - affirms
322
+ - elects
323
+ - authorizes
324
+ - charges
325
+ - states
326
+ - remarks
327
+ - judges
328
+ - sanctions
329
+ - abrogates
330
+ - empowers
331
+
332
+ ConsiderationType:
333
+ type: string
334
+ description: "Edoxen::Enums::CONSIDERATION_TYPE — LUTAML consideration.lutaml (deduped)."
335
+ enum:
336
+ - having
337
+ - noting
338
+ - recognizing
339
+ - acknowledging
340
+ - recalling
341
+ - reaffirming
342
+ - considering
343
+ - taking-into-account
344
+ - pursuant-to
345
+ - bearing-in-mind
346
+ - emphasizing
347
+ - concerned
348
+ - accepts
349
+ - observing
350
+ - referring
351
+ - acting
352
+ - empowers
353
+
354
+ ApprovalType:
355
+ type: string
356
+ description: "Edoxen::Enums::APPROVAL_TYPE — LUTAML approval_type.lutaml."
357
+ enum: [affirmative, negative]
358
+
359
+ ApprovalDegree:
360
+ type: string
361
+ description: "Edoxen::Enums::APPROVAL_DEGREE — LUTAML approval_degree.lutaml."
362
+ enum: [unanimous, majority, minority]
363
+
364
+ ResolutionType:
365
+ type: string
366
+ description: "Edoxen::Enums::RESOLUTION_TYPE — LUTAML resolution_type.lutaml."
367
+ enum: [resolution, recommendation, decision, declaration]
368
+
369
+ ResolutionDateType:
370
+ type: string
371
+ description: "Edoxen::Enums::RESOLUTION_DATE_TYPE — LUTAML resolution_date_type.lutaml."
372
+ enum: [adoption, drafted, discussed]
373
+
374
+ ResolutionRelationType:
375
+ type: string
376
+ description: "Edoxen::Enums::RESOLUTION_RELATION_TYPE — LUTAML resolution_relation_type.lutaml."
377
+ enum: [annexOf, hasAnnex, updates, refines, replaces, considers]
378
+
379
+ UrlKind:
380
+ type: string
381
+ description: "Edoxen::Enums::URL_KIND."
382
+ enum: [access, report]