lutaml-xsd 1.2.110 → 1.2.112

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: 16069a6293538146b585e29cf696a42e1294e9f8c211d075bcc8f03f44adcb8f
4
- data.tar.gz: 1049c160550ac6905f09ecc512e06536137d9d4b13cade090cc83fc24b9c355c
3
+ metadata.gz: cdfdd257c5d78df578d997d512d39f17f9c83b10d4a8928708767b41bb6224b9
4
+ data.tar.gz: c9a0bc6226dd8346324c44af5f93906f851b477895b145ed86a89cc2a70f8538
5
5
  SHA512:
6
- metadata.gz: 95556f997483a0c1b5b606c0047c7cfcb39f75b3dae29350a61b4613d78cfa7ec7c961fa4f6fe040e84000110aa92b1b87203cdb94cebcbc580ca6055f65c389
7
- data.tar.gz: 689fa0a66e8cf18fe44bdaa7081095e631a1b49e6d67d44ba0f49edc6fcf1aaf35f5458ac0d12b901be4435240ecf9cd429b2b2bc7ff42dd94366dee3995db00
6
+ metadata.gz: f503a443b9e205299c93eadd6c4f878f8fe025a2d0bd0514629fcdd38945f533b948afa656aa3e57bd8b5bfc2ade4213f9c77380d5bcc395c279a23b247c1da6
7
+ data.tar.gz: 1f533117654e06d3e2acde45f3c053eb99c9c41030b9a844fa598482372db23e24029fe3eaf7514ce7033c8a4c94b9bcd11b62209d00e7ab0b56ccc9458e6e66
data/TODO.conformance.md CHANGED
@@ -120,7 +120,7 @@ pinned commit) is measured via `rake conformance:w3c`:
120
120
 
121
121
  | mode | pass-rate |
122
122
  |---|---|
123
- | pipeline | 4617/4696 (98.32%) |
123
+ | pipeline | 4644/4696 measured + 5 budget exclusions (98.96% of measured) |
124
124
 
125
125
  (2026-11-02, bundled-stack measurement with the escape,
126
126
  hint-following, pattern-alternative, identity-crash, engine-set,
@@ -144,7 +144,7 @@ lockfile refresh) → 4411 (93.9%) → 4430 (94.3%) → 4435 (94.4%) →
144
144
  → 4557 (97.0%) → 4565 (97.2%) → 4569 (97.3%) → 4562 (drift raw) →
145
145
  4563 (97.17%, ref-namespace round) → 4573 (97.38%, group-content
146
146
  round) → 4578 (97.49%, attribute-prohibition round) → 4585 (97.64%,
147
- multi-document round) → 4588 (97.7%, type-binding round) → 4592 (97.79%, model-161 ride) → 4611 (98.19%, engine-406 ride) → 4613 (98.23%, temporal-enumeration round) → 4614 (98.25%, simple-type-children round) → 4617 (98.32%, ic-ancestor-scope round), +656 net over the 1.2.43 baseline. The escapes round (PR #197 — \d→\p{Nd},
147
+ multi-document round) → 4588 (97.7%, type-binding round) → 4592 (97.79%, model-161 ride) → 4611 (98.19%, engine-406 ride) → 4613 (98.23%, temporal-enumeration round) → 4614 (98.25%, simple-type-children round) → 4617 (98.32%, ic-ancestor-scope round) → 4637 (parent-context rounds + chameleon round 1.2.109) → 4637 (nested-type-candidates round, 1.2.110) → 4637 (redefine-cycle round, 1.2.111) → 4644 measured (98.96% of measured, train-adoption round: moxml 0.6.6 + leptris 1.9.418.0), +683 net over the 1.2.43 baseline. The escapes round (PR #197 — \d→\p{Nd},
148
148
  \w/\W/\s to their XSD value spaces) collapses Regex 120→69;
149
149
  same-step pattern facets now behave as alternatives and
150
150
  whitespace-only text reaches the facets intact (PR #200), Regex
@@ -560,26 +560,66 @@ tuple keys, node-set field violations and absent-field rows handled, cross-eleme
560
560
  regressions (stash-attributed per row), rspec 1663 green,
561
561
  rubocop clean. schR2 stack-overflow note unchanged (crash masked
562
562
  by expected-invalid, counted per convention).
563
- - SCH R2 STACK OVERFLOW (2026-11-11): Schema_w3c/schR2/schR2.i
564
- (expected invalid) crashes the assessment with a SystemStackError
565
- in lutaml-model 0.8.167's Base#resolved_element_order/
566
- delete_deletables — an unguarded recursion over the cyclic
567
- redefine graph schR2's documents build (called from our
568
- collect_particles). The crash ESCAPES measure()'s rescue
569
- (SystemStackError is not a StandardError); in every prior ledger
570
- the case silently recorded as a pass via the crash-as-invalid
571
- convention on its expected-invalid expectation, so the ledger
572
- number never moved. Files/gems/ruby verified identical to the
573
- baseline era; the crash reproduces in fresh single-case runs on
574
- origin/main on both trains today. Finding for lutaml-model: a
575
- cycle guard in resolved_element_order (our org's repo; owner
576
- decides the upstream action).
563
+ - SCH R2 STACK OVERFLOW FIXED (2026-11-12, round shipped): the
564
+ SystemStackError on Schema_w3c/schR2/schR2.i (expected invalid;
565
+ masked as pass by the crash-as-invalid convention) is OURS, not
566
+ lutaml-model's — the infinite recursion cycles between the
567
+ §4.2.2 redefined group body and the redefine TARGET (two DISTINCT
568
+ objects reachable by the same group name b-g2), so an OBJECT-keyed
569
+ guard misses it; the cut is NAME-keyed and PATH-scoped in both
570
+ walkers: leaf_particles marks the group name on its ancestry
571
+ (same name cannot expand within its own ancestry; sibling reuse
572
+ still expands fresh) and ContentModelMatcher#compile_group keeps
573
+ the same path discipline over resolved containers. LEDGER vs the
574
+ 1.2.110 baseline: 4637/4696 measured + the same 5 reZ budget
575
+ exclusions, ZERO regressions, and batch 4450's crash list is
576
+ EMPTY (schR2.i now assesses honestly to invalid instead of
577
+ overflowing). PROVENANCE: batch 03000 was carried over from the
578
+ 1.2.110 ledger — regex-pattern-only cases whose walk never
579
+ touches the guards (the batch's reI003 quadratic tax made a
580
+ re-run cost-prohibitive on the contended machine). Also filed
581
+ lutaml/moxml#540 this round (the 0.6.4 attribute char-ref
582
+ regression below; repro included).
583
+ - TRAIN ADOPTION COMPLETE (2026-11-12, release pending): the
584
+ measurement train moves to moxml 0.6.2→0.6.6 + leptris
585
+ 1.9.406.0→1.9.418.0 (moxml#540 CLOSED — the attribute
586
+ character-reference decode is verified restored: attr
587
+ `←` decodes to "←" on 0.6.6). SUITE 4644/4691 measured
588
+ (98.96% of measured) + the same 5 reZ budget exclusions (the
589
+ nested-repeat walks still exceed the 90s per-case watchdog on
590
+ 418 — a mid-bisect "faster reZ" reading was sweep-churn noise).
591
+ WINS +11: attgD019/020/021/022/025/027/029/031/033/034 (the
592
+ strict-attribute class through chameleon/imported attributeGroup
593
+ refs — the moxml#522 thread, FIXED at last) and elemZ020
594
+ (leptris-rs#46, the substitution binding). REGRESSIONS −4:
595
+ wildZ013b/c (FILED leptris-rs#72 — strict anyAttribute admission
596
+ through namespace-less-import wildcards now reports "not
597
+ declared (strict)"; the flip is between 1.9.409.0 and 1.9.410.0,
598
+ bisected) and attZ014a/b (FILED leptris-rs#73 — the
599
+ multiple-xs:ID-per-element pair drifted to the XSD 1.1 reading;
600
+ suite-contested 1.0-invalid/1.1-valid, harness takes the 1.0
601
+ expectation). NOT carried by this train: the leptris-rs#45
602
+ stE050/055/065/066 legs and attgC035-038 (still failing on 418 —
603
+ the 407-era wins were lost somewhere in 408-418 and have not
604
+ returned). TOOLING LESSONS, both the hard way: (a) moxml 0.6.6
605
+ CANNOT drive leptris ≤ 1.9.409.0 — the adapter reports unusable
606
+ and silently falls back to nokogiri, so probes answer without an
607
+ engine; check for the fallback warning before trusting any
608
+ probe; (b) `bundle lock --update` RE-RESOLVES to latest and
609
+ silently undoes pin edits — pins go lockfile-version-edit +
610
+ `bundle install` + an installed-version verify, never
611
+ `bundle lock`; (c) the per-case sweep's verdict column stores
612
+ the RAW validity boolean — expected-INVALID rows reading false
613
+ are PASSES; the first assembly inverted them and manufactured 9
614
+ phantom reZ regressions before the correction.
577
615
  - TRAIN ADOPTION REGRESSION — CHARACTER REFERENCES (2026-11-11):
578
616
  the 2026-11-10 adoption verdict ("conformance-IDENTICAL") was
579
617
  WRONG for one class: moxml 0.6.4 stopped decoding numeric
580
618
  character references in attribute values. Minimal repro:
581
619
  `Moxml::Context.new.parse('<x a="&#x2190;"/>').root.attributes.
582
620
  first.value` → "←" on moxml 0.6.2, literal "&#x2190;" on 0.6.4.
621
+ FILED lutaml/moxml#540 (2026-11-12; repro: attribute values keep
622
+ the reference literal while element text decodes on 0.6.4).
583
623
  Downstream this breaks the whole UNICODE-BLOCK pattern-facet
584
624
  class — Regex_w3c Arrows/MathematicalOperators/
585
625
  ArabicPresentationForms-A/CJKCompatibilityForms/
@@ -225,7 +225,20 @@ module Lutaml
225
225
  container = Array(@group_particles.call(particle)).first
226
226
  return empty_fragment unless container
227
227
 
228
- with_occurrence(particle) { compile_container_body(container) }
228
+ # §4.2.2 redefine bodies self-reference by name; the body and
229
+ # the redefine target are distinct objects, so the compile
230
+ # path set keys on the resolved container's identity — a
231
+ # container may not compile within its own ancestry, while
232
+ # sibling reuse still compiles fresh.
233
+ @group_path ||= []
234
+ return empty_fragment if @group_path.include?(container)
235
+
236
+ @group_path.push(container)
237
+ fragment = with_occurrence(particle) do
238
+ compile_container_body(container)
239
+ end
240
+ @group_path.pop
241
+ fragment
229
242
  end
230
243
 
231
244
  # A group ref expands to its declaration's container, whose own
@@ -368,14 +368,31 @@ module Lutaml
368
368
  end
369
369
  end
370
370
 
371
- def leaf_particles(particles, repository)
371
+ def leaf_particles(particles, repository, ancestors = nil)
372
+ ancestors ||= {}
372
373
  particles.flat_map do |particle|
373
374
  case particle
374
375
  when Lutaml::Xml::Schema::Xsd::Group
375
- leaf_particles(expand_group_container(particle, repository),
376
- repository)
376
+ # §4.2.2 redefine bodies self-reference by NAME; the
377
+ # body and the redefine target are DISTINCT objects, so
378
+ # the path set keys on the group name — the same name
379
+ # cannot expand within its own ancestry, while sibling
380
+ # reuse still expands fresh.
381
+ group_name = if particle.name.to_s.empty?
382
+ particle.ref.to_s
383
+ else
384
+ particle.name.to_s
385
+ end
386
+ next [] if group_name.empty? || ancestors.key?(group_name)
387
+
388
+ ancestors[group_name] = true
389
+ body = expand_group_container(particle, repository)
390
+ leaves = body.nil? ? [] : leaf_particles(body, repository, ancestors)
391
+ ancestors.delete(group_name)
392
+ leaves
377
393
  when Lutaml::Xsd::Sequence, Lutaml::Xsd::Choice, Lutaml::Xsd::All
378
- leaf_particles(collect_particles(particle), repository)
394
+ leaf_particles(collect_particles(particle), repository,
395
+ ancestors)
379
396
  else
380
397
  [particle]
381
398
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lutaml
4
4
  module Xsd
5
- VERSION = "1.2.110"
5
+ VERSION = "1.2.112"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lutaml-xsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.110
4
+ version: 1.2.112
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-11-11 00:00:00.000000000 Z
11
+ date: 2026-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid