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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -1
  3. data/.rubocop_todo.yml +1 -1
  4. data/CHANGELOG.md +133 -0
  5. data/README.adoc +414 -182
  6. data/edoxen.gemspec +10 -10
  7. data/lib/edoxen/action.rb +5 -4
  8. data/lib/edoxen/agenda.rb +4 -7
  9. data/lib/edoxen/agenda_item.rb +12 -5
  10. data/lib/edoxen/approval.rb +2 -2
  11. data/lib/edoxen/attendance.rb +16 -10
  12. data/lib/edoxen/body_vocabulary_entry.rb +24 -0
  13. data/lib/edoxen/body_vocabulary_host.rb +40 -0
  14. data/lib/edoxen/cli.rb +175 -115
  15. data/lib/edoxen/consideration.rb +6 -4
  16. data/lib/edoxen/contact.rb +35 -0
  17. data/lib/edoxen/contact_collection.rb +26 -0
  18. data/lib/edoxen/contact_identifier.rb +13 -0
  19. data/lib/edoxen/contact_method.rb +16 -0
  20. data/lib/edoxen/date_time_range.rb +16 -0
  21. data/lib/edoxen/deadline.rb +1 -1
  22. data/lib/edoxen/decision.rb +57 -0
  23. data/lib/edoxen/decision_collection.rb +10 -0
  24. data/lib/edoxen/decision_date.rb +9 -0
  25. data/lib/edoxen/decision_metadata.rb +27 -0
  26. data/lib/edoxen/decision_relation.rb +11 -0
  27. data/lib/edoxen/declaration.rb +25 -0
  28. data/lib/edoxen/entity_ref.rb +74 -0
  29. data/lib/edoxen/enums.rb +123 -9
  30. data/lib/edoxen/error.rb +1 -1
  31. data/lib/edoxen/extension_attribute.rb +78 -0
  32. data/lib/edoxen/host_ref.rb +1 -1
  33. data/lib/edoxen/link_checker.rb +143 -34
  34. data/lib/edoxen/localized_name.rb +16 -0
  35. data/lib/edoxen/localized_string.rb +22 -0
  36. data/lib/edoxen/meeting.rb +34 -42
  37. data/lib/edoxen/meeting_collection.rb +1 -2
  38. data/lib/edoxen/meeting_collection_metadata.rb +4 -2
  39. data/lib/edoxen/meeting_component.rb +37 -0
  40. data/lib/edoxen/meeting_extension.rb +25 -0
  41. data/lib/edoxen/meeting_identifier.rb +1 -1
  42. data/lib/edoxen/meeting_series.rb +26 -0
  43. data/lib/edoxen/minutes.rb +3 -4
  44. data/lib/edoxen/minutes_section.rb +12 -13
  45. data/lib/edoxen/motion.rb +51 -0
  46. data/lib/edoxen/name.rb +29 -0
  47. data/lib/edoxen/officer.rb +19 -0
  48. data/lib/edoxen/officers_host.rb +19 -0
  49. data/lib/edoxen/person.rb +5 -9
  50. data/lib/edoxen/physical_venue.rb +15 -0
  51. data/lib/edoxen/recurrence.rb +27 -0
  52. data/lib/edoxen/recurrence_by_day.rb +10 -0
  53. data/lib/edoxen/reference.rb +1 -1
  54. data/lib/edoxen/reference_data.rb +34 -44
  55. data/lib/edoxen/schema_validator.rb +3 -4
  56. data/lib/edoxen/source_url.rb +4 -4
  57. data/lib/edoxen/statement.rb +21 -0
  58. data/lib/edoxen/structured_identifier.rb +2 -2
  59. data/lib/edoxen/topic.rb +39 -0
  60. data/lib/edoxen/topic_asset.rb +14 -0
  61. data/lib/edoxen/topic_document.rb +16 -0
  62. data/lib/edoxen/venue.rb +79 -0
  63. data/lib/edoxen/venue_collection.rb +18 -0
  64. data/lib/edoxen/venue_validator.rb +74 -0
  65. data/lib/edoxen/version.rb +1 -1
  66. data/lib/edoxen/virtual_venue.rb +15 -0
  67. data/lib/edoxen/vote_record.rb +17 -13
  68. data/lib/edoxen/voting.rb +45 -0
  69. data/lib/edoxen/voting_counts.rb +23 -0
  70. data/lib/edoxen.rb +47 -15
  71. data/schema/edoxen.yaml +1376 -246
  72. data/schema/meeting.yaml +1207 -272
  73. data/sig/edoxen.rbs +581 -1
  74. metadata +62 -22
  75. data/lib/edoxen/_metadata.rb.deprecated +0 -57
  76. data/lib/edoxen/localization.rb +0 -18
  77. data/lib/edoxen/location.rb +0 -15
  78. data/lib/edoxen/meeting_localization.rb +0 -15
  79. data/lib/edoxen/resolution.rb +0 -43
  80. data/lib/edoxen/resolution_collection.rb +0 -10
  81. data/lib/edoxen/resolution_date.rb +0 -11
  82. data/lib/edoxen/resolution_metadata.rb +0 -30
  83. data/lib/edoxen/resolution_relation.rb +0 -11
  84. data/lib/edoxen/resolution_set.rb +0 -17
  85. data/lib/edoxen/schedule_item.rb +0 -27
  86. data/lib/edoxen/schedule_item_localization.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69a86986a86602665699b5598622d32a63658c302737587f68b7a9b095a471e1
4
- data.tar.gz: 1201e014ac06c2e4accb00dfd00660f577f6f6464f5d7990553714b796af8314
3
+ metadata.gz: f2d36145e7d749b68340072562507ea1416890d645b36a0f7d44620f15b92561
4
+ data.tar.gz: af5f8fccde1aff6ecbb8d1eca57e4fd217e1bcbb99dab72fdad147eb0992c6c6
5
5
  SHA512:
6
- metadata.gz: 7ec73b629af4dd2997fea614665347177f273569349d0221e414f9dc9b2dbb8f083b3d964675286bb9a76d449a5a4c7c2cf2981db028ebf5f0d2e54249abb77d
7
- data.tar.gz: 52534618f6468c4da8effd9bcb23e978487e1857da1a9832fa8d1ed665e72324a13397657b0cb8f6c828be4ef45e9d669781a208b7135c09e97a1b833cc6c69e
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: 2.6
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
@@ -115,7 +115,7 @@ Metrics/BlockLength:
115
115
  # Offense count: 3
116
116
  # Configuration parameters: CountComments, CountAsOne.
117
117
  Metrics/ClassLength:
118
- Max: 167
118
+ Max: 170
119
119
 
120
120
  # Offense count: 6
121
121
  # Configuration parameters: AllowedMethods, AllowedPatterns.
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.