From 775a4ee261200d375c5a53dc5a32df80ede80412 Mon Sep 17 00:00:00 2001 From: Robert Yokota Date: Fri, 13 Mar 2026 17:37:04 -0700 Subject: [PATCH] Update utils.is_deep_equal to allow subclassing --- src/jsonata/utils.py | 5 +++-- tests/types_test.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/jsonata/utils.py b/src/jsonata/utils.py index 8b43aea..eaab3e2 100644 --- a/src/jsonata/utils.py +++ b/src/jsonata/utils.py @@ -106,9 +106,10 @@ def is_deep_equal(lhs: Optional[Any], rhs: Optional[Any]) -> bool: if not Utils.is_deep_equal(lhs[key], rhs[key]): return False return True - if lhs == rhs and type(lhs) == type(rhs): + if lhs == rhs: + if isinstance(lhs, bool) != isinstance(rhs, bool): + return False return True - return False class JList(list): diff --git a/tests/types_test.py b/tests/types_test.py index 0b8b076..4fbaa33 100644 --- a/tests/types_test.py +++ b/tests/types_test.py @@ -47,3 +47,18 @@ def test_fix_issue_21(self): """ assert jsonata.Jsonata("true = 1").evaluate({}) is False assert jsonata.Jsonata("false = 0").evaluate({}) is False + + def test_fix_issue_23(self): + """ + https://github.com/rayokota/jsonata-python/issues/23 + """ + class PlainScalarString(str): + pass + + data = { + "foo": [ + {"some_attr": PlainScalarString("some_value"), "bar": 17}, + {"some_attr": PlainScalarString("other_value"), "bar": 19}, + ] + } + assert jsonata.Jsonata('foo[some_attr="some_value"].bar').evaluate(data) == 17