diff options
author | SoniEx2 <endermoneymod@gmail.com> | 2020-02-24 15:47:30 -0300 |
---|---|---|
committer | SoniEx2 <endermoneymod@gmail.com> | 2020-02-25 22:47:35 -0300 |
commit | b4971f08758a4428fe90d0a56f58257cdbd728eb (patch) | |
tree | a6200fd659c806424b53bc2ec0575622f62ac3b5 | |
parent | 6f4df5d08e147f74f91bf7ce2f882dca1390c721 (diff) |
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.
-rw-r--r-- | abdl/feature.py | 40 | ||||
-rw-r--r-- | abdl/predicates.py | 5 | ||||
-rw-r--r-- | setup.py | 2 |
3 files changed, 46 insertions, 1 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) diff --git a/setup.py b/setup.py index 4e8277e..350ba95 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,3 @@ import setuptools -setuptools.setup(name="gan0f74bd87a23b515b45da7e6f5d9cc82380443dab", version="2.1.2", packages=["abdl"], install_requires=["pyparsing >= 2.4.2"]) +setuptools.setup(name="gan0f74bd87a23b515b45da7e6f5d9cc82380443dab", version="2.1.3", packages=["abdl"], install_requires=["pyparsing >= 2.4.2"]) |