I have been experimenting with this library for a bit for purposes of testing refactoring tools. I can generate lots of extremely weird identifiers for all kinds of things, but the structure of everything generated seems fairly simple - too simple.
For example, I am trying to generate function signatures. I imagine many possibilities with the arguments - they can have annotations, positional-only-args, the **kwargs-keyword, default-arguments, etc etc.
Here is my code to generate function-definitions that have at least something in their argument brackets (execute with pytests -s flag to show the prints):
```
import hypothesmith
from hypothesis import given, settings, HealthCheck, assume
import libcst
import re
s = hypothesmith.from_node(node=libcst.FunctionDef, auto_target=True)
@given(code = s)
@settings(suppress_health_check=[HealthCheck.filter_too_much, HealthCheck.too_slow], max_examples=5000)
def test(code):
assume(re.search(r"\([^)(]+\)\s*:", code) is not None) # should match 'def foo(x):pass' but not 'def foo():pass'
print("------")
print(code)
print("------")
```
This calculates for a long time but finds absolutely nothing. What am I doing wrong? Or did I misunderstand the purpose of this library?
Hi Julian! This is definitely something that I'd _like_ to work, but as the readme says
> This is definitely pre-alpha, but if you want to play with it feel free! You can even keep the shiny pieces when - not if - it breaks.
so I think the answer is just that we're currently defaulting to a pretty poor/narrow automatically-inferred strategy for `FunctionDef` nodes. The obvious solution is just to add a hand-written strategy to https://github.com/Zac-HD/hypothesmith/blob/master/src/hypothesmith/cst.py - want to open a PR?
*Unfortunately `hypothesmith` is currently a tier-three oss project for me - priority is something like {work, phd}, {hypothesis}, {hypofuzz, shed, pytest, flake8-trio}, {hypothesmith, hypothesis-jsonschema, ......}, so I'm unlikely to write it myself any time soon; very happy to review and help with PRs though!*
Thank you for the quick response and the pointer on how to go about implementing it.
I'll put it in my own personal backlog, though I don't suppose that PR is happening this week.
I only recently became aware of this nice project that combines hypothesis and libcst, but only syntactically.
I have made some code (together with copilot)
to generate semantically correct list of parameters for Python using Python's AST.
For example, when present the type of the type hint and of the default value are identical.
I found it very challenging to scale up to even larger Python structures, like function definitions.
Do I correctly assume this project is open for external contributions?
If so, I will discuss with my team whether participating in this project is worthwhile.
yes, we're open to external contributions, although note the readme:
> This is definitely pre-alpha, but if you want to play with it feel free! You can even keep the shiny pieces when - not if - it breaks.
You might find that building something independent / inspired-by is more productive for your team at the moment.