-
-
Notifications
You must be signed in to change notification settings - Fork 278
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Teach astroid about Hypothesis (#820)
- Loading branch information
Showing
2 changed files
with
55 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html | ||
# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER | ||
""" | ||
Astroid hook for the Hypothesis library. | ||
Without this hook pylint reports no-value-for-parameter for use of strategies | ||
defined using the `@hypothesis.strategies.composite` decorator. For example: | ||
from hypothesis import strategies as st | ||
@st.composite | ||
def a_strategy(draw): | ||
return draw(st.integers()) | ||
a_strategy() | ||
""" | ||
|
||
import astroid | ||
|
||
COMPOSITE_NAMES = ( | ||
"composite", | ||
"st.composite", | ||
"strategies.composite", | ||
"hypothesis.strategies.composite", | ||
) | ||
|
||
|
||
def is_decorated_with_st_composite(node): | ||
"""Return True if a decorated node has @st.composite applied.""" | ||
if node.decorators and node.args.args and node.args.args[0].name == "draw": | ||
for decorator_attribute in node.decorators.nodes: | ||
if decorator_attribute.as_string() in COMPOSITE_NAMES: | ||
return True | ||
return False | ||
|
||
|
||
def remove_draw_parameter_from_composite_strategy(node): | ||
"""Given that the FunctionDef is decorated with @st.composite, remove the | ||
first argument (`draw`) - it's always supplied by Hypothesis so we don't | ||
need to emit the no-value-for-parameter lint. | ||
""" | ||
del node.args.args[0] | ||
del node.args.annotations[0] | ||
del node.args.type_comment_args[0] | ||
return node | ||
|
||
|
||
astroid.MANAGER.register_transform( | ||
node_class=astroid.FunctionDef, | ||
transform=remove_draw_parameter_from_composite_strategy, | ||
predicate=is_decorated_with_st_composite, | ||
) |