Python: boolean mapping (#612)

* fix(python): boolean and integer mapping
This commit is contained in:
Paulo Lieuthier
2026-02-27 18:55:28 -03:00
committed by GitHub
parent 1c607dc1d3
commit bc23cd08ac
2 changed files with 39 additions and 8 deletions

View File

@@ -85,6 +85,10 @@ fn from(ob: &Bound<'_, PyAny>) -> Result<Value, PyErr> {
else if let Ok(s) = ob.extract::<String>() {
s.into()
}
// Boolean
else if let Ok(b) = ob.extract::<bool>() {
b.into()
}
// Numeric
else if let Ok(v) = ob.extract::<i64>() {
v.into()
@@ -93,10 +97,6 @@ fn from(ob: &Bound<'_, PyAny>) -> Result<Value, PyErr> {
} else if let Ok(v) = ob.extract::<f64>() {
v.into()
}
// Boolean
else if let Ok(b) = ob.extract::<bool>() {
b.into()
}
// None
else if ob.downcast::<PyNone>().is_ok() {
Value::Null
@@ -138,12 +138,17 @@ fn to(mut v: Value, py: Python<'_>) -> Result<PyObject> {
Value::String(s) => s.into_bound_py_any(py),
Value::Number(_) => {
if let Ok(f) = v.as_f64() {
if v.as_number()?.is_integer() {
if let Ok(u) = v.as_u64() {
u.into_bound_py_any(py)
} else {
v.as_i64()?.into_bound_py_any(py)
}
} else if let Ok(f) = v.as_f64() {
f.into_bound_py_any(py)
} else if let Ok(u) = v.as_u64() {
u.into_bound_py_any(py)
} else {
v.as_i64()?.into_bound_py_any(py)
// fallback
v.as_f64()?.into_bound_py_any(py)
}
}

View File

@@ -387,3 +387,29 @@ def test_extension_types():
assert st == {10, 12}, f"Unexpected set: {st}"
test_extension_types()
def test_boolean_mapping():
rego = regorus.Engine()
rego.add_policy("demo",
"""
package demo
result_b := data.a if {
data.a == true
}
result_i := data.b if {
data.b == 1
}
""")
rego.add_data({"a": True, "b": 1})
result_b = rego.eval_rule("data.demo.result_b")
assert isinstance(result_b, bool), f"Expected bool, got {type(result_b)}"
assert result_b, f"Unexpected result for 'result_b': {result_b}"
result_i = rego.eval_rule("data.demo.result_i")
assert isinstance(result_i, int), f"Expected int, got {type(result_i)}"
assert result_i == 1, f"Unexpected result for 'result_i': {result_i}"
test_boolean_mapping()