From b4971f08758a4428fe90d0a56f58257cdbd728eb Mon Sep 17 00:00:00 2001 From: SoniEx2 Date: Mon, 24 Feb 2020 15:47:30 -0300 Subject: Warn/error when using Predicate types as predicate This only applies to Predicate types. Predicate instances still function as expected, as do non-Predicate types. --- abdl/feature.py | 40 ++++++++++++++++++++++++++++++++++++++++ abdl/predicates.py | 5 +++++ 2 files changed, 45 insertions(+) create mode 100644 abdl/feature.py (limited to 'abdl') diff --git a/abdl/feature.py b/abdl/feature.py new file mode 100644 index 0000000..9821bd2 --- /dev/null +++ b/abdl/feature.py @@ -0,0 +1,40 @@ +# This file is part of A Boneless Datastructure Language +# Copyright (C) 2020 Soni L. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +"""Feature Deprecation Control. + +When features get deprecated, they show up here. + +Libraries must never use this module directly. Instead, it should be up to +applications and test suites to use this module. +""" + +class PredicateTypePredicate(DeprecationWarning): + """Indicates that a Predicate type is being used as a predicate. + + This usually indicates a bug. + + The following triggers this warning: + + >>> import abdl + >>> abdl.match("->x:$x", "x", {"x": abdl.predicates.Predicate}) + + The following doesn't: + + >>> import abdl + >>> predicate = abdl.predicates.IsInstance(abdl.predicates.Predicate) + >>> abdl.match("->x:$x", "x", {"x": predicate}) + """ diff --git a/abdl/predicates.py b/abdl/predicates.py index 4df9cdf..57fb976 100644 --- a/abdl/predicates.py +++ b/abdl/predicates.py @@ -21,6 +21,9 @@ See ``abdl.predicates.Predicate`` and the language reference for details. # pylint: disable=too-few-public-methods +import warnings +import abdl.feature + class Predicate: """A predicate checks if an object is accepted in an ABDL expression. """ @@ -89,6 +92,8 @@ def _to_predicate(obj): return obj if isinstance(obj, tuple): return Union(obj) + if isinstance(obj, type) and issubclass(obj, Predicate): + warnings.warn("deprecated", abdl.feature.PredicateTypePredicate) # I don't know if anyone relies on the old behaviour of passing the thing directly to isinstance # but this lets the exceptions be raised almost exactly like before return IsInstance(obj) -- cgit 1.4.1