feat(protocol): extend KNOWN_FEATURES with temporal feature names
This commit is contained in:
@@ -20,7 +20,8 @@ KNOWN_INDICATORS: frozenset[str] = frozenset(
|
|||||||
{"sma", "rsi", "atr", "macd", "realized_vol"}
|
{"sma", "rsi", "atr", "macd", "realized_vol"}
|
||||||
)
|
)
|
||||||
KNOWN_FEATURES: frozenset[str] = frozenset(
|
KNOWN_FEATURES: frozenset[str] = frozenset(
|
||||||
{"open", "high", "low", "close", "volume"}
|
{"open", "high", "low", "close", "volume",
|
||||||
|
"hour", "dow", "is_weekend", "minute_of_hour"}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Convenience union (utile a validator / parser).
|
# Convenience union (utile a validator / parser).
|
||||||
|
|||||||
@@ -151,3 +151,33 @@ def test_feature_unknown_column_fails() -> None:
|
|||||||
ast = parse_strategy(src)
|
ast = parse_strategy(src)
|
||||||
with pytest.raises(ValidationError, match="unknown feature"):
|
with pytest.raises(ValidationError, match="unknown feature"):
|
||||||
validate_strategy(ast)
|
validate_strategy(ast)
|
||||||
|
|
||||||
|
|
||||||
|
def test_validator_accepts_temporal_features() -> None:
|
||||||
|
for name in ("hour", "dow", "is_weekend", "minute_of_hour"):
|
||||||
|
src = _wrap(
|
||||||
|
{
|
||||||
|
"op": "gt",
|
||||||
|
"args": [
|
||||||
|
{"kind": "feature", "name": name},
|
||||||
|
{"kind": "literal", "value": 0},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
ast = parse_strategy(src)
|
||||||
|
validate_strategy(ast) # no exception
|
||||||
|
|
||||||
|
|
||||||
|
def test_validator_rejects_temporal_typo() -> None:
|
||||||
|
src = _wrap(
|
||||||
|
{
|
||||||
|
"op": "gt",
|
||||||
|
"args": [
|
||||||
|
{"kind": "feature", "name": "weekday"},
|
||||||
|
{"kind": "literal", "value": 0},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
ast = parse_strategy(src)
|
||||||
|
with pytest.raises(ValidationError, match="unknown feature"):
|
||||||
|
validate_strategy(ast)
|
||||||
|
|||||||
Reference in New Issue
Block a user