diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index ec16c37..a20207c 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -1,10 +1,10 @@
name: Test PyShEx
env:
- UV_VERSION: "0.7.13"
+ UV_VERSION: "0.12.18"
on:
push:
branches:
- - main
+ - master
pull_request:
workflow_dispatch:
@@ -47,6 +47,7 @@ jobs:
uses: actions/checkout@v6
with:
fetch-depth: 0
+ submodules: true
- name: Install uv
uses: astral-sh/setup-uv@v7
@@ -66,6 +67,8 @@ jobs:
- name: Generate coverage results
# Set bash shell to fail correctly on Windows https://github.com/actions/runner-images/issues/6668
shell: bash
+ env:
+ SKIP_EXTERNAL_URLS: "true"
run: |
uv run coverage run -m pytest
uv run coverage xml
@@ -76,5 +79,5 @@ jobs:
with:
name: codecov-results-${{ matrix.os }}-${{ matrix.python-version }}
token: ${{ secrets.CODECOV_TOKEN }}
- file: coverage.xml
+ files: coverage.xml
fail_ci_if_error: false
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index 2b5733b..f96ed9c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
[submodule "tests/data/shexTest"]
path = tests/data/shexTest
- url = git@github.com:shexSpec/shexTest.git
+ url = https://github.com/shexSpec/shexTest.git
diff --git a/ancilliary/earlreport.py b/ancilliary/earlreport.py
index 5cf25bf..7669108 100644
--- a/ancilliary/earlreport.py
+++ b/ancilliary/earlreport.py
@@ -72,7 +72,7 @@ def _add_result(self, entry: BNode, status: bool) -> None:
rslt = BNode()
self.add(rslt, RDF.type, EARL.TestResult)\
.add(rslt, EARL.outcome, EARL[status])\
- .add(rslt, DC.date, Literal(datetime.datetime.utcnow().isoformat()))\
+ .add(rslt, DC.date, Literal(datetime.datetime.now(datetime.timezone.utc).replace(tzinfo=None).isoformat()))\
.add(entry, EARL.result, rslt)
def __str__(self) -> str:
diff --git a/pyproject.toml b/pyproject.toml
index c1cf690..e8af025 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -64,6 +64,12 @@ dev = [
"coverage",
]
+[tool.pytest.ini_options]
+testpaths = ["tests"]
+# tests/data holds test *data* (including the shexTest submodule, which ships
+# its own pytest suite) — never collect from it
+addopts = "--ignore=tests/data"
+
[tool.black]
line-length = 120
target-version = ["py310", "py311", "py312", "py313", "py314"]
diff --git a/pyshex/prefixlib.py b/pyshex/prefixlib.py
index 0a1a9d9..0750d3e 100644
--- a/pyshex/prefixlib.py
+++ b/pyshex/prefixlib.py
@@ -1,6 +1,6 @@
import re
-from pyshexc.parser_impl.generate_shexj import load_shex_file
+from pyshex.utils.schema_loader import load_shex_file
from rdflib import Namespace, Graph, RDF, RDFS, XSD, URIRef, __version__
from rdflib.namespace import DOAP, FOAF, DC, DCTERMS, SKOS, OWL, XMLNS
if __version__.startswith("5."):
@@ -66,14 +66,23 @@ def add_shex(self, schema: str) -> "PrefixLibrary":
def add_rdf(self, rdf: str | Graph, format: str | None = "turtle") -> "PrefixLibrary":
if not isinstance(rdf, Graph):
- g = Graph()
+ # "core" keeps the pre-rdflib-6 binding set (rdf, rdfs, xsd, ...) rather
+ # than the ~30 namespaces rdflib now binds by default. The json-ld
+ # parser re-binds the full default set mid-parse, so for that format
+ # anything beyond core that matches a default binding is dropped —
+ # at the cost of losing @context prefixes identical to a default.
+ g = Graph(bind_namespaces="core")
+ injectable = set(Graph().namespace_manager.namespaces()) - \
+ set(g.namespace_manager.namespaces()) if format and 'json-ld' in format else set()
if '\n' in rdf or '\r' in rdf or ' ' in rdf:
g.parse(data=rdf, format=format)
else:
g.parse(rdf, format=format)
+ namespaces = [(k, v) for k, v in g.namespace_manager.namespaces()
+ if (k, v) not in injectable]
else:
- g = rdf
- for k, v in g.namespace_manager.namespaces():
+ namespaces = list(rdf.namespace_manager.namespaces())
+ for k, v in namespaces:
setattr(self, k.upper(), Namespace(v))
return self
diff --git a/pyshex/shapemap_structure_and_language/p1_notation_and_terminology.py b/pyshex/shapemap_structure_and_language/p1_notation_and_terminology.py
index 9637472..ca58833 100644
--- a/pyshex/shapemap_structure_and_language/p1_notation_and_terminology.py
+++ b/pyshex/shapemap_structure_and_language/p1_notation_and_terminology.py
@@ -52,7 +52,7 @@ def __init__(self, ts: Iterator[RDFTriple] | Iterator[Triple] | None = None) ->
def __str__(self) -> str:
g = Graph()
[g.add((e.s, e.p, e.o)) for e in self]
- return re.sub(r'^@prefix.*', '', g.serialize(format="turtle").decode(), flags=re.MULTILINE).strip()
+ return re.sub(r'^@prefix.*', '', g.serialize(format="turtle"), flags=re.MULTILINE).strip()
def add_triples(self, triples: Iterator[Triple]):
super().update([RDFTriple(t) for t in triples])
diff --git a/pyshex/shex_evaluator.py b/pyshex/shex_evaluator.py
index 040987b..e9853cd 100644
--- a/pyshex/shex_evaluator.py
+++ b/pyshex/shex_evaluator.py
@@ -103,7 +103,7 @@ def rdf(self) -> str:
:return: The rendering of whatever RDF is currently being evaluated
"""
- return self.g.serialize(format=self.rdf_format).decode()
+ return self.g.serialize(format=self.rdf_format)
@rdf.setter
def rdf(self, rdf: str | Graph | None) -> None:
diff --git a/pyshex/utils/schema_loader.py b/pyshex/utils/schema_loader.py
index 72fdb4d..1a116e1 100644
--- a/pyshex/utils/schema_loader.py
+++ b/pyshex/utils/schema_loader.py
@@ -1,11 +1,43 @@
+import codecs
import os
import re
+from pathlib import PureWindowsPath
from typing import cast, TextIO
+from urllib import request
+
+import chardet
from ShExJSG import ShExJ
from pyjsg.jsglib import loads
from pyshexc.parser_impl import generate_shexj
-from pyshexc.parser_impl.generate_shexj import load_shex_file
+
+
+def _base_uri(loc: str | None) -> str | None:
+ """ A Windows filesystem path is not a legal IRI (drive letter, backslashes):
+ convert it to a file:/// URI before it is used as a document base. POSIX paths
+ are legal IRI references and are left untouched. """
+ if loc and (re.match(r'^[A-Za-z]:[/\\]', loc) or loc.startswith('\\\\')):
+ return PureWindowsPath(loc).as_uri()
+ return loc
+
+
+def load_shex_file(shexfilename: str) -> str:
+ """ Read a ShEx file or URL, honoring a UTF-8 BOM and otherwise guessing the encoding.
+
+ Same as pyshexc.parser_impl.generate_shexj.load_shex_file, except that it falls back to
+ UTF-8 when chardet (>= 7) reports no encoding, instead of crashing in bytes.decode(None).
+ """
+ if '://' in shexfilename:
+ with request.urlopen(shexfilename) as response:
+ data = response.read()
+ else:
+ with open(shexfilename, 'rb') as inf:
+ data = inf.read()
+ if data.startswith(codecs.BOM_UTF8):
+ return data.decode('utf-8-sig')
+ result = chardet.detect(data)
+ encoding = result['encoding'] if result['encoding'] and float(result['confidence'] or 0) > 0.9 else 'UTF-8'
+ return data.decode(encoding)
class SchemaLoader:
@@ -54,7 +86,7 @@ def loads(self, schema_txt: str) -> ShExJ.Schema:
# TODO: figure out how to propagate self.base_location into this parse
return cast(ShExJ.Schema, loads(schema_txt, ShExJ))
else:
- return generate_shexj.parse(schema_txt, self.base_location)
+ return generate_shexj.parse(schema_txt, _base_uri(self.base_location))
def location_rewrite(self, schema_location: str) -> str:
if self.root_location is not None and self.redirect_location is not None:
diff --git a/tests/__init__.py b/tests/__init__.py
index 5e3856a..99f07b4 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -6,12 +6,15 @@
# True means that we skip all tests that go outside our own environment (e.g. wikidata, etc)
# You can set this to True, False or base it on the present of a file in the root directory called "tests/data/SKIP_EXTERNAL_URLS"
-SKIP_EXTERNAL_URLS = os.environ.get('SKIP_EXTERNAL_URLS', None)
+# Must be a real bool: a string handed to pytest.mark.skipif gets eval'ed as a Python expression
+_skip_env = os.environ.get('SKIP_EXTERNAL_URLS', None)
SKIP_EXTERNAL_URLS_MSG = "External url's are not tested - set tests.__init__.py.SKIP_EXTERNAL_URLS to False to run"
datadir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'data'))
-if SKIP_EXTERNAL_URLS is None:
+if _skip_env is None:
SKIP_EXTERNAL_URLS = os.path.exists(os.path.join(datadir, 'SKIP_EXTERNAL_URLS'))
+else:
+ SKIP_EXTERNAL_URLS = _skip_env.lower() not in ('', '0', 'false', 'no')
print("Skipping external URL tests" if SKIP_EXTERNAL_URLS else "Including external URLs in tests")
diff --git a/tests/data/earl_report.ttl b/tests/data/earl_report.ttl
index 75ae447..6db6e46 100644
--- a/tests/data/earl_report.ttl
+++ b/tests/data/earl_report.ttl
@@ -1,17 +1,17 @@
-@prefix dc: .
+@prefix dc: .
+@prefix dc1: .
@prefix doap: .
@prefix earl: .
@prefix foaf: .
-@prefix ns1: .
@prefix xsd: .
a doap:Project,
earl:Software,
earl:TestSubject ;
- dc:creator ;
- dc:date "2018-11-13"^^xsd:date ;
- dc:description "Python implementation of ShEx"@en ;
- dc:title "PyShEx" ;
+ dc1:creator ;
+ dc1:date "2018-11-13"^^xsd:date ;
+ dc1:description "Python implementation of ShEx"@en ;
+ dc1:title "PyShEx" ;
doap:bug-database ;
doap:category ;
doap:created "2017-06-01"^^xsd:date ;
@@ -39,178 +39,169 @@
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:45.120518" ;
+ dc:date "2026-09-24T03:41:31.333633" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
-
-[] a earl:Assertion ;
- earl:assertedBy ;
- earl:mode earl:automatic ;
- earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.591448" ;
- earl:outcome earl:passed ] ;
- earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.693541" ;
+ dc:date "2026-09-24T03:41:31.282669" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:29.364743" ;
+ dc:date "2026-09-24T03:41:31.691379" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.446309" ;
+ dc:date "2026-09-24T03:41:32.658518" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.088048" ;
+ dc:date "2026-09-24T03:41:31.796553" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.442231" ;
+ dc:date "2026-09-24T03:41:31.932503" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.698165" ;
+ dc:date "2026-09-24T03:41:31.987007" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.709440" ;
+ dc:date "2026-09-24T03:41:31.792008" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.625494" ;
+ dc:date "2026-09-24T03:41:31.439499" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.466959" ;
+ dc:date "2026-09-24T03:41:31.898519" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.221115" ;
+ dc:date "2026-09-24T03:41:32.397204" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:43.595705" ;
+ dc:date "2026-09-24T03:41:31.180245" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.842974" ;
+ dc:date "2026-09-24T03:41:31.753442" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.020166" ;
+ dc:date "2026-09-24T03:41:31.467427" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.727783" ;
+ dc:date "2026-09-24T03:41:32.396214" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.099171" ;
+ dc:date "2026-09-24T03:41:31.168244" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.862621" ;
+ dc:date "2026-09-24T03:41:31.784162" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:43.495683" ;
+ dc:date "2026-09-24T03:41:31.537984" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.173045" ;
+ dc:date "2026-09-24T03:41:31.555672" ;
earl:outcome earl:passed ] ;
earl:subject ;
earl:test .
@@ -219,2527 +210,2518 @@
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:45.368580" ;
+ dc:date "2026-09-24T03:41:31.207703" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
-
-[] a earl:Assertion ;
- earl:assertedBy ;
- earl:mode earl:automatic ;
- earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.573968" ;
- earl:outcome earl:passed ] ;
- earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:26.188748" ;
+ dc:date "2026-09-24T03:41:31.173427" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.334251" ;
+ dc:date "2026-09-24T03:41:31.441949" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.012278" ;
+ dc:date "2026-09-24T03:41:31.498415" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.654144" ;
+ dc:date "2026-09-24T03:41:31.571166" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.564622" ;
+ dc:date "2026-09-24T03:41:31.293160" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.936779" ;
+ dc:date "2026-09-24T03:41:31.972110" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.913813" ;
+ dc:date "2026-09-24T03:41:31.946281" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.645270" ;
+ dc:date "2026-09-24T03:41:31.953069" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.834837" ;
+ dc:date "2026-09-24T03:41:31.935354" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:43.570459" ;
+ dc:date "2026-09-24T03:41:31.722301" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.199914" ;
+ dc:date "2026-09-24T03:41:31.782832" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:43.556758" ;
+ dc:date "2026-09-24T03:41:31.415019" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.212839" ;
+ dc:date "2026-09-24T03:41:32.403175" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.245650" ;
+ dc:date "2026-09-24T03:41:31.356161" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.278581" ;
+ dc:date "2026-09-24T03:41:30.788884" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:43.658069" ;
+ dc:date "2026-09-24T03:41:28.533277" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.830666" ;
+ dc:date "2026-09-24T03:41:31.176339" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.581660" ;
+ dc:date "2026-09-24T03:41:32.383955" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.513980" ;
+ dc:date "2026-09-24T03:41:31.824022" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.487331" ;
+ dc:date "2026-09-24T03:41:31.789950" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.814272" ;
+ dc:date "2026-09-24T03:41:31.534782" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.635569" ;
+ dc:date "2026-09-24T03:41:30.037086" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.605592" ;
+ dc:date "2026-09-24T03:41:31.283777" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.179361" ;
+ dc:date "2026-09-24T03:41:31.260026" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.675122" ;
+ dc:date "2026-09-24T03:41:31.593100" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:44.901641" ;
+ dc:date "2026-09-24T03:41:31.370907" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.892240" ;
+ dc:date "2026-09-24T03:41:32.569727" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:43.413280" ;
+ dc:date "2026-09-24T03:41:31.430891" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.372332" ;
+ dc:date "2026-09-24T03:41:32.589684" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.982961" ;
+ dc:date "2026-09-24T03:41:32.398835" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.879182" ;
+ dc:date "2026-09-24T03:41:31.894039" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.546587" ;
+ dc:date "2026-09-24T03:41:31.984526" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.717724" ;
+ dc:date "2026-09-24T03:41:29.832085" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.960077" ;
+ dc:date "2026-09-24T03:41:31.167196" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.333173" ;
+ dc:date "2026-09-24T03:41:32.029297" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.268119" ;
+ dc:date "2026-09-24T03:41:32.327065" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:43.585977" ;
+ dc:date "2026-09-24T03:41:32.680194" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.011091" ;
+ dc:date "2026-09-24T03:41:32.313208" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:43.440103" ;
+ dc:date "2026-09-24T03:41:31.565575" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.283792" ;
+ dc:date "2026-09-24T03:41:32.041864" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.471688" ;
+ dc:date "2026-09-24T03:41:31.667664" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.585902" ;
+ dc:date "2026-09-24T03:41:31.317337" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:44.806432" ;
+ dc:date "2026-09-24T03:41:31.850273" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.047602" ;
+ dc:date "2026-09-24T03:41:31.658602" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.736458" ;
+ dc:date "2026-09-24T03:41:28.525816" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.837110" ;
+ dc:date "2026-09-24T03:41:31.505624" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.863550" ;
+ dc:date "2026-09-24T03:41:31.719805" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:40.395403" ;
+ dc:date "2026-09-24T03:41:31.390656" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:45.298011" ;
+ dc:date "2026-09-24T03:41:31.257925" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.719104" ;
+ dc:date "2026-09-24T03:41:31.666555" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.309079" ;
+ dc:date "2026-09-24T03:41:32.039699" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:19.771500" ;
+ dc:date "2026-09-24T03:41:31.834131" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.042270" ;
+ dc:date "2026-09-24T03:41:30.426091" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.661045" ;
+ dc:date "2026-09-24T03:41:32.012370" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.749631" ;
+ dc:date "2026-09-24T03:41:31.395056" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.779519" ;
+ dc:date "2026-09-24T03:41:31.222973" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.856100" ;
+ dc:date "2026-09-24T03:41:31.919604" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:37.665553" ;
+ dc:date "2026-09-24T03:41:31.316314" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:41.633797" ;
+ dc:date "2026-09-24T03:41:31.485215" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:39.499114" ;
+ dc:date "2026-09-24T03:41:31.828026" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:22.617053" ;
+ dc:date "2026-09-24T03:41:32.376815" ;
earl:outcome earl:passed ] ;
earl:subject ;
- earl:test .
+ earl:test .
[] a earl:Assertion ;
earl:assertedBy ;
earl:mode earl:automatic ;
earl:result [ a earl:TestResult ;
- ns1:date "2022-01-14T21:07:38.721676" ;
+ dc:date "2026-09-24T03:41:31.609811" ;
earl:outcome earl:passed ] ;
earl:subject