edoxen 0.1.1 → 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,37 +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
4
  title: "Edoxen Resolution Collection Schema"
6
- description: "Schema for validating Edoxen resolution collection YAML files"
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 collection"
13
- properties:
14
- title:
15
- type: string
16
- description: "Title of the resolution collection"
17
- date:
18
- type: string
19
- format: date
20
- description: "Date of the meeting or collection (YYYY-MM-DD)"
21
- source:
22
- type: string
23
- description: "Source organization or secretariat"
24
- venue:
25
- type: string
26
- description: "Meeting venue"
27
- chair:
28
- type: string
29
- description: "Meeting chair"
30
- additionalProperties: false
31
-
27
+ $ref: "#/$defs/ResolutionMetadata"
32
28
  resolutions:
33
29
  type: array
34
- description: "Array of resolutions"
35
30
  items:
36
31
  $ref: "#/$defs/Resolution"
37
32
 
@@ -39,248 +34,349 @@ required:
39
34
  - resolutions
40
35
 
41
36
  $defs:
42
- Resolution:
37
+
38
+ # ====================================================================
39
+ # Identifiers and references.
40
+ # ====================================================================
41
+
42
+ StructuredIdentifier:
43
43
  type: object
44
- description: "A single resolution"
44
+ description: "A resolution identifier (prefix + number). A Resolution may carry 1..* of these."
45
+ additionalProperties: false
46
+ required: [prefix, number]
45
47
  properties:
46
- identifier:
47
- oneOf:
48
- - type: string
49
- - type: integer
50
- description: "Resolution identifier (e.g., '2019-01' or 1)"
51
-
52
- title:
48
+ prefix:
53
49
  type: string
54
- description: "Resolution title"
55
-
56
- type:
50
+ description: "Authority prefix, e.g. 'ISO', 'OIML', 'CIML'."
51
+ number:
57
52
  type: string
58
- enum:
59
- - "resolution"
60
- - "recommendation"
61
- - "decision"
62
- - "declaration"
63
- description: "Type of resolution"
53
+ description: "Resolution number issued under that prefix."
64
54
 
65
- category:
55
+ MeetingIdentifier:
56
+ type: object
57
+ description: "Identifies the meeting a Resolution belongs to."
58
+ additionalProperties: false
59
+ properties:
60
+ venue:
66
61
  type: string
67
- description: "Resolution category"
68
-
69
- subject:
62
+ description: "Meeting venue name (free text)."
63
+ date:
70
64
  type: string
71
- description: "Subject or scope of the resolution"
72
-
73
- dates:
74
- type: array
75
- items:
76
- type: string
77
- format: date
78
- description: "Array of relevant dates"
79
-
80
- considerations:
81
- type: array
82
- items:
83
- $ref: "#/$defs/Consideration"
84
- description: "Considerations leading to the resolution"
85
-
86
- approvals:
87
- type: array
88
- items:
89
- $ref: "#/$defs/Approval"
90
- description: "Approval information"
91
-
92
- actions:
93
- type: array
94
- items:
95
- $ref: "#/$defs/Action"
96
- description: "Actions taken in the resolution"
97
-
98
- meeting:
99
- $ref: "#/$defs/MeetingIdentifier"
100
- description: "Meeting information"
101
-
102
- relationships:
103
- type: array
104
- items:
105
- $ref: "#/$defs/ResolutionRelationship"
106
- description: "Relationships to other resolutions"
65
+ format: date
66
+ description: "Meeting date."
107
67
 
108
- required:
109
- - title
68
+ Url:
69
+ type: object
70
+ description: "URL with a kind (access / report) and an optional format hint."
110
71
  additionalProperties: false
72
+ required: [kind, ref]
73
+ properties:
74
+ kind:
75
+ $ref: "#/$defs/UrlKind"
76
+ ref:
77
+ type: string
78
+ format:
79
+ type: string
111
80
 
112
- Consideration:
81
+ ResolutionRelation:
113
82
  type: object
114
- 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]
115
86
  properties:
87
+ source:
88
+ $ref: "#/$defs/StructuredIdentifier"
89
+ destination:
90
+ $ref: "#/$defs/StructuredIdentifier"
116
91
  type:
117
- type: string
118
- enum:
119
- - "having"
120
- - "noting"
121
- - "recognizing"
122
- - "acknowledging"
123
- - "considering"
124
- - "recalling"
125
- - "welcoming"
126
- - "appreciating"
127
- description: "Type of consideration"
92
+ $ref: "#/$defs/ResolutionRelationType"
128
93
 
129
- date_effective:
130
- type: string
131
- format: date
132
- description: "Effective date of the consideration"
94
+ # ====================================================================
95
+ # Date carriers.
96
+ # ====================================================================
133
97
 
134
- 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:
135
105
  type: string
136
- description: "Consideration text"
106
+ format: date
107
+ description: "The date itself."
108
+ type:
109
+ $ref: "#/$defs/ResolutionDateType"
137
110
 
138
- subject:
139
- type: string
140
- 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
+ # ====================================================================
141
115
 
116
+ Action:
117
+ type: object
118
+ description: "A verb + one effective date + human-readable message."
142
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
143
128
 
144
129
  Approval:
145
130
  type: object
146
- description: "Approval information for a resolution"
131
+ description: "Approval record: vote type, consensus degree, date, message."
132
+ additionalProperties: false
133
+ required: [type, degree, date]
147
134
  properties:
148
135
  type:
149
- type: string
150
- enum:
151
- - "affirmative"
152
- - "negative"
153
- description: "Type of approval"
154
-
136
+ $ref: "#/$defs/ApprovalType"
155
137
  degree:
156
- type: string
157
- enum:
158
- - "unanimous"
159
- - "majority"
160
- - "minority"
161
- description: "Degree of approval"
162
-
138
+ $ref: "#/$defs/ApprovalDegree"
139
+ date:
140
+ $ref: "#/$defs/ResolutionDate"
163
141
  message:
164
142
  type: string
165
- description: "Approval details"
166
-
167
- additionalProperties: false
168
143
 
169
- Action:
144
+ Consideration:
170
145
  type: object
171
- description: "An action taken in a resolution"
146
+ description: "The basis for a Resolution: a verb + one effective date + reasoning."
147
+ additionalProperties: false
148
+ required: [type, message, date_effective]
172
149
  properties:
173
150
  type:
174
- type: string
175
- enum:
176
- - "adopts"
177
- - "thanks"
178
- - "approves"
179
- - "decides"
180
- - "declares"
181
- - "resolves"
182
- - "requests"
183
- - "recommends"
184
- - "encourages"
185
- - "welcomes"
186
- - "notes"
187
- - "confirms"
188
- - "reaffirms"
189
- - "withdraws"
190
- - "abrogates"
191
- - "establishes"
192
- - "appoints"
193
- - "nominates"
194
- - "extends"
195
- - "initiates"
196
- description: "Type of action"
197
-
151
+ $ref: "#/$defs/ConsiderationType"
198
152
  date_effective:
199
- type: string
200
- format: date
201
- description: "Effective date of the action"
202
-
153
+ $ref: "#/$defs/ResolutionDate"
203
154
  message:
204
155
  type: string
205
- description: "Action text"
206
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
207
176
  subject:
208
177
  type: string
209
- description: "Subject of the action"
210
-
211
- additionalProperties: false
178
+ message:
179
+ type: string
180
+ considering:
181
+ type: string
182
+ considerations:
183
+ type: array
184
+ items:
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"
212
194
 
213
- MeetingIdentifier:
195
+ SourceUrl:
214
196
  type: object
215
- description: "Meeting identification information"
197
+ description: "Per-language canonical source URL (e.g. one PDF per language)."
198
+ additionalProperties: false
199
+ required: [ref, format, language_code]
216
200
  properties:
217
- venue:
201
+ ref:
218
202
  type: string
219
- description: "Meeting venue"
220
-
221
- date:
203
+ description: "The URL string."
204
+ format:
222
205
  type: string
223
- format: date
224
- description: "Meeting date"
225
-
226
- identifier:
206
+ description: "Document format, e.g. 'pdf', 'html'."
207
+ language_code:
227
208
  type: string
228
- description: "Meeting identifier"
209
+ pattern: "^[a-z]{3}$"
229
210
 
230
- additionalProperties: false
211
+ # ====================================================================
212
+ # Top-level structures.
213
+ # ====================================================================
231
214
 
232
- ResolutionRelationship:
215
+ Resolution:
233
216
  type: object
234
- description: "Relationship between resolutions"
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]
235
223
  properties:
224
+ identifier:
225
+ type: array
226
+ minItems: 1
227
+ items:
228
+ $ref: "#/$defs/StructuredIdentifier"
236
229
  type:
230
+ $ref: "#/$defs/ResolutionType"
231
+ doi:
237
232
  type: string
238
- enum:
239
- - "supersedes"
240
- - "amends"
241
- - "references"
242
- - "replaces"
243
- - "updates"
244
- description: "Type of relationship"
245
-
246
- target:
233
+ urn:
247
234
  type: string
248
- description: "Target resolution identifier"
249
-
250
- description:
235
+ agenda_item:
251
236
  type: string
252
- description: "Description of the relationship"
253
-
254
- additionalProperties: false
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"
255
260
 
256
- StructuredIdentifier:
261
+ ResolutionMetadata:
257
262
  type: object
258
- description: "Structured identifier with prefix and number"
259
- properties:
260
- prefix:
261
- type: string
262
- description: "Identifier prefix"
263
-
264
- number:
265
- oneOf:
266
- - type: string
267
- - type: integer
268
- description: "Identifier number"
269
-
263
+ description: "Collection-level metadata (title, meeting date, source, source URLs, host venue)."
270
264
  additionalProperties: false
271
-
272
- SubjectBody:
273
- type: object
274
- description: "Subject body information"
275
265
  properties:
276
- name:
266
+ title:
277
267
  type: string
278
- description: "Name of the subject body"
279
-
280
- 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:
281
275
  type: string
282
- description: "Address of the subject body"
283
-
284
- additionalProperties: false
285
-
286
- 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]
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edoxen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.3.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: 2025-07-18 00:00:00.000000000 Z
11
+ date: 2026-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json_schemer
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: lutaml-model
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,39 +38,64 @@ dependencies:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0.7'
27
- description: 'Edoxen provides a Ruby library for working with resolution models, allowing
28
- users to create, manipulate, and serialize resolution data in a structured format.
29
- It is built on top of the lutaml-model serialization framework, which provides a
30
- flexible and extensible way to define data models and serialize them to YAML or
31
- JSON formats.
32
-
33
- '
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ 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.
34
61
  email:
35
62
  - open.source@ribose.com
36
- executables: []
63
+ executables:
64
+ - edoxen
37
65
  extensions: []
38
66
  extra_rdoc_files: []
39
67
  files:
40
68
  - ".rspec"
41
69
  - ".rubocop.yml"
42
70
  - ".rubocop_todo.yml"
71
+ - CLAUDE.md
43
72
  - CODE_OF_CONDUCT.md
44
73
  - Gemfile
45
74
  - README.adoc
46
75
  - Rakefile
47
76
  - edoxen.gemspec
77
+ - exe/edoxen
48
78
  - lib/edoxen.rb
79
+ - lib/edoxen/_metadata.rb.deprecated
49
80
  - lib/edoxen/action.rb
50
81
  - lib/edoxen/approval.rb
82
+ - lib/edoxen/cli.rb
51
83
  - lib/edoxen/consideration.rb
84
+ - lib/edoxen/enums.rb
85
+ - lib/edoxen/error.rb
86
+ - lib/edoxen/localization.rb
52
87
  - lib/edoxen/meeting.rb
53
- - lib/edoxen/meeting_identfier.rb
88
+ - lib/edoxen/meeting_identifier.rb
54
89
  - lib/edoxen/resolution.rb
55
90
  - lib/edoxen/resolution_collection.rb
56
91
  - lib/edoxen/resolution_date.rb
57
- - lib/edoxen/resolution_relationship.rb
92
+ - lib/edoxen/resolution_metadata.rb
93
+ - lib/edoxen/resolution_relation.rb
94
+ - lib/edoxen/resolution_set.rb
95
+ - lib/edoxen/schema_validator.rb
96
+ - lib/edoxen/source_url.rb
58
97
  - lib/edoxen/structured_identifier.rb
59
- - lib/edoxen/subject_body.rb
98
+ - lib/edoxen/url.rb
60
99
  - lib/edoxen/version.rb
61
100
  - schema/edoxen.yaml
62
101
  - sig/edoxen.rbs