Files
temp/features/steps/project_context_depth_gradient_steps.py
T
freemo 4eddbcf489 fix(cli): add --depth-gradient flag to project context set
Add the missing --depth-gradient repeatable flag to `project context set`
per specification. The flag accepts HOP:INT_OR_NAME format to control
context detail depth degradation with graph distance. Parsing validates
hop as integer and value as integer or recognized detail level name.

ISSUES CLOSED: #889
2026-03-30 17:12:20 +00:00

133 lines
4.0 KiB
Python

"""Step definitions for ``project_context_depth_gradient.feature``.
Tests the ``--depth-gradient`` flag on ``agents project context set``
and its display in ``agents project context show``.
"""
from __future__ import annotations
from typing import Any
from behave import given, then, when # type: ignore[import-untyped]
# ------------------------------------------------------------------
# Helpers — reuse the shared infrastructure from
# project_context_cli_steps (background steps, _run_with_container,
# _mock_container, etc. are already registered).
# ------------------------------------------------------------------
def _run_with_container_local(
context: Any, func: Any, *args: Any, **kwargs: Any
) -> None:
"""Delegate to the shared test runner from project_context_cli_steps."""
from features.steps.project_context_cli_steps import (
_run_with_container,
)
_run_with_container(context, func, *args, **kwargs)
# ------------------------------------------------------------------
# When steps
# ------------------------------------------------------------------
@when(
'I run context set on "{project}" with depth-gradient "{gradient}"',
)
def step_ctx_set_depth_gradient_single(
context: Any, project: str, gradient: str
) -> None:
from cleveragents.cli.commands.project_context import (
context_set,
)
_run_with_container_local(
context,
context_set,
project=project,
view="default",
depth_gradient=[gradient],
)
@when(
'I run context set on "{project}" with depth-gradients "{gradients}"',
)
def step_ctx_set_depth_gradient_multi(
context: Any, project: str, gradients: str
) -> None:
from cleveragents.cli.commands.project_context import (
context_set,
)
gradient_list = [g.strip() for g in gradients.split(",")]
_run_with_container_local(
context,
context_set,
project=project,
view="default",
depth_gradient=gradient_list,
)
# ------------------------------------------------------------------
# Given steps
# ------------------------------------------------------------------
@given('I have set depth-gradient "{gradients}" on "{project}"')
def step_given_depth_gradient(context: Any, gradients: str, project: str) -> None:
from cleveragents.cli.commands.project_context import (
context_set,
)
gradient_list = [g.strip() for g in gradients.split(",")]
_run_with_container_local(
context,
context_set,
project=project,
view="default",
depth_gradient=gradient_list,
)
# ------------------------------------------------------------------
# Then steps
# ------------------------------------------------------------------
def _read_stored_acms(context: Any) -> dict[str, Any]:
"""Read the stored ACMS config from the test DB."""
from cleveragents.cli.commands.project_context import (
_read_acms_config,
)
return _read_acms_config(context.ctx_session_factory, "local/ctx-app")
@then('the stored ACMS depth gradient should have hop "{hop}" with value {value:d}')
def step_depth_gradient_int(context: Any, hop: str, value: int) -> None:
acms = _read_stored_acms(context)
dg = acms.get("depth_gradient", {})
assert hop in dg, f"Hop '{hop}' not in depth_gradient: {dg}"
assert dg[hop] == value, f"Expected {value} for hop {hop}, got {dg[hop]}"
@then(
'the stored ACMS depth gradient should have hop "{hop}" with string value "{value}"'
)
def step_depth_gradient_str(context: Any, hop: str, value: str) -> None:
acms = _read_stored_acms(context)
dg = acms.get("depth_gradient", {})
assert hop in dg, f"Hop '{hop}' not in depth_gradient: {dg}"
assert dg[hop] == value, f"Expected '{value}' for hop {hop}, got {dg[hop]}"
@then('the context show output should contain "{text}"')
def step_show_output_contains(context: Any, text: str) -> None:
assert text in context.ctx_output, (
f"Expected '{text}' in output, got: {context.ctx_output!r}"
)