diff --git a/docs/user-guide/features.md b/docs/user-guide/features.md index d5c2160..7d7cd79 100644 --- a/docs/user-guide/features.md +++ b/docs/user-guide/features.md @@ -87,11 +87,9 @@ raise `ValueError` before feature execution. ### Calendar and bar grid The calendar-aware default targets the next minor version (0.2), separate from the 0.1.7 patch. -Development and qualification currently pin the merged Specs v2 implementation at -`701bde68744035050ede386efce498234c661c21`. The same immutable Git dependency is declared -in built package metadata; published Specs 0.1.5 does not provide this API. Before a PyPI -release, replace that source dependency with the verified published Specs version containing -the v2 contract and repeat installed-package qualification. +The shared temporal contract requires published `ml4t-specs>=0.2.0,<0.3.0`, also declared +in built package metadata. Specs 0.1.5 does not provide this API. Engineer's development +branch uses the published dependency; the temporal migration is not part of the 0.1.7 patch. Calendar selection uses the explicit `calendar` argument, then declared feed metadata, then NYSE. Explicit diff --git a/pyproject.toml b/pyproject.toml index 0dd9f84..93321da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,10 +8,6 @@ build-backend = "hatchling.build" [tool.hatch.version] source = "vcs" -[tool.hatch.metadata] -# Qualification pin until the shared time-contract v2 API is published on PyPI. -allow-direct-references = true - [tool.hatch.build.targets.wheel] packages = ["src/ml4t"] namespaces = true @@ -76,7 +72,7 @@ requires-python = ">=3.12,<3.15" # Core dependencies dependencies = [ - "ml4t-specs @ git+https://github.com/ml4t/specs.git@701bde68744035050ede386efce498234c661c21", + "ml4t-specs>=0.2.0,<0.3.0", # Data processing (Polars-first) "polars>=0.20.0", diff --git a/tests/test_release_policy.py b/tests/test_release_policy.py index 07db42a..87afb2b 100644 --- a/tests/test_release_policy.py +++ b/tests/test_release_policy.py @@ -242,7 +242,7 @@ def test_ci_audits_core_and_complete_locked_environments() -> None: assert "complete.txt" in audit -def test_core_dependency_uses_bounded_specs_or_immutable_source_for_qualification() -> None: +def test_core_dependency_requires_published_time_contract_v2() -> None: project = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8")) lock = tomllib.loads((ROOT / "uv.lock").read_text(encoding="utf-8")) @@ -252,17 +252,10 @@ def test_core_dependency_uses_bounded_specs_or_immutable_source_for_qualificatio if Requirement(value).name == "ml4t-specs" ) specs = next(package for package in lock["package"] if package["name"] == "ml4t-specs") - if requirement.url is None: - assert str(requirement.specifier) == "<0.2.0,>=0.1.0" - assert specs["version"] in requirement.specifier - else: - assert re.fullmatch( - r"git\+https://github.com/ml4t/specs\.git@[0-9a-f]{40}", requirement.url - ) - commit = requirement.url.rsplit("@", maxsplit=1)[1] - assert specs["source"] == { - "git": f"https://github.com/ml4t/specs.git?rev={commit}#{commit}" - } + assert requirement.url is None + assert str(requirement.specifier) == "<0.3.0,>=0.2.0" + assert specs["version"] in requirement.specifier + assert specs["source"] == {"registry": "https://pypi.org/simple"} def test_package_supports_python_312_through_314() -> None: diff --git a/uv.lock b/uv.lock index af62738..c5c6d49 100644 --- a/uv.lock +++ b/uv.lock @@ -1651,7 +1651,7 @@ requires-dist = [ { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.0" }, { name = "mkdocstrings", extras = ["python"], marker = "extra == 'all'", specifier = ">=0.24.0" }, { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=0.24.0" }, - { name = "ml4t-specs", git = "https://github.com/ml4t/specs.git?rev=701bde68744035050ede386efce498234c661c21" }, + { name = "ml4t-specs", specifier = ">=0.2.0,<0.3.0" }, { name = "numba", specifier = ">=0.57.0" }, { name = "numpy", specifier = ">=1.24.0,<2.6" }, { name = "pandas", specifier = ">=2.0.0" }, @@ -1728,11 +1728,15 @@ test = [ [[package]] name = "ml4t-specs" -version = "0.1.5" -source = { git = "https://github.com/ml4t/specs.git?rev=701bde68744035050ede386efce498234c661c21#701bde68744035050ede386efce498234c661c21" } +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/2e/46/c734e5bcac1f214c83423243023b5d313bccabd25563da4e7d5e6b80f9f4/ml4t_specs-0.2.0.tar.gz", hash = "sha256:e5d5d614f71d14223341f992009d0d0bf14f30a8398c50872d2b3fb80fd33d82", size = 59749, upload-time = "2026-10-17T18:21:32.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/ff/bfc427bb71635f31cb240330aa2b1b486748999f05a5922ee5f58df721fe/ml4t_specs-0.2.0-py3-none-any.whl", hash = "sha256:cfd550d19b469f1b083d6ac3f83b235fe71aee19c28465f2ac2c8620064bae61", size = 36946, upload-time = "2026-10-17T18:21:30.964Z" }, +] [[package]] name = "more-itertools"