edoxen 0.8.3 → 0.8.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9be35dc39f7766b3bebb55769f484b13e4e0f43d5d29e4cdaba916dc64594a82
4
- data.tar.gz: 1466534420ad8b83df31b1a84c1fe0c3e27e28a6f4529c190b4658c2622c4700
3
+ metadata.gz: fd6f4fc1dd113896010b8f80252e117a63043c3f12014df272155ec1993286dd
4
+ data.tar.gz: 94970c3ea72a99afd9503e7cbb739a136ad4d03a7e6ee008dbfb058682046722
5
5
  SHA512:
6
- metadata.gz: 4912179fadc07811533420e68c07edd374468369fd4f3ffa0135d2556e310ee1ed7f7c595a9241d6ac8378c6a62ea36e7673a0f9fa8ac0fe98d39668606475d9
7
- data.tar.gz: 8cba6a15881824a1b6bef2e29e113fab969302b485ae1404e8100121cefddae44c435a529a999ed24ebae15eddb0bc757c3e9270ad19cde4e3d5530c6cd239c4
6
+ metadata.gz: 33a085d54d260ee198656e3a20ebb81826c15631c324beb026573b807c8f6a8ed60087f9497fecbb07f880860eae971929f4db9ea15ff14f815b6c259d421385
7
+ data.tar.gz: 7e8f1781eb1dd41f6b1dda74eee3b861949cefafe09cf947fb97e0f2045db83007afb275951bb6da26231afd8a012d53966c2931f6c261add4f9a01d02c9e546
data/CHANGELOG.md CHANGED
@@ -5,6 +5,57 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ### Changed
11
+
12
+ * `Edoxen::EntityResolver` no longer duck-types its scoped-collection
13
+ members with `respond_to?(:urn)`. Each resolvable entity
14
+ (`Contact`, `Venue`, `Body`) now exposes `#local_lookup_key`, which
15
+ returns the canonical local identifier for that type (`urn` for
16
+ Contact/Venue, `code` for Body). The resolver calls the polymorphic
17
+ method directly — adding a new resolvable entity type means adding
18
+ the method on the class, not branching in the resolver.
19
+
20
+ ## [0.8.3] — 2026-07-18
21
+
22
+ ### Fixed
23
+
24
+ * `Meeting#decisions` is `StructuredIdentifier[]` (reference by
25
+ prefix+number), aligning the Ruby model with the JSON schema and
26
+ every consumer dataset; the attribute had drifted to `Decision`
27
+ during the BS 0 minutes work (mirrors edoxen-model#26).
28
+ * `Edoxen::EntityResolver` document-scoped tier no longer raises
29
+ `NoMethodError` for `Body` — bodies have no `urn`, they are keyed
30
+ by `code` (same semantics as `BodyRegister#find_by_urn`).
31
+
32
+ ## [0.8.2] — 2026-07-17
33
+
34
+ ### Added
35
+
36
+ * **Three-tier entity resolution** for Contact, Venue, and Body:
37
+ inline (full data, no reference), document-scoped (`local_ref` →
38
+ matching member in the container's scoped collection, e.g.
39
+ `Meeting#contacts[]`, `Meeting#bodies[]`), and global register
40
+ (`ref` → member of a top-level register document).
41
+ * `Contact#local_ref` alongside `ref`; `Contact#reference?` true when
42
+ either is set.
43
+ * New `Body` entity (`code`, localized `name`, `kind`, `parent_ref`,
44
+ `ref`, `local_ref`) and `BodyRegister` top-level document.
45
+ `Meeting#committee` and `Meeting#committee_group` changed from
46
+ `String` to `Body`.
47
+ * `Edoxen::EntityResolver` — pure resolution service walking
48
+ inline → scoped → register.
49
+ * `AgendaItem#urn` + `Edoxen::UrnFor` — hierarchical agenda-item
50
+ URNs (`{meetingUrn}:agenda:{label}`), computable when absent in
51
+ source data.
52
+
53
+ ### Changed
54
+
55
+ * `ContactCollection` renamed to `ContactRegister`;
56
+ `VenueCollection` renamed to `VenueRegister` (a register is
57
+ authoritative and persistent, a collection is just a grouping).
58
+
8
59
  ## [0.8.1] — 2026-07-14
9
60
 
10
61
  First implementation release of **Edoxen Model 1.0**. The Ruby gem
data/lib/edoxen/body.rb CHANGED
@@ -22,5 +22,12 @@ module Edoxen
22
22
  (!ref.nil? && !ref.to_s.empty?) ||
23
23
  (!local_ref.nil? && !local_ref.to_s.empty?)
24
24
  end
25
+
26
+ # Key used to resolve a +local_ref+ against a document-scoped
27
+ # collection (e.g. Meeting#bodies[]). Bodies have no urn — they
28
+ # are keyed by code (same semantics as BodyRegister#find_by_urn).
29
+ def local_lookup_key
30
+ code
31
+ end
25
32
  end
26
33
  end
@@ -33,5 +33,11 @@ module Edoxen
33
33
  (!ref.nil? && !ref.to_s.empty?) ||
34
34
  (!local_ref.nil? && !local_ref.to_s.empty?)
35
35
  end
36
+
37
+ # Key used to resolve a +local_ref+ against a document-scoped
38
+ # collection (e.g. Meeting#contacts[]). Contacts are keyed by urn.
39
+ def local_lookup_key
40
+ urn
41
+ end
36
42
  end
37
43
  end
@@ -8,7 +8,7 @@ module Edoxen
8
8
  # it as-is (it carries full data).
9
9
  # 2. Document-scoped: if +local_ref+ is set, look up in the
10
10
  # document-scoped collection (e.g. Meeting#contacts) by matching
11
- # +urn+ against +local_ref+ (+code+ for Body, which has no +urn+).
11
+ # the member's +local_lookup_key+ against +local_ref+.
12
12
  # 3. Global register: if +ref+ is set, look up in the global
13
13
  # register (e.g. ContactRegister) by matching +urn+ against +ref+.
14
14
  #
@@ -39,7 +39,7 @@ module Edoxen
39
39
  collection = find_scoped_collection(entity.class)
40
40
  return nil unless collection
41
41
 
42
- collection.find { |member| member_key(member) == entity.local_ref }
42
+ collection.find { |member| member.local_lookup_key == entity.local_ref }
43
43
  end
44
44
 
45
45
  def resolve_global(entity)
@@ -60,11 +60,5 @@ module Edoxen
60
60
  @global_registers[klass] ||
61
61
  @global_registers[klass.superclass]
62
62
  end
63
-
64
- def member_key(member)
65
- # Body has no +urn+ — its local key is +code+ (same lookup
66
- # semantics as BodyRegister#find_by_urn).
67
- member.respond_to?(:urn) ? member.urn : member.code
68
- end
69
63
  end
70
64
  end
data/lib/edoxen/venue.rb CHANGED
@@ -52,6 +52,12 @@ module Edoxen
52
52
  (!local_ref.nil? && !local_ref.to_s.empty?)
53
53
  end
54
54
 
55
+ # Key used to resolve a +local_ref+ against a document-scoped
56
+ # collection (e.g. Meeting#venues[]). Venues are keyed by urn.
57
+ def local_lookup_key
58
+ urn
59
+ end
60
+
55
61
  def physical?
56
62
  kind == "physical"
57
63
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Edoxen
4
- VERSION = "0.8.3"
4
+ VERSION = "0.8.4"
5
5
  end
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.8.3
4
+ version: 0.8.4
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-07-18 00:00:00.000000000 Z
11
+ date: 2026-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json_schemer