Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/docs/in_depth/mloda-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ from mloda.provider import FeatureResolutionError, ResolutionDiagnosis, Resoluti
- **`ResolutionDiagnosis`** (frozen dataclass): the return value of `diagnose`, never raised. Fields: `records` (`list[ResolutionRecord]`), `complete` (`bool`), `feature_name` (`str | None`), `failed_result` (`EvaluationResult | None`), `message` (`str | None`).
- **`ResolutionRecord`** (frozen dataclass): one per feature, returned inside `resolution_report()`, `ResolutionDiagnosis.records`, and `FeatureResolutionError.partial_records`; never raised. Fields: `feature_name` (`str`), `requested` (`bool`), `result` (`EvaluationResult`).

`EvaluationResult` is the captured matcher outcome carried by the fields above; it is defined in `mloda.core.prepare.resolution_types`, also importable from `mloda.core.prepare.identify_feature_group`, and is not part of the public `__init__` exports.
`EvaluationResult` is the captured matcher outcome carried by the fields above; it is defined in `mloda.core.prepare.resolution_types` and is not part of the public `__init__` exports.

##### get_feature_group_docs

Expand Down
8 changes: 3 additions & 5 deletions mloda/core/api/plugin_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,9 @@
dedup_feature_group_subclasses,
registry_for,
)
from mloda.core.prepare.identify_feature_group import (
CandidateFrameworks,
evaluate_and_render,
scope_callout,
)
from mloda.core.prepare.identify_feature_group import evaluate_and_render
from mloda.core.prepare.resolution_failure_renderer import scope_callout
from mloda.core.prepare.resolution_types import CandidateFrameworks


def list_registered(plugin_type: type[Any]) -> list[type[Any]]:
Expand Down
2 changes: 2 additions & 0 deletions mloda/core/api/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
from mloda.core.prepare.identify_feature_group import (
ComputeFrameworkPinError,
FeatureResolutionError,
)
from mloda.core.prepare.resolution_types import (
ResolutionDiagnosis,
ResolutionRecord,
)
Expand Down
4 changes: 2 additions & 2 deletions mloda/core/core/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
from mloda.core.prepare.graph.build_graph import BuildGraph
from mloda.core.prepare.resolve_graph import ResolveGraph
from mloda.core.runtime.run import ExecutionOrchestrator
from mloda.core.prepare.identify_feature_group import (
from mloda.core.prepare.identify_feature_group import resolve_or_raise
from mloda.core.prepare.resolution_types import (
EvaluationResult,
ResolutionRecord,
resolve_or_raise,
)
from mloda.core.runtime.flight.runner_flight_server import ParallelRunnerFlightServer
from mloda.core.abstract_plugins.feature_group import FeatureGroup, format_feature_group_class
Expand Down
26 changes: 2 additions & 24 deletions mloda/core/prepare/identify_feature_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,19 @@
from typing import Optional

from mloda.core.prepare.accessible_plugins import FeatureGroupEnvironmentMapping

# Not a re-export facade: every import here is used by this module and ruff F401 fails any added just to re-export.
from mloda.core.prepare.resolution_types import (
CandidateFrameworks,
Elimination,
EliminationStage,
EvaluationResult,
PARTIAL_RECORDS_CAP,
RenderFacts,
ResolutionDiagnosis,
ResolutionRecord,
)
from mloda.core.prepare.resolution_failure_renderer import (
TROUBLESHOOTING_URL,
render_resolution_failure,
scope_callout,
_prefix_name,
_supported_feature_names,
)
Expand All @@ -39,27 +38,6 @@

logger = logging.getLogger(__name__)

# Keeps the pre-split import surface of this module intact: the moved names stay importable from here.
__all__ = [
"CandidateFrameworks",
"ComputeFrameworkPinError",
"Elimination",
"EliminationStage",
"EvaluationResult",
"FeatureResolutionError",
"IdentifyFeatureGroupClass",
"PARTIAL_RECORDS_CAP",
"RenderFacts",
"ResolutionDiagnosis",
"ResolutionRecord",
"TROUBLESHOOTING_URL",
"evaluate_and_render",
"matches_feature_group_scope",
"render_resolution_failure",
"resolve_or_raise",
"scope_callout",
]


class FeatureResolutionError(ValueError):
"""Typed resolution failure carrying the feature name, the EvaluationResult of its single pass,
Expand Down
4 changes: 2 additions & 2 deletions mloda/provider/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@

# Feature resolution debugging
from mloda.core.api.plugin_docs import resolve_feature
from mloda.core.prepare.identify_feature_group import (
FeatureResolutionError,
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import (
ResolutionDiagnosis,
ResolutionRecord,
)
Expand Down
4 changes: 2 additions & 2 deletions mloda/steward/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@
)

# Feature resolution
from mloda.core.prepare.identify_feature_group import (
FeatureResolutionError,
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import (
ResolutionDiagnosis,
ResolutionRecord,
)
Expand Down
4 changes: 2 additions & 2 deletions mloda/user/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@
)

# Feature resolution
from mloda.core.prepare.identify_feature_group import (
FeatureResolutionError,
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import (
ResolutionDiagnosis,
ResolutionRecord,
)
Expand Down
6 changes: 3 additions & 3 deletions tests/test_core/test_api/test_diagnose.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Failing tests for the non-raising resolution preflight ``mlodaAPI.diagnose()`` (issue #812).

Contract under test:
* ``mloda.core.prepare.identify_feature_group.ResolutionDiagnosis`` is a frozen dataclass beside
* ``mloda.core.prepare.resolution_types.ResolutionDiagnosis`` is a frozen dataclass beside
``ResolutionRecord`` and ``EvaluationResult``, with fields ``records``, ``complete``, ``feature_name``,
``failed_result``, ``message`` in that order. It is re-exported from ``mloda.user`` and ``mloda.steward``.
* ``mlodaAPI.diagnose(...)`` runs the SAME eager planning as ``prepare(...)`` but NEVER raises for a
Expand All @@ -26,9 +26,9 @@
# ``mloda`` mlodaAPI alias imported below.
import mloda.steward as mloda_steward
import mloda.user as mloda_user
from mloda.core.prepare.identify_feature_group import (
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import (
EvaluationResult,
FeatureResolutionError,
ResolutionDiagnosis,
ResolutionRecord,
)
Expand Down
6 changes: 3 additions & 3 deletions tests/test_core/test_api/test_resolution_report.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Failing tests for per-feature EvaluationResult capture and ``session.resolution_report()`` (issue #811).

Contract under test:
* ``mloda.core.prepare.identify_feature_group.ResolutionRecord`` is a frozen dataclass beside
* ``mloda.core.prepare.resolution_types.ResolutionRecord`` is a frozen dataclass beside
``EvaluationResult``, with fields ``feature_name: str``, ``requested: bool``, ``result: EvaluationResult``
in that order. It is re-exported from both ``mloda.user`` and ``mloda.steward``.
* ``IdentifyFeatureGroupClass.evaluate(...)`` returns the winning ``EvaluationResult`` on a successful
Expand Down Expand Up @@ -31,9 +31,9 @@
import mloda.steward as mloda_steward
import mloda.user as mloda_user
from mloda.core.core.engine import Engine
from mloda.core.prepare.identify_feature_group import (
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import (
EvaluationResult,
FeatureResolutionError,
ResolutionRecord,
)
from tests.test_core.test_prepare.identify_seam import evaluate_or_raise
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@


from mloda.core.core.engine import Engine
from mloda.core.prepare.identify_feature_group import EvaluationResult
from mloda.core.prepare.resolution_types import EvaluationResult
from mloda.core.abstract_plugins.components.feature import Feature
from mloda.core.abstract_plugins.components.feature_collection import Features
from mloda.core.abstract_plugins.components.feature_name import FeatureName
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@

import pytest

from mloda.core.prepare.identify_feature_group import (
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import (
EvaluationResult,
FeatureResolutionError,
ResolutionDiagnosis,
ResolutionRecord,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

from typing import Any

from mloda.core.prepare.identify_feature_group import EvaluationResult
from mloda.core.prepare.resolution_types import EvaluationResult
from mloda.provider import DefaultOptionKeys
from mloda.user import Feature, Options, PluginCollector, ResolutionRecord, mloda, mlodaAPI
from mloda_plugins.compute_framework.base_implementations.pandas.dataframe import PandasDataFrame
Expand Down
6 changes: 2 additions & 4 deletions tests/test_core/test_prepare/identify_seam.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@
from mloda.core.abstract_plugins.compute_framework import ComputeFramework
from mloda.core.abstract_plugins.feature_group import FeatureGroup
from mloda.core.prepare.accessible_plugins import FeatureGroupEnvironmentMapping
from mloda.core.prepare.identify_feature_group import (
EvaluationResult,
resolve_or_raise,
)
from mloda.core.prepare.identify_feature_group import resolve_or_raise
from mloda.core.prepare.resolution_types import EvaluationResult


def evaluate_or_raise(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@
from mloda.core.abstract_plugins.feature_group import FeatureGroup
from mloda.core.prepare.accessible_plugins import FeatureGroupEnvironmentMapping
from mloda.core.prepare.identify_feature_group import (
Elimination,
FeatureResolutionError,
IdentifyFeatureGroupClass,
render_resolution_failure,
)
from mloda.core.prepare.resolution_failure_renderer import render_resolution_failure
from mloda.core.prepare.resolution_types import Elimination
from tests.test_core.test_prepare.identify_seam import evaluate_or_raise, identify_winner


Expand Down
2 changes: 1 addition & 1 deletion tests/test_core/test_prepare/test_feature_group_dedup.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
dedup_feature_group_subclasses,
_safe_class_source_hash,
)
from mloda.core.prepare.identify_feature_group import ResolutionDiagnosis
from mloda.core.prepare.resolution_types import ResolutionDiagnosis
from mloda_plugins.compute_framework.base_implementations.pandas.dataframe import PandasDataFrame


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
from mloda.core.prepare.identify_feature_group import (
FeatureResolutionError,
IdentifyFeatureGroupClass,
render_resolution_failure,
)
from mloda.core.prepare.resolution_failure_renderer import render_resolution_failure
from mloda.user import mlodaAPI
from tests.test_core.test_prepare.identify_seam import evaluate_or_raise

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Failing tests for the diagnose refactor: FeatureResolutionError carries the partial resolution records.

Contract under test (PR #836):
* ``PARTIAL_RECORDS_CAP`` is a module-level int constant (1000) in ``identify_feature_group``.
* ``PARTIAL_RECORDS_CAP`` is a module-level int constant (1000) in ``resolution_types``.
* ``FeatureResolutionError.__init__`` accepts ``partial_records: Sequence[ResolutionRecord] = ()`` and stores
it as a tuple truncated to the LAST ``PARTIAL_RECORDS_CAP`` entries; ``__reduce__`` round-trips it via pickle.
* The raising ``mloda.prepare`` path attaches the records resolved before the failure to the error, and
Expand All @@ -23,9 +23,9 @@

from mloda.core.api.request import SetupConfigurationError
from mloda.core.core.engine import Engine
from mloda.core.prepare.identify_feature_group import (
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import (
EvaluationResult,
FeatureResolutionError,
ResolutionRecord,
)
from mloda.provider import BaseInputData, ComputeFramework, DataCreator, FeatureGroup, FeatureSet
Expand Down Expand Up @@ -114,7 +114,7 @@ class TestPartialRecordsCapConstant:
"""PARTIAL_RECORDS_CAP is a module-level int constant with value 1000."""

def test_partial_records_cap_is_1000(self) -> None:
from mloda.core.prepare.identify_feature_group import PARTIAL_RECORDS_CAP
from mloda.core.prepare.resolution_types import PARTIAL_RECORDS_CAP

assert isinstance(PARTIAL_RECORDS_CAP, int)
assert PARTIAL_RECORDS_CAP == 1000
Expand Down Expand Up @@ -143,7 +143,7 @@ def test_partial_records_is_stored_as_a_tuple(self) -> None:
assert error.partial_records == tuple(records)

def test_partial_records_is_truncated_to_the_last_cap_entries(self) -> None:
from mloda.core.prepare.identify_feature_group import PARTIAL_RECORDS_CAP
from mloda.core.prepare.resolution_types import PARTIAL_RECORDS_CAP

result = _empty_result()
records = [_record(f"capped_836pr_{index}", result) for index in range(PARTIAL_RECORDS_CAP + 5)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@
from mloda.core.abstract_plugins.compute_framework import ComputeFramework
from mloda.core.abstract_plugins.feature_group import FeatureGroup
from mloda.core.prepare.accessible_plugins import FeatureGroupEnvironmentMapping
from mloda.core.prepare.identify_feature_group import Elimination, EvaluationResult, FeatureResolutionError
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import Elimination, EvaluationResult
from tests.test_core.test_prepare.identify_seam import evaluate_or_raise


Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
"""Tests for error message formatting in identify_feature_group.py.
"""Tests for the resolution failure messages raised when a feature does not resolve to exactly one group.

This test verifies that the multiple-feature-group error message uses the
formatted candidate output from _render_multiple (naming each class as
"ClassName (module.path)") instead of raw dict/class representation.
The formatting lives in mloda/core/prepare/resolution_failure_renderer.py: _render_multiple names each
candidate as "ClassName (module.path)" instead of a raw dict/class representation.
"""

from typing import Optional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
from mloda.core.prepare.accessible_plugins import FeatureGroupEnvironmentMapping
from mloda.core.prepare.identify_feature_group import (
ComputeFrameworkPinError,
EvaluationResult,
IdentifyFeatureGroupClass,
)
from mloda.core.prepare.resolution_types import EvaluationResult
from mloda_plugins.compute_framework.base_implementations.pandas.dataframe import PandasDataFrame
from mloda_plugins.compute_framework.base_implementations.python_dict.python_dict_framework import PythonDictFramework
from tests.test_core.test_prepare.identify_seam import evaluate_or_raise
Expand Down
4 changes: 2 additions & 2 deletions tests/test_core/test_prepare/test_identify_seam.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
from mloda.core.abstract_plugins.feature_group import FeatureGroup
from mloda.core.prepare.accessible_plugins import FeatureGroupEnvironmentMapping
from mloda.core.prepare.identify_feature_group import (
EvaluationResult,
FeatureResolutionError,
IdentifyFeatureGroupClass,
render_resolution_failure,
)
from mloda.core.prepare.resolution_failure_renderer import render_resolution_failure
from mloda.core.prepare.resolution_types import EvaluationResult
from tests.test_core.test_prepare.identify_seam import evaluate_or_raise, identify_winner


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
from mloda.core.abstract_plugins.compute_framework import ComputeFramework
from mloda.core.abstract_plugins.feature_group import FeatureGroup
from mloda.core.prepare.accessible_plugins import FeatureGroupEnvironmentMapping
from mloda.core.prepare.identify_feature_group import EvaluationResult, FeatureResolutionError
from mloda.core.prepare.identify_feature_group import FeatureResolutionError
from mloda.core.prepare.resolution_types import EvaluationResult
from mloda.provider import PropertySpec
from tests.test_core.test_prepare.identify_seam import evaluate_or_raise

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@
from mloda.core.abstract_plugins.feature_group import FeatureGroup
from mloda.core.api.plugin_docs import resolve_feature
from mloda.core.prepare.accessible_plugins import FeatureGroupEnvironmentMapping
from mloda.core.prepare.identify_feature_group import (
from mloda.core.prepare.identify_feature_group import IdentifyFeatureGroupClass
from mloda.core.prepare.resolution_failure_renderer import render_resolution_failure
from mloda.core.prepare.resolution_types import (
CandidateFrameworks,
Elimination,
EvaluationResult,
IdentifyFeatureGroupClass,
RenderFacts,
render_resolution_failure,
)


Expand Down
Loading
Loading