Skip to content

Commit 413e384

Browse files
authored
refactor(portfolio): remove package re-export facade (#1313)
1 parent a56f0a0 commit 413e384

10 files changed

Lines changed: 54 additions & 34 deletions

File tree

src/jacobian/composition.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pathlib import Path
66

77
from jacobian.installation.context import create_installation_context
8-
from jacobian.portfolio import install_portfolio
8+
from jacobian.portfolio.assembler import install_portfolio
99
from jacobian.runtime.bootstrap import bootstrap_services
1010
from jacobian.runtime.config import RuntimeOptions
1111
from jacobian.runtime.model import JacobianRuntime

src/jacobian/portfolio/__init__.py

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,3 @@
1-
"""Explicit mathematical portfolio installation."""
1+
"""Internal owners for explicit mathematical portfolio installation."""
22

3-
from jacobian.portfolio.assembler import install_portfolio
4-
from jacobian.portfolio.builtin import build_builtin_portfolio
5-
from jacobian.portfolio.model import PortfolioPlan
6-
from jacobian.portfolio.result import (
7-
PROVIDER_UNAVAILABLE,
8-
BundleInstallation,
9-
BundleInstallationStatus,
10-
PortfolioDiagnostic,
11-
PortfolioInstallationResult,
12-
)
13-
14-
__all__ = [
15-
"PROVIDER_UNAVAILABLE",
16-
"BundleInstallation",
17-
"BundleInstallationStatus",
18-
"PortfolioDiagnostic",
19-
"PortfolioInstallationResult",
20-
"PortfolioPlan",
21-
"build_builtin_portfolio",
22-
"install_portfolio",
23-
]
3+
__all__: tuple[str, ...] = ()

tests/boundary/process/public_api/test_import_isolation.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,43 @@ def test_runtime_assembly_does_not_import_packaged_backends(tmp_path: Path) -> N
7171
assert completed.returncode == 0, completed.stderr
7272

7373

74+
def test_portfolio_leaf_import_does_not_load_assembly_or_domains() -> None:
75+
_assert_not_imported(
76+
_imported_modules("jacobian.portfolio.provider_resolution"),
77+
(
78+
"jacobian.domains",
79+
"jacobian.portfolio.assembler",
80+
"jacobian.portfolio.builtin",
81+
"jacobian.runtime",
82+
),
83+
)
84+
85+
86+
def test_portfolio_root_is_an_import_transparent_internal_namespace() -> None:
87+
script = """
88+
import jacobian.portfolio as portfolio
89+
import sys
90+
91+
assert portfolio.__all__ == ()
92+
assert not hasattr(portfolio, "PortfolioPlan")
93+
assert not hasattr(portfolio, "install_portfolio")
94+
children = sorted(
95+
name for name in sys.modules if name.startswith("jacobian.portfolio.")
96+
)
97+
if children:
98+
raise AssertionError(f"portfolio root imported child modules: {children}")
99+
"""
100+
completed = subprocess.run(
101+
[sys.executable, "-c", script],
102+
check=False,
103+
capture_output=True,
104+
env={**os.environ, "SYMPY_GROUND_TYPES": "python"},
105+
text=True,
106+
)
107+
108+
assert completed.returncode == 0, completed.stderr
109+
110+
74111
def test_native_matrices_does_not_import_capabilities_or_provider_loading() -> None:
75112
_assert_not_imported(
76113
_imported_modules("jacobian.math.matrices"),

tests/composition/portfolio/test_builtin_portfolio_installation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from jacobian.domains.polynomial_nullstellensatz.singular import (
99
PRODUCE_CAPABILITY_ID,
1010
)
11-
from jacobian.portfolio import build_builtin_portfolio
11+
from jacobian.portfolio.builtin import build_builtin_portfolio
1212
from jacobian.providers.singular_runtime import singular_provider_runtime
1313
from jacobian.runtime.model import JacobianRuntime
1414

tests/composition/portfolio/test_portfolio_assembler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@
3434
DomainSemantics,
3535
OperationSpec,
3636
)
37-
from jacobian.portfolio import PROVIDER_UNAVAILABLE, PortfolioPlan
3837
from jacobian.portfolio.domain_installation import DomainBundleInstaller
38+
from jacobian.portfolio.model import PortfolioPlan
3939
from jacobian.portfolio.result import (
40+
PROVIDER_UNAVAILABLE,
4041
BundleInstallationStatus,
4142
PortfolioInstallationResult,
4243
)

tests/composition/portfolio/test_portfolio_plan.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
import pytest
66

77
from jacobian.domain_bundles import DomainBundle
8-
from jacobian.portfolio import PortfolioPlan, build_builtin_portfolio
9-
from jacobian.portfolio.builtin import build_builtin_portfolio_components
8+
from jacobian.portfolio.builtin import (
9+
build_builtin_portfolio,
10+
build_builtin_portfolio_components,
11+
)
12+
from jacobian.portfolio.model import PortfolioPlan
1013

1114

1215
def test_builtin_portfolio_is_an_explicit_plan_of_components() -> None:

tests/composition/runtime/test_portfolio_installation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from contextlib import nullcontext
44
from types import SimpleNamespace
55

6-
from jacobian.portfolio import assembler
6+
import jacobian.portfolio.assembler as assembler
77
from jacobian.runtime.portfolio import PortfolioResources
88

99

tests/unit/portfolio/test_portfolio_installation_phases.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88

99
import pytest
1010

11+
import jacobian.portfolio.foundation_installation as foundation_installation
1112
from jacobian.contracts.capabilities import (
1213
CapabilityInstallTier,
1314
CapabilityProviderAvailability,
1415
CapabilityProviderDigestKind,
1516
CapabilityProviderRuntime,
1617
)
1718
from jacobian.installation.context import InstallationContext
18-
from jacobian.portfolio import foundation_installation
1919
from jacobian.portfolio.checker_installation import CheckerPortfolioInstaller
2020
from jacobian.portfolio.core_installation import CoreApplicationInstaller
2121
from jacobian.portfolio.foundation_installation import FoundationInstaller

tests/unit/portfolio/test_portfolio_provider_resolution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77
import pytest
88

9+
import jacobian.portfolio.provider_resolution as provider_resolution
910
from jacobian.contracts.capabilities import (
1011
CapabilityInstallTier,
1112
CapabilityProviderAvailability,
1213
CapabilityProviderRuntime,
1314
)
14-
from jacobian.portfolio import provider_resolution
1515
from jacobian.portfolio.provider_resolution import ProviderAvailabilityResolver
1616
from jacobian.provider_runtime import ProviderRuntimeError, known_provider_runtime
1717

tools/check_test_architecture.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,9 @@
2222

2323
_TEST_FILE = "test_*.py"
2424

25-
# These are deliberately narrow names. Importing a typed domain model from
26-
# ``jacobian.portfolio`` is fine; importing the explicit built-in plan or its
27-
# complete installer is the operation that couples a lower tier to the whole
28-
# application.
25+
# These are deliberately narrow names. Typed portfolio models come from their
26+
# concrete owner modules; importing the built-in plan or assembler is the
27+
# operation that couples a lower tier to the whole application.
2928
_BUILTIN_PORTFOLIO_NAMES = frozenset(
3029
{
3130
"BUILTIN_PORTFOLIO",

0 commit comments

Comments
 (0)