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.
Files changed (35) hide show
  1. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/PKG-INFO +1 -1
  2. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/formats/jsonld.py +9 -1
  3. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_harvest_report.py +10 -0
  4. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/.gitignore +0 -0
  5. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/README.md +0 -0
  6. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/pyproject.toml +0 -0
  7. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/__init__.py +0 -0
  8. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/__init__.py +0 -0
  9. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/common/__init__.py +0 -0
  10. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/common/models.py +0 -0
  11. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/common/rocrate.py +0 -0
  12. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/py.typed +0 -0
  13. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v1/__init__.py +0 -0
  14. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v1/models.py +0 -0
  15. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v2/__init__.py +0 -0
  16. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v2/models.py +0 -0
  17. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v3/__init__.py +0 -0
  18. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/api_models/v3/models.py +0 -0
  19. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/config/__init__.py +0 -0
  20. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/config/config_base.py +0 -0
  21. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/config/config_wrapper.py +0 -0
  22. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/config/logging.py +0 -0
  23. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/py.typed +0 -0
  24. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/__init__.py +0 -0
  25. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/emit.py +0 -0
  26. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/formats/__init__.py +0 -0
  27. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/formats/base.py +0 -0
  28. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/report/model.py +0 -0
  29. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/src/middleware/shared/tracing.py +0 -0
  30. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_api_models.py +0 -0
  31. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_config_base.py +0 -0
  32. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_config_wrapper.py +0 -0
  33. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_logging.py +0 -0
  34. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_rocrate.py +0 -0
  35. {fairagro_middleware_shared-11.0.1.dev27 → fairagro_middleware_shared-11.0.1.dev28}/tests/unit/test_tracing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fairagro-middleware-shared
3
- Version: 11.0.1.dev27
3
+ Version: 11.0.1.dev28
4
4
  Summary: The FAIRagro advanced middleware shared components
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: opentelemetry-api>=1.26.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 UTC datetime value as an ISO 8601 timestamp ending in Z."""
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()