fairagro-middleware-shared 11.0.1.dev27__tar.gz → 11.0.1.dev28__tar.gz
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.
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/PKG-INFO +1 -1
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/formats/jsonld.py +9 -1
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_harvest_report.py +10 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/.gitignore +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/README.md +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/pyproject.toml +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/common/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/common/models.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/common/rocrate.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/py.typed +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v1/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v1/models.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v2/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v2/models.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v3/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v3/models.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/config/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/config/config_base.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/config/config_wrapper.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/config/logging.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/py.typed +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/emit.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/formats/__init__.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/formats/base.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/model.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/tracing.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_api_models.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_config_base.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_config_wrapper.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_logging.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_rocrate.py +0 -0
- {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_tracing.py +0 -0
|
@@ -26,7 +26,15 @@ def _format_iso_duration(seconds: float) -> str:
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
def _format_iso_timestamp(value: datetime) -> str:
|
|
29
|
-
"""Format a
|
|
29
|
+
"""Format a timezone-aware datetime as an ISO 8601 UTC timestamp ending in Z.
|
|
30
|
+
|
|
31
|
+
Raises:
|
|
32
|
+
ValueError: If ``value`` is naive (no ``tzinfo``). Callers must supply
|
|
33
|
+
timezone-aware UTC times; treating naive values as local time would
|
|
34
|
+
silently shift the wall clock on non-UTC hosts.
|
|
35
|
+
"""
|
|
36
|
+
if value.tzinfo is None:
|
|
37
|
+
raise ValueError("HarvestReport timestamps must be timezone-aware UTC")
|
|
30
38
|
return value.astimezone(UTC).isoformat().replace("+00:00", "Z")
|
|
31
39
|
|
|
32
40
|
|
|
@@ -131,6 +131,16 @@ def test_jsonld_timestamps_and_durations() -> None:
|
|
|
131
131
|
assert document["schema:result"][0]["schema:duration"].startswith("PT")
|
|
132
132
|
|
|
133
133
|
|
|
134
|
+
def test_jsonld_rejects_naive_timestamps() -> None:
|
|
135
|
+
"""Naive start/end times must not be silently treated as local time."""
|
|
136
|
+
report = HarvestReport(
|
|
137
|
+
start_time=datetime(2026, 5, 6, 14, 0, 0),
|
|
138
|
+
end_time=datetime(2026, 5, 6, 14, 3, 45),
|
|
139
|
+
)
|
|
140
|
+
with pytest.raises(ValueError, match="timezone-aware"):
|
|
141
|
+
JsonLdReportSerializer().render(report)
|
|
142
|
+
|
|
143
|
+
|
|
134
144
|
def test_jsonld_metrics_and_failed_records() -> None:
|
|
135
145
|
"""Fairagro metrics and nested failed records are emitted."""
|
|
136
146
|
repo = _sample_repo()
|
{fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/.gitignore
RENAMED
|
File without changes
|
{fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/README.md
RENAMED
|
File without changes
|
{fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/pyproject.toml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|