diff options
Diffstat (limited to 'abdl')
-rw-r--r-- | abdl/feature.py | 40 | ||||
-rw-r--r-- | abdl/predicates.py | 5 |
2 files changed, 45 insertions, 0 deletions
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 <https://www.gnu.org/licenses/>. + +"""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) |