lutaml-xsd 1.2.88 → 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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ee81fb06ad80e4da277c32dd4bd6dd3a5cdfbad94d2ba5c3fdef2b3a09cd64db
|
|
4
|
+
data.tar.gz: 43b043d4d772dd55838bbf7790d2d1bc7bfc9dda1c296377ac519d2acd75b7f2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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 |
|
|
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), +
|
|
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
|
|
@@ -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
|
data/lib/lutaml/xsd/version.rb
CHANGED
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.
|
|
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-
|
|
11
|
+
date: 2026-11-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: liquid
|