From 76d39f1795e34fa8f6138d26e43477358321d944 Mon Sep 17 00:00:00 2001 From: Matthew Keeler Date: Mon, 2 Nov 2026 11:37:49 -0500 Subject: [PATCH 1/2] feat!: Make EvaluationDetail.is_default_value a property EvaluationDetail.is_default_value is now a property, like the other getters on EvaluationDetail. Callers must drop the parentheses and write detail.is_default_value. --- ldclient/async_client.py | 2 +- ldclient/client.py | 2 +- ldclient/evaluation.py | 5 +++-- ldclient/testing/impl/datasystem/test_fdv2_persistence.py | 2 +- ldclient/testing/test_ldclient_evaluation.py | 4 ++-- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ldclient/async_client.py b/ldclient/async_client.py index 9e740b75..5058c1c7 100644 --- a/ldclient/async_client.py +++ b/ldclient/async_client.py @@ -532,7 +532,7 @@ async def _evaluate_internal(self, key: str, context: Context, default: Any, eve for event in result.events or []: self._send_event(event) detail = result.detail - if detail.is_default_value(): + if detail.is_default_value: detail = EvaluationDetail(default, None, detail.reason) self._send_event(event_factory.new_eval_event(flag, context, detail, default)) return detail, flag diff --git a/ldclient/client.py b/ldclient/client.py index c8941e57..77534c4e 100644 --- a/ldclient/client.py +++ b/ldclient/client.py @@ -504,7 +504,7 @@ def _evaluate_internal(self, key: str, context: Context, default: Any, event_fac for event in result.events or []: self._send_event(event) detail = result.detail - if detail.is_default_value(): + if detail.is_default_value: detail = EvaluationDetail(default, None, detail.reason) self._send_event(event_factory.new_eval_event(flag, context, detail, default)) return detail, flag diff --git a/ldclient/evaluation.py b/ldclient/evaluation.py index 18aa9e29..8868af27 100644 --- a/ldclient/evaluation.py +++ b/ldclient/evaluation.py @@ -64,9 +64,10 @@ def reason(self) -> dict: """ return self.__reason + @property def is_default_value(self) -> bool: - """Returns True if the flag evaluated to the default value rather than one of its - variations. + """This property is True when the flag evaluation gives the default value and not one of + the flag variations. """ return self.__variation_index is None diff --git a/ldclient/testing/impl/datasystem/test_fdv2_persistence.py b/ldclient/testing/impl/datasystem/test_fdv2_persistence.py index d9f68bd5..8c3a6287 100644 --- a/ldclient/testing/impl/datasystem/test_fdv2_persistence.py +++ b/ldclient/testing/impl/datasystem/test_fdv2_persistence.py @@ -834,7 +834,7 @@ def test_variation_does_not_throw_when_persistent_store_errors_during_warm_start detail = client.variation_detail("flag-key", context, default="default-value") assert detail.value == "default-value" assert detail.reason == {"kind": "ERROR", "errorKind": "CLIENT_NOT_READY"} - assert detail.is_default_value() is True + assert detail.is_default_value assert client.all_flags_state(context).valid is False finally: diff --git a/ldclient/testing/test_ldclient_evaluation.py b/ldclient/testing/test_ldclient_evaluation.py index 8e6e0a3a..22284441 100644 --- a/ldclient/testing/test_ldclient_evaluation.py +++ b/ldclient/testing/test_ldclient_evaluation.py @@ -128,7 +128,7 @@ def test_variation_detail_for_flag_that_evaluates_to_none(): expected = EvaluationDetail('default', None, {'kind': 'OFF'}) actual = client.variation_detail('feature.key', user, default='default') assert expected == actual - assert actual.is_default_value() is True + assert actual.is_default_value def test_variation_when_feature_store_throws_error(caplog): @@ -145,7 +145,7 @@ def test_variation_detail_when_feature_store_throws_error(caplog): expected = EvaluationDetail('default', None, {'kind': 'ERROR', 'errorKind': 'EXCEPTION'}) actual = client.variation_detail('feature.key', Context.from_dict({"key": "user", "kind": "user"}), default='default') assert expected == actual - assert actual.is_default_value() is True + assert actual.is_default_value errlog = get_log_lines(caplog, 'ERROR') assert errlog == ['Unexpected error while retrieving feature flag "feature.key": NotImplementedError()'] From 7f5d936f427ca0730a5eb4146a9ec35f6f5ce7a0 Mon Sep 17 00:00:00 2001 From: Matthew Keeler Date: Tue, 3 Nov 2026 07:32:42 -0500 Subject: [PATCH 2/2] test: Assert is_default_value is True instead of truthy A bound method is truthy, so a bare truthiness assertion also passes if is_default_value is a method. Comparing with True confirms that it is a property that returns a bool. --- ldclient/testing/impl/datasystem/test_fdv2_persistence.py | 2 +- ldclient/testing/test_ldclient_evaluation.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ldclient/testing/impl/datasystem/test_fdv2_persistence.py b/ldclient/testing/impl/datasystem/test_fdv2_persistence.py index 8c3a6287..0831e9f7 100644 --- a/ldclient/testing/impl/datasystem/test_fdv2_persistence.py +++ b/ldclient/testing/impl/datasystem/test_fdv2_persistence.py @@ -834,7 +834,7 @@ def test_variation_does_not_throw_when_persistent_store_errors_during_warm_start detail = client.variation_detail("flag-key", context, default="default-value") assert detail.value == "default-value" assert detail.reason == {"kind": "ERROR", "errorKind": "CLIENT_NOT_READY"} - assert detail.is_default_value + assert detail.is_default_value is True assert client.all_flags_state(context).valid is False finally: diff --git a/ldclient/testing/test_ldclient_evaluation.py b/ldclient/testing/test_ldclient_evaluation.py index 22284441..b3cfc2d9 100644 --- a/ldclient/testing/test_ldclient_evaluation.py +++ b/ldclient/testing/test_ldclient_evaluation.py @@ -128,7 +128,7 @@ def test_variation_detail_for_flag_that_evaluates_to_none(): expected = EvaluationDetail('default', None, {'kind': 'OFF'}) actual = client.variation_detail('feature.key', user, default='default') assert expected == actual - assert actual.is_default_value + assert actual.is_default_value is True def test_variation_when_feature_store_throws_error(caplog): @@ -145,7 +145,7 @@ def test_variation_detail_when_feature_store_throws_error(caplog): expected = EvaluationDetail('default', None, {'kind': 'ERROR', 'errorKind': 'EXCEPTION'}) actual = client.variation_detail('feature.key', Context.from_dict({"key": "user", "kind": "user"}), default='default') assert expected == actual - assert actual.is_default_value + assert actual.is_default_value is True errlog = get_log_lines(caplog, 'ERROR') assert errlog == ['Unexpected error while retrieving feature flag "feature.key": NotImplementedError()']