lutaml-xsd 1.2.87 → 1.2.89

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: 7833779c2a21aa5781c368fced14daf07f37bf56ed36449284b74ca3203cf76c
4
- data.tar.gz: 35a2c738d7731969d3299e81025795cb69c8df021947e336491cc92a78652e8a
3
+ metadata.gz: ee81fb06ad80e4da277c32dd4bd6dd3a5cdfbad94d2ba5c3fdef2b3a09cd64db
4
+ data.tar.gz: 43b043d4d772dd55838bbf7790d2d1bc7bfc9dda1c296377ac519d2acd75b7f2
5
5
  SHA512:
6
- metadata.gz: e3035170b48c95c6531936a931660b28d41364cdf89278452fe0872cfa5cc0aff3e8b11d305250de1c62504f2bd4860fc0341fb2c9a9f73e8d66c5027bffad0e
7
- data.tar.gz: d33b1e0a03248f8926a9e3f1789e409cacd2759afbc7db0c0d65012833ed6f4eb9735097a497248568e855e4fb7b060f77876def214a20b13716b286478f0f9b
6
+ metadata.gz: 2f3d851982c4b705f7bf3a2757110ac2ef8647031004618a3f105ebf4479ec214cb308395abd38c4bc85ab4edf2d432ec2822d6e5034ec1cda11d32b03e91e10
7
+ data.tar.gz: af59e1a701a4d46d9e82e79b908b350fbd53d5381e74efc8c841113cc914672c7cd96f846a59faa0281b8cfeb81d20b65b1f2812edd7aad15bb37eff47206702
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 | 4611/4696 (98.19%) |
123
+ | pipeline | 4613/4696 (98.23%) |
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), +650 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), +652 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
@@ -512,6 +512,21 @@ tuple keys, node-set field violations and absent-field rows handled, cross-eleme
512
512
  checks bind the no-ns int ct-A to the ns-b boolean children —
513
513
  'true' vs xsd:int — the per-child type plumbing under hint
514
514
  layering), full type-redefine body semantics.
515
+ - TEMPORAL-ENUMERATION ROUND (2026-11-05): +2 DataTypes (10->8,
516
+ dateTime_enumeration005a/b; suite 4611->4613 = 98.23%, zero
517
+ regressions, rspec green). Enumeration membership is a VALUE-space
518
+ test (Appendix E): the element- and attribute-side enumeration
519
+ checks now retry with INSTANT equality when the string compare
520
+ misses — both sides must parse as date-times and denote the same
521
+ instant (+00:00 equals Z). Unparseable forms never match, so the
522
+ string compare stays authoritative for every non-temporal type.
523
+ The 005a/b cases were orphaned legs of leptris-rs#27 (the engine
524
+ side fixed; our Ruby enumeration check carried the same lexical
525
+ comparison). ALSO UPSTREAM this round: three orphaned-leg
526
+ evidence comments posted (leptris-rs#36 confirmed FIXED by 406
527
+ and closed-out; #35 comment — stE050/stE055 fixed+empty root
528
+ legs still firing; #29 comment — elemZ020 substitution binding
529
+ still firing); the per-team remaining-issue inventory registered.
515
530
  - ENGINE-406 RIDE ROUND (2026-11-04, owner "leptris is updated"):
516
531
  leptris 1.9.403.0 -> 1.9.406.0 (three rides). +19 (suite
517
532
  4592->4611 = 98.19%, rspec green): the FULL #35 wave (fixed-empty
@@ -524,7 +539,14 @@ tuple keys, node-set field violations and absent-field rows handled, cross-eleme
524
539
  plus an IMPORTED attributeGroup ref; the facade re-check misses
525
540
  the hook members (the Ruby walk resolves it) — evidence
526
541
  commented on moxml#522 (same root, new shape). REMAINING 85:
527
- Regex 22 (engine dialect), AttributeGroup 14 (11 #522-thread +
542
+ Regex 22 (REGEX AUDIT 2026-11-05: ALL contested-highlight or
543
+ crosstalk — reJ 14 + reS 3 + reDH7a are the bugzilla-4113/6901
544
+ disputed families; reU6 + reT84 are FOUR-WAY vintage flip-flops
545
+ in the meta (valid/invalid/valid/invalid-Unicode_4.0.0 — the
546
+ harness takes the first); reT51 is the ASCII-vintage \d vs
547
+ Unicode-Nd irreconcilable reading (bugzilla 13607 cousin);
548
+ reT63 PASSES in isolation (batch-crosstalk artifact) — ZERO
549
+ actionable Ruby work in Regex), AttributeGroup 14 (11 #522-thread +
528
550
  the 4 new attgC), SimpleType 11, DataTypes 10 (corners), IC 6
529
551
  (idK/idZ singletons), Particles 6, Schema 3 (schA1/D10 Ruby +
530
552
  schG2 #522), Wildcards 3, Element 2, ModelGroups 2, Errata10 1.
@@ -829,6 +829,20 @@ module Lutaml
829
829
  allowed = Array(restriction.enumeration).map(&:value)
830
830
  return nil if allowed.empty? || allowed.include?(value)
831
831
 
832
+ # Appendix E membership is by VALUE: timezone-shifted
833
+ # spellings of the same instant are members. Unparseable
834
+ # forms never match — the string compare stays
835
+ # authoritative.
836
+ require "date"
837
+ instant = begin
838
+ DateTime.parse(value.to_s)
839
+ rescue StandardError
840
+ nil
841
+ end
842
+ return nil if instant && allowed.any? do |candidate|
843
+ parse_candidate_instant(candidate) == instant
844
+ end
845
+
832
846
  {
833
847
  code: "attribute_enumeration_violation",
834
848
  message: "has value '#{value}' that is not among " \
@@ -837,6 +851,14 @@ module Lutaml
837
851
  }
838
852
  end
839
853
 
854
+ # @return [DateTime, nil]
855
+ def parse_candidate_instant(text)
856
+ require "date"
857
+ DateTime.parse(text.to_s)
858
+ rescue StandardError
859
+ nil
860
+ end
861
+
840
862
  def pattern_violation(value, restriction)
841
863
  patterns = Array(restriction.pattern)
842
864
  return nil if patterns.empty?
@@ -852,6 +852,10 @@ module Lutaml
852
852
  end
853
853
 
854
854
  return if allowed_values.include?(value)
855
+ # Appendix E membership is by VALUE: timezone-shifted
856
+ # lexical forms of the same instant are members (the #27
857
+ # reading — "+00:00" equals "Z").
858
+ return if temporal_enumeration_match?(allowed_values, value)
855
859
 
856
860
  report_error(
857
861
  collector,
@@ -866,6 +870,29 @@ module Lutaml
866
870
  )
867
871
  end
868
872
 
873
+ # Instant-equality membership for temporal enumerations: both
874
+ # sides must parse as date-times and denote the same instant
875
+ # (timezone-shifted spellings are members). Unparseable forms
876
+ # never match — the string compare stays authoritative.
877
+ #
878
+ # @return [Boolean]
879
+ def temporal_enumeration_match?(allowed_values, value)
880
+ require "date"
881
+ instant = parse_instant(value)
882
+ return false unless instant
883
+
884
+ allowed_values.any? do |allowed|
885
+ parse_instant(allowed) == instant
886
+ end
887
+ end
888
+
889
+ # @return [DateTime, nil]
890
+ def parse_instant(text)
891
+ DateTime.parse(text.to_s)
892
+ rescue StandardError
893
+ nil
894
+ end
895
+
869
896
  # Validate list type
870
897
  #
871
898
  # @param value [String] The value
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lutaml
4
4
  module Xsd
5
- VERSION = "1.2.87"
5
+ VERSION = "1.2.89"
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.87
4
+ version: 1.2.89
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-04 00:00:00.000000000 Z
11
+ date: 2026-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid