edoxen 0.7.2 → 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.
- checksums.yaml +4 -4
- data/.rubocop.yml +26 -1
- data/.rubocop_todo.yml +1 -1
- data/CHANGELOG.md +133 -0
- data/README.adoc +414 -182
- data/edoxen.gemspec +10 -10
- data/lib/edoxen/action.rb +5 -4
- data/lib/edoxen/agenda.rb +4 -7
- data/lib/edoxen/agenda_item.rb +12 -5
- data/lib/edoxen/approval.rb +2 -2
- data/lib/edoxen/attendance.rb +16 -10
- data/lib/edoxen/body_vocabulary_entry.rb +24 -0
- data/lib/edoxen/body_vocabulary_host.rb +40 -0
- data/lib/edoxen/cli.rb +175 -115
- data/lib/edoxen/consideration.rb +6 -4
- data/lib/edoxen/contact.rb +35 -0
- data/lib/edoxen/contact_collection.rb +26 -0
- data/lib/edoxen/contact_identifier.rb +13 -0
- data/lib/edoxen/contact_method.rb +16 -0
- data/lib/edoxen/date_time_range.rb +16 -0
- data/lib/edoxen/deadline.rb +1 -1
- data/lib/edoxen/decision.rb +57 -0
- data/lib/edoxen/decision_collection.rb +10 -0
- data/lib/edoxen/decision_date.rb +9 -0
- data/lib/edoxen/decision_metadata.rb +27 -0
- data/lib/edoxen/decision_relation.rb +11 -0
- data/lib/edoxen/declaration.rb +25 -0
- data/lib/edoxen/entity_ref.rb +74 -0
- data/lib/edoxen/enums.rb +123 -9
- data/lib/edoxen/error.rb +1 -1
- data/lib/edoxen/extension_attribute.rb +78 -0
- data/lib/edoxen/host_ref.rb +1 -1
- data/lib/edoxen/link_checker.rb +143 -34
- data/lib/edoxen/localized_name.rb +16 -0
- data/lib/edoxen/localized_string.rb +22 -0
- data/lib/edoxen/meeting.rb +34 -42
- data/lib/edoxen/meeting_collection.rb +1 -2
- data/lib/edoxen/meeting_collection_metadata.rb +4 -2
- data/lib/edoxen/meeting_component.rb +37 -0
- data/lib/edoxen/meeting_extension.rb +25 -0
- data/lib/edoxen/meeting_identifier.rb +1 -1
- data/lib/edoxen/meeting_series.rb +26 -0
- data/lib/edoxen/minutes.rb +3 -4
- data/lib/edoxen/minutes_section.rb +12 -13
- data/lib/edoxen/motion.rb +51 -0
- data/lib/edoxen/name.rb +29 -0
- data/lib/edoxen/officer.rb +19 -0
- data/lib/edoxen/officers_host.rb +19 -0
- data/lib/edoxen/person.rb +5 -9
- data/lib/edoxen/physical_venue.rb +15 -0
- data/lib/edoxen/recurrence.rb +27 -0
- data/lib/edoxen/recurrence_by_day.rb +10 -0
- data/lib/edoxen/reference.rb +1 -1
- data/lib/edoxen/reference_data.rb +34 -44
- data/lib/edoxen/schema_validator.rb +3 -4
- data/lib/edoxen/source_url.rb +4 -4
- data/lib/edoxen/statement.rb +21 -0
- data/lib/edoxen/structured_identifier.rb +2 -2
- data/lib/edoxen/topic.rb +39 -0
- data/lib/edoxen/topic_asset.rb +14 -0
- data/lib/edoxen/topic_document.rb +16 -0
- data/lib/edoxen/venue.rb +79 -0
- data/lib/edoxen/venue_collection.rb +18 -0
- data/lib/edoxen/venue_validator.rb +74 -0
- data/lib/edoxen/version.rb +1 -1
- data/lib/edoxen/virtual_venue.rb +15 -0
- data/lib/edoxen/vote_record.rb +17 -13
- data/lib/edoxen/voting.rb +45 -0
- data/lib/edoxen/voting_counts.rb +23 -0
- data/lib/edoxen.rb +47 -15
- data/schema/edoxen.yaml +1376 -246
- data/schema/meeting.yaml +1207 -272
- data/sig/edoxen.rbs +581 -1
- metadata +62 -22
- data/lib/edoxen/_metadata.rb.deprecated +0 -57
- data/lib/edoxen/localization.rb +0 -18
- data/lib/edoxen/location.rb +0 -15
- data/lib/edoxen/meeting_localization.rb +0 -15
- data/lib/edoxen/resolution.rb +0 -43
- data/lib/edoxen/resolution_collection.rb +0 -10
- data/lib/edoxen/resolution_date.rb +0 -11
- data/lib/edoxen/resolution_metadata.rb +0 -30
- data/lib/edoxen/resolution_relation.rb +0 -11
- data/lib/edoxen/resolution_set.rb +0 -17
- data/lib/edoxen/schedule_item.rb +0 -27
- data/lib/edoxen/schedule_item_localization.rb +0 -21
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f2d36145e7d749b68340072562507ea1416890d645b36a0f7d44620f15b92561
|
|
4
|
+
data.tar.gz: af5f8fccde1aff6ecbb8d1eca57e4fd217e1bcbb99dab72fdad147eb0992c6c6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 906d8a9f930f5ca0f8b9e83edd3e24bf4fd409e35ba3feb4cb732e29a630153a8fa1298e3b8384d85c366bdbad210f3123ed8729cf30ca72afbbd8b8cf073f38
|
|
7
|
+
data.tar.gz: bdf81dddea8e38a8f5937713d78d32d768c4099774b5d2e148e69a422ad78c6959e2365722dfbd87ec2b46779fa4941cd2e63bb2dc74709904ddc7b603645054
|
data/.rubocop.yml
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
inherit_from: .rubocop_todo.yml
|
|
2
2
|
|
|
3
3
|
AllCops:
|
|
4
|
-
TargetRubyVersion:
|
|
4
|
+
TargetRubyVersion: 3.1
|
|
5
|
+
NewCops: enable
|
|
5
6
|
|
|
6
7
|
Style/StringLiterals:
|
|
7
8
|
Enabled: true
|
|
@@ -13,3 +14,27 @@ Style/StringLiteralsInInterpolation:
|
|
|
13
14
|
|
|
14
15
|
Layout/LineLength:
|
|
15
16
|
Max: 120
|
|
17
|
+
|
|
18
|
+
# The LutaML parser is a self-contained state machine that lives in
|
|
19
|
+
# spec/support/ only. 101 lines for the whole module (struct types +
|
|
20
|
+
# state-machine + helpers) is acceptable; splitting would obscure the
|
|
21
|
+
# design.
|
|
22
|
+
Metrics/ModuleLength:
|
|
23
|
+
Exclude:
|
|
24
|
+
- "spec/support/lutaml_parser.rb"
|
|
25
|
+
|
|
26
|
+
# RSpec top-level describe blocks routinely run past the default
|
|
27
|
+
# threshold; the suite uses focused single-class spec files instead
|
|
28
|
+
# of splitting for size's own sake.
|
|
29
|
+
Metrics/BlockLength:
|
|
30
|
+
Exclude:
|
|
31
|
+
- "spec/**/*.rb"
|
|
32
|
+
|
|
33
|
+
# `Edoxen::Cli` is a thin Thor subclass: six `desc` blocks delegating
|
|
34
|
+
# to `Edoxen::Cli::Batch` (the deep module that owns expand/run/summary
|
|
35
|
+
# and the per-profile shape sniffers). Per-command bodies are 1–3 lines;
|
|
36
|
+
# the line count is the natural cost of the command surface, not a sign
|
|
37
|
+
# of god-class drift.
|
|
38
|
+
Metrics/ClassLength:
|
|
39
|
+
Exclude:
|
|
40
|
+
- "lib/edoxen/cli.rb"
|
data/.rubocop_todo.yml
CHANGED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.8.1] — 2026-07-14
|
|
9
|
+
|
|
10
|
+
First implementation release of **Edoxen Model 1.0**. The Ruby gem
|
|
11
|
+
mirrors the canonical LutaML information model in
|
|
12
|
+
[edoxen/edoxen-model](https://github.com/edoxen/edoxen-model): a
|
|
13
|
+
generic meeting, agenda, motion, voting, and decision model with
|
|
14
|
+
VCARD-style contacts, scoped URN registries, and per-field
|
|
15
|
+
localization per ISO 24229.
|
|
16
|
+
|
|
17
|
+
### Identity & Contact (VCARD-style, OCP)
|
|
18
|
+
|
|
19
|
+
* `Contact` — VCARD-like abstract contact (person, organisation,
|
|
20
|
+
department, or role).
|
|
21
|
+
* `Person` — inherits from `Contact` for individual humans.
|
|
22
|
+
* `Name` — structured N + FN components (formatted, family, given,
|
|
23
|
+
additional, prefix, suffix).
|
|
24
|
+
* `ContactMethod` — polymorphic communication channel (phone, mobile,
|
|
25
|
+
fax, email, url, mail, pager, message, other).
|
|
26
|
+
* `ContactIdentifier` — polymorphic external ID (orcid, isni,
|
|
27
|
+
wikidata, ror, ringgold, github, other).
|
|
28
|
+
* `Officer` — role-binding (NOT an entity): binds a Contact to a
|
|
29
|
+
Meeting or MeetingComponent with a structural role (chair,
|
|
30
|
+
secretary, treasurer, etc.).
|
|
31
|
+
* `HostRef` — typed reference to a hosting organization.
|
|
32
|
+
|
|
33
|
+
### Localization (per-field, ISO 24229)
|
|
34
|
+
|
|
35
|
+
Every translatable field is `Localized<String/Name>[0..*]` — one
|
|
36
|
+
entry per ISO 24229 `spelling` code. There is no separate
|
|
37
|
+
`Localization[]` collection; each field carries its own language tags.
|
|
38
|
+
|
|
39
|
+
* `LocalizedString` — `{ spelling, value: String, extensions }`.
|
|
40
|
+
* `LocalizedName` — `{ spelling, value: Name, extensions }`.
|
|
41
|
+
* `spelling` accepts ISO 24229 spelling-system codes
|
|
42
|
+
(`{lang}-{script}[-{country}][-{extension}]`, e.g. `zho-Hans`) AND
|
|
43
|
+
conversion-system codes (`{authority}:{source}:{target}:{identifying}`,
|
|
44
|
+
e.g. `acadsin:zho-Hani:Latn:2002`).
|
|
45
|
+
* Always verbose — single-language data uses the same
|
|
46
|
+
`[{ spelling, value }]` shape as multi-language data.
|
|
47
|
+
* Ruby helpers: `Contact#name_in(spelling)`, `Meeting#title_in(spelling)`,
|
|
48
|
+
`Contact#localized_value(field, spelling)`.
|
|
49
|
+
|
|
50
|
+
### Scoped URN registries
|
|
51
|
+
|
|
52
|
+
URN format: `urn:edoxen:{entity}:{scope}:{local-id}`. Helper:
|
|
53
|
+
`Edoxen::Urn.parse`, `Edoxen::Urn.format`, `Edoxen::Urn.valid?`.
|
|
54
|
+
|
|
55
|
+
* `ContactCollection` — registry of Contacts indexed by scoped URN.
|
|
56
|
+
`ContactCollection.load_stream(path)` for YAML Stream files.
|
|
57
|
+
* `VenueCollection` — registry of Venues.
|
|
58
|
+
* `Contact` and `Venue` gain `urn` (registry identity) and `ref`
|
|
59
|
+
(when used as a URN reference; if set, other fields are ignored).
|
|
60
|
+
|
|
61
|
+
Any entity-typed field accepts either **inline data** (full object) or
|
|
62
|
+
**a URN reference** (`{ ref: urn:edoxen:contact:... }`).
|
|
63
|
+
|
|
64
|
+
### Meeting/Agenda side
|
|
65
|
+
|
|
66
|
+
`Meeting`, `MeetingCollection`, `MeetingSeries`, `MeetingComponent`,
|
|
67
|
+
`Agenda` + `AgendaItem`, `Minutes` + `MinutesSection`, `Attendance`,
|
|
68
|
+
`VoteRecord`, `Venue` (polymorphic physical/virtual, flat wire shape),
|
|
69
|
+
`Deadline`, `MeetingRelation`, `Recurrence` (structured ISO 8601-2 §13).
|
|
70
|
+
|
|
71
|
+
### Decision side
|
|
72
|
+
|
|
73
|
+
`Decision`, `DecisionCollection` + `DecisionMetadata`, `DecisionDate`,
|
|
74
|
+
`Action`, `Consideration`, `Approval` (each with per-field Localized
|
|
75
|
+
message), `DecisionRelation`, `SourceUrl`.
|
|
76
|
+
|
|
77
|
+
### Procedural
|
|
78
|
+
|
|
79
|
+
`Motion` (state machine), `Voting` + `VotingCounts`, `Topic` +
|
|
80
|
+
`TopicDocument` + `TopicAsset` (cross-meeting threading via
|
|
81
|
+
`resumptionOf`).
|
|
82
|
+
|
|
83
|
+
### Profile mechanism (ISO 8601-2 §15)
|
|
84
|
+
|
|
85
|
+
`MeetingExtension` + `ExtensionAttribute` — how adopters express
|
|
86
|
+
body-specific structured data. Core stays generic.
|
|
87
|
+
`BodyVocabularyEntry` — per-dataset vocabulary mapping (body_type →
|
|
88
|
+
canonical_type). `EntityRef` — typed cross-reference between entities.
|
|
89
|
+
|
|
90
|
+
### Schemas
|
|
91
|
+
|
|
92
|
+
* `schema/edoxen.yaml` — DecisionCollection schema (decision side).
|
|
93
|
+
* `schema/meeting.yaml` — Meeting / MeetingCollection / MeetingSeries
|
|
94
|
+
schema (meeting side).
|
|
95
|
+
* All enums mirror `Edoxen::Enums` constants; sync specs assert
|
|
96
|
+
character-for-character equality.
|
|
97
|
+
* Cross-file sync spec ensures shared `$defs` are byte-for-byte equal
|
|
98
|
+
across the two schema files.
|
|
99
|
+
|
|
100
|
+
### Spec coverage
|
|
101
|
+
|
|
102
|
+
* 6 lutaml ↔ Ruby / schema sync specs (316 + 314 + 60 + 630 + 30
|
|
103
|
+
examples, all green).
|
|
104
|
+
* 1327 unit / fixture specs green.
|
|
105
|
+
* `Edoxen::SchemaValidator`, `Edoxen::LinkChecker`, `Edoxen::Cli` all
|
|
106
|
+
exercised.
|
|
107
|
+
|
|
108
|
+
### BS 0:2006 meeting-minutes integration
|
|
109
|
+
|
|
110
|
+
* `Statement` — one remark by one or more members on a topic or a
|
|
111
|
+
minutes section. `kind: StatementKind` discriminates
|
|
112
|
+
`statement` / `comment` / `standpoint` (BS 0:2006 §7.6).
|
|
113
|
+
* `Declaration` — formal declaration (conflict of interest, IPR).
|
|
114
|
+
`kind: DeclarationKind` discriminates. IPR declarations carry
|
|
115
|
+
typed `EntityRef` slots for `ipr_subject_ref` and `ipr_target_ref`.
|
|
116
|
+
* `DateTimeRange` — sub-day precision parallel to `DateRange`.
|
|
117
|
+
* `Meeting#scheduled_date_range` (renamed from `date_range`) +
|
|
118
|
+
`Meeting#occurred_date_range: DateTimeRange` +
|
|
119
|
+
`Meeting#declarations: Declaration[0..*]`.
|
|
120
|
+
* `Topic#statements[]` (standing) + `Topic#declarations[]` (standing).
|
|
121
|
+
* `MinutesSection#statements[]` (per-meeting) +
|
|
122
|
+
`MinutesSection#topic_ref` (URN back-link to Topic).
|
|
123
|
+
* Every new translatable field is per-field Localized (ISO 24229) —
|
|
124
|
+
no scalar `String` text fields anywhere in the new surface.
|
|
125
|
+
|
|
126
|
+
### References
|
|
127
|
+
|
|
128
|
+
* [Edoxen Model 1.0](https://github.com/edoxen/edoxen-model) —
|
|
129
|
+
canonical LutaML information model.
|
|
130
|
+
* ISO 24229 — spelling/conversion system codes.
|
|
131
|
+
* VCARD (RFC 6350) — N + FN name structure.
|
|
132
|
+
* ISO 8601-2 (2026) §13 for recurrence, §15 for profile mechanism.
|
|
133
|
+
* iCalendar (RFC 5545/7986/5546/9253) — referenced, not duplicated.
|