commit python-hypothesmith for openSUSE:Factory
Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-hypothesmith for openSUSE:Factory checked in at 2022-10-21 16:19:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-hypothesmith (Old) and /work/SRC/openSUSE:Factory/.python-hypothesmith.new.2275 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-hypothesmith" Fri Oct 21 16:19:04 2022 rev:5 rq:1030202 version:0.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-hypothesmith/python-hypothesmith.changes 2021-04-01 14:15:51.739853099 +0200 +++ /work/SRC/openSUSE:Factory/.python-hypothesmith.new.2275/python-hypothesmith.changes 2022-10-21 16:19:05.926122430 +0200 @@ -1,0 +2,10 @@ +Thu Oct 20 13:24:58 UTC 2022 - Torsten Gruner <simmphonie@opensuse.org> + +- Update to v0.2.0 + * More efficient generation of Python identifiers + * Workaround for CPython parser bug in 3.9.8 (#16) Yes, yet another one - still, + that's why hypothesmith exists... +- Release v0.1.9 + * Fixed rare internal error when from_node() generated misplaced except: clauses + +------------------------------------------------------------------- Old: ---- hypothesmith-0.1.8.tar.gz New: ---- hypothesmith-0.2.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-hypothesmith.spec ++++++ --- /var/tmp/diff_new_pack.WlP540/_old 2022-10-21 16:19:06.590123674 +0200 +++ /var/tmp/diff_new_pack.WlP540/_new 2022-10-21 16:19:06.594123682 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-hypothesmith-test # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -27,7 +27,7 @@ %bcond_with test %endif Name: python-hypothesmith%{psuffix} -Version: 0.1.8 +Version: 0.2.0 Release: 0 Summary: Hypothesis strategies for generating Python programs, something like CSmith License: MPL-2.0 @@ -39,12 +39,12 @@ BuildRequires: python-rpm-macros Requires: python-base >= 3.6 Requires: python-hypothesis >= 5.46 -Requires: python-lark-parser >= 0.7.2 +Requires: python-lark >= 0.7.2 Requires: python-libcst >= 0.3.8 %if %{with test} BuildRequires: %{python_module black} BuildRequires: %{python_module hypothesis >= 5.46} -BuildRequires: %{python_module lark-parser >= 0.7.2} +BuildRequires: %{python_module lark >= 0.7.2} BuildRequires: %{python_module libcst >= 0.3.8} BuildRequires: %{python_module parso} BuildRequires: %{python_module pytest-xdist} ++++++ hypothesmith-0.1.8.tar.gz -> hypothesmith-0.2.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/CHANGELOG.md new/hypothesmith-0.2.0/CHANGELOG.md --- old/hypothesmith-0.1.8/CHANGELOG.md 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/CHANGELOG.md 2021-11-27 09:58:08.000000000 +0100 @@ -1,5 +1,13 @@ # Changelog +### 0.2.0 - 2021-11-27 +- More efficient generation of Python identifiers +- Workaround for [CPython parser bug in 3.9.8](https://bugs.python.org/issue45738) (#16) + Yes, *yet another* one - still, that's why `hypothesmith` exists... + +### 0.1.9 - 2021-08-19 +- Fixed rare internal error when `from_node()` generated misplaced `except:` clauses + ### 0.1.8 - 2021-01-10 - Now compatible with Hypothesis 5.46 and later - Increased diversity of examples generated by `from_node()` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/PKG-INFO new/hypothesmith-0.2.0/PKG-INFO --- old/hypothesmith-0.1.8/PKG-INFO 2021-01-10 13:36:42.288650000 +0100 +++ new/hypothesmith-0.2.0/PKG-INFO 2021-11-27 09:58:16.368064200 +0100 @@ -1,75 +1,12 @@ Metadata-Version: 2.1 Name: hypothesmith -Version: 0.1.8 +Version: 0.2.0 Summary: Hypothesis strategies for generating Python programs, something like CSmith Home-page: https://github.com/Zac-HD/hypothesmith Author: Zac Hatfield-Dodds Author-email: zac@hypothesis.works License: MPL 2.0 Project-URL: Funding, https://github.com/sponsors/Zac-HD -Description: # hypothesmith - Hypothesis strategies for generating Python programs, something like CSmith. - - 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. - - Get it today with [`pip install hypothesmith`](https://pypi.org/project/hypothesmith/), - or by cloning [the GitHub repo](https://github.com/Zac-HD/hypothesmith). - - You can run the tests, such as they are, with `tox` on Python 3.6 or later. - Use `tox -va` to see what environments are available. - - ## Usage - This package provides two Hypothesis strategies for generating Python source code. - - The generated code will always be syntatically valid, and is useful for testing - parsers, linters, auto-formatters, and other tools that operate on source code. - - > DO NOT EXECUTE CODE GENERATED BY THESE STRATEGIES. - > - > It could do literally anything that running Python code is able to do, - > including changing, deleting, or uploading important data. Arbitrary - > code can be useful, but "arbitrary code execution" can be very, very bad. - - #### `hypothesmith.from_grammar(start="file_input", *, auto_target=True)` - - Generates syntactically-valid Python source code based on the grammar. - - Valid values for ``start`` are ``"single_input"``, ``"file_input"``, or - ``"eval_input"``; respectively a single interactive statement, a module or - sequence of commands read from a file, and input for the eval() function. - - If ``auto_target`` is ``True``, this strategy uses ``hypothesis.target()`` - internally to drive towards larger and more complex examples. We recommend - leaving this enabled, as the grammar is quite complex and only simple examples - tend to be generated otherwise. - - #### `hypothesmith.from_node(node=libcst.Module, *, auto_target=True)` - - Generates syntactically-valid Python source code based on the node types - defined by the [`LibCST`](https://libcst.readthedocs.io/en/latest/) project. - - You can pass any subtype of `libcst.CSTNode`. Alternatively, you can use - Hypothesis' built-in `from_type(node_type).map(lambda n: libcst.Module([n]).code`, - after Hypothesmith has registered the required strategies. However, this does - not include automatic targeting and limitations of LibCST may lead to invalid - code being generated. - - ## Notable bugs found with Hypothesmith - - [BPO-40661, a segfault in the new parser](https://bugs.python.org/issue40661), - was given maximum priority and blocked the planned release of CPython 3.9 beta1. - - [BPO-38953](https://bugs.python.org/issue38953) `tokenize` -> `untokenize` roundtrip bugs. - - [BPO-42218](https://bugs.python.org/issue42218) mishandled error case in new PEG parser. - - [`lib2to3` errors on \r in comment](https://github.com/psf/black/issues/970) - - [Black fails on files ending in a backslash](https://github.com/psf/black/issues/1012) - - [At least three round-trip bugs in LibCST](https://github.com/Instagram/LibCST#acknowledgements) - (search commits for "hypothesis") - - [Invalid code generated by LibCST](https://github.com/Instagram/LibCST/issues/287) - - ### Changelog - - Patch notes [can be found in `CHANGELOG.md`](https://github.com/Zac-HD/hypothesmith/blob/master/CHANGELOG.md). - Keywords: python testing fuzzing property-based-testing Platform: UNKNOWN Classifier: Development Status :: 4 - Beta @@ -85,3 +22,69 @@ Classifier: Topic :: Software Development :: Testing Requires-Python: >=3.6 Description-Content-Type: text/markdown +License-File: LICENSE + +# hypothesmith +Hypothesis strategies for generating Python programs, something like CSmith. + +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. + +Get it today with [`pip install hypothesmith`](https://pypi.org/project/hypothesmith/), +or by cloning [the GitHub repo](https://github.com/Zac-HD/hypothesmith). + +You can run the tests, such as they are, with `tox` on Python 3.6 or later. +Use `tox -va` to see what environments are available. + +## Usage +This package provides two Hypothesis strategies for generating Python source code. + +The generated code will always be syntatically valid, and is useful for testing +parsers, linters, auto-formatters, and other tools that operate on source code. + +> DO NOT EXECUTE CODE GENERATED BY THESE STRATEGIES. +> +> It could do literally anything that running Python code is able to do, +> including changing, deleting, or uploading important data. Arbitrary +> code can be useful, but "arbitrary code execution" can be very, very bad. + +#### `hypothesmith.from_grammar(start="file_input", *, auto_target=True)` + +Generates syntactically-valid Python source code based on the grammar. + +Valid values for ``start`` are ``"single_input"``, ``"file_input"``, or +``"eval_input"``; respectively a single interactive statement, a module or +sequence of commands read from a file, and input for the eval() function. + +If ``auto_target`` is ``True``, this strategy uses ``hypothesis.target()`` +internally to drive towards larger and more complex examples. We recommend +leaving this enabled, as the grammar is quite complex and only simple examples +tend to be generated otherwise. + +#### `hypothesmith.from_node(node=libcst.Module, *, auto_target=True)` + +Generates syntactically-valid Python source code based on the node types +defined by the [`LibCST`](https://libcst.readthedocs.io/en/latest/) project. + +You can pass any subtype of `libcst.CSTNode`. Alternatively, you can use +Hypothesis' built-in `from_type(node_type).map(lambda n: libcst.Module([n]).code`, +after Hypothesmith has registered the required strategies. However, this does +not include automatic targeting and limitations of LibCST may lead to invalid +code being generated. + +## Notable bugs found with Hypothesmith +- [BPO-40661, a segfault in the new parser](https://bugs.python.org/issue40661), + was given maximum priority and blocked the planned release of CPython 3.9 beta1. +- [BPO-38953](https://bugs.python.org/issue38953) `tokenize` -> `untokenize` roundtrip bugs. +- [BPO-42218](https://bugs.python.org/issue42218) mishandled error case in new PEG parser. +- [`lib2to3` errors on \r in comment](https://github.com/psf/black/issues/970) +- [Black fails on files ending in a backslash](https://github.com/psf/black/issues/1012) +- [At least three round-trip bugs in LibCST](https://github.com/Instagram/LibCST#acknowledgements) + ([search commits for "hypothesis"](https://github.com/Instagram/LibCST/search?q=Fix+hypothesis&type=commits)) +- [Invalid code generated by LibCST](https://github.com/Instagram/LibCST/issues/287) + +### Changelog + +Patch notes [can be found in `CHANGELOG.md`](https://github.com/Zac-HD/hypothesmith/blob/master/CHANGELOG.md). + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/README.md new/hypothesmith-0.2.0/README.md --- old/hypothesmith-0.1.8/README.md 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/README.md 2021-11-27 09:58:08.000000000 +0100 @@ -54,7 +54,7 @@ - [`lib2to3` errors on \r in comment](https://github.com/psf/black/issues/970) - [Black fails on files ending in a backslash](https://github.com/psf/black/issues/1012) - [At least three round-trip bugs in LibCST](https://github.com/Instagram/LibCST#acknowledgements) - (search commits for "hypothesis") + ([search commits for "hypothesis"](https://github.com/Instagram/LibCST/search?q=Fix+hypothesis&type=commits)) - [Invalid code generated by LibCST](https://github.com/Instagram/LibCST/issues/287) ### Changelog diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/deps/check.txt new/hypothesmith-0.2.0/deps/check.txt --- old/hypothesmith-0.1.8/deps/check.txt 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/deps/check.txt 2021-11-27 09:58:08.000000000 +0100 @@ -1,37 +1,24 @@ # -# This file is autogenerated by pip-compile +# This file is autogenerated by pip-compile with python 3.7 # To update, run: # # pip-compile --output-file=deps/check.txt deps/check.in # -appdirs==1.4.4 - # via black -attrs==20.3.0 +attrs==21.2.0 # via flake8-bugbear autoflake==1.4 # via shed -bandit==1.7.0 +bandit==1.7.1 # via flake8-bandit -black==20.8b1 +black==21.11b1 # via shed -click==7.1.2 - # via - # black - # pybetter - # pyemojify +click==8.0.3 + # via black colorama==0.4.4 - # via bandit -flake8-bandit==2.1.2 - # via -r deps/check.in -flake8-bugbear==20.11.1 - # via -r deps/check.in -flake8-comprehensions==3.3.1 - # via -r deps/check.in -flake8-docstrings==1.5.0 - # via -r deps/check.in -flake8-polyfill==1.0.2 - # via flake8-bandit -flake8==3.8.4 + # via + # bandit + # click +flake8==4.0.1 # via # -r deps/check.in # flake8-bandit @@ -39,82 +26,90 @@ # flake8-comprehensions # flake8-docstrings # flake8-polyfill -gitdb==4.0.5 +flake8-bandit==2.1.2 + # via -r deps/check.in +flake8-bugbear==21.9.2 + # via -r deps/check.in +flake8-comprehensions==3.7.0 + # via -r deps/check.in +flake8-docstrings==1.6.0 + # via -r deps/check.in +flake8-polyfill==1.0.2 + # via flake8-bandit +gitdb==4.0.9 # via gitpython -gitpython==3.1.12 +gitpython==3.1.24 # via bandit -importlib-metadata==3.3.0 +importlib-metadata==4.2.0 # via + # click # flake8 # flake8-comprehensions # stevedore -isort==5.7.0 +isort==5.10.1 + # via shed +libcst==0.3.23 # via shed -libcst==0.3.16 - # via pybetter mccabe==0.6.1 # via flake8 +mypy==0.910 + # via -r deps/check.in mypy-extensions==0.4.3 # via # black # mypy # typing-inspect -mypy==0.790 - # via -r deps/check.in -pathspec==0.8.1 +pathspec==0.9.0 # via black -pbr==5.5.1 +pbr==5.8.0 # via stevedore -pybetter==0.3.5 - # via shed -pycodestyle==2.6.0 +platformdirs==2.4.0 + # via black +pycodestyle==2.8.0 # via # flake8 # flake8-bandit -pydocstyle==5.1.1 +pydocstyle==6.1.1 # via flake8-docstrings -pyemojify==0.2.0 - # via pybetter -pyflakes==2.2.0 +pyflakes==2.4.0 # via # autoflake # flake8 -pygments==2.7.3 - # via pybetter -pyupgrade==2.7.4 +pyupgrade==2.29.1 # via shed -pyyaml==5.3.1 +pyyaml==6.0 # via # bandit # libcst -regex==2020.11.13 +regex==2021.11.10 # via black -shed==0.2.5 +shed==0.5.3 # via -r deps/check.in -six==1.15.0 - # via bandit -smmap==3.0.4 +smmap==5.0.0 # via gitdb -snowballstemmer==2.0.0 +snowballstemmer==2.2.0 # via pydocstyle -stevedore==3.3.0 +stevedore==3.5.0 # via bandit -tokenize-rt==4.0.0 +tokenize-rt==4.2.1 # via pyupgrade toml==0.10.2 + # via mypy +tomli==1.2.2 # via black -typed-ast==1.4.2 +typed-ast==1.4.3 # via # black # mypy -typing-extensions==3.7.4.3 +typing-extensions==4.0.0 # via # black + # gitpython # importlib-metadata # libcst # mypy # typing-inspect -typing-inspect==0.6.0 +typing-inspect==0.7.1 # via libcst -zipp==3.4.0 +zipp==3.6.0 # via importlib-metadata diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/deps/test.txt new/hypothesmith-0.2.0/deps/test.txt --- old/hypothesmith-0.1.8/deps/test.txt 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/deps/test.txt 2021-11-27 09:58:08.000000000 +0100 @@ -1,90 +1,93 @@ # -# This file is autogenerated by pip-compile +# This file is autogenerated by pip-compile with python 3.7 # To update, run: # # pip-compile --output-file=deps/test.txt deps/test.in setup.py # -apipkg==1.5 - # via execnet -appdirs==1.4.4 - # via black atomicwrites==1.4.0 # via pytest -attrs==20.3.0 +attrs==21.2.0 # via # hypothesis # pytest -black==20.8b1 +black==21.11b1 # via -r deps/test.in -click==7.1.2 +click==8.0.3 # via black colorama==0.4.4 - # via pytest -coverage==5.3.1 + # via + # click + # pytest +coverage[toml]==6.2 # via pytest-cov -execnet==1.7.1 +execnet==1.9.0 # via pytest-xdist -hypothesis==6.0.0 +hypothesis==6.27.2 # via hypothesmith (setup.py) -importlib-metadata==3.3.0 +importlib-metadata==4.8.2 # via + # click # pluggy # pytest iniconfig==1.1.1 # via pytest -lark-parser==0.11.1 +lark-parser==0.12.0 # via hypothesmith (setup.py) -libcst==0.3.16 +libcst==0.3.23 # via hypothesmith (setup.py) mypy-extensions==0.4.3 # via # black # typing-inspect -packaging==20.8 +packaging==21.3 # via pytest -parso==0.8.1 +parso==0.8.2 # via -r deps/test.in -pathspec==0.8.1 +pathspec==0.9.0 # via black -pluggy==0.13.1 +platformdirs==2.4.0 + # via black +pluggy==1.0.0 # via pytest -py==1.10.0 +py==1.11.0 # via # pytest # pytest-forked -pyparsing==2.4.7 +pyparsing==3.0.6 # via packaging -pytest-cov==2.10.1 - # via -r deps/test.in -pytest-forked==1.3.0 - # via pytest-xdist -pytest-xdist==2.2.0 - # via -r deps/test.in -pytest==6.2.1 +pytest==6.2.5 # via # -r deps/test.in # pytest-cov # pytest-forked # pytest-xdist -pyyaml==5.3.1 +pytest-cov==3.0.0 + # via -r deps/test.in +pytest-forked==1.3.0 + # via pytest-xdist +pytest-xdist==2.4.0 + # via -r deps/test.in +pyyaml==6.0 # via libcst -regex==2020.11.13 +regex==2021.11.10 # via black -sortedcontainers==2.3.0 +sortedcontainers==2.4.0 # via hypothesis toml==0.10.2 + # via pytest +tomli==1.2.2 # via # black - # pytest -typed-ast==1.4.2 + # coverage +typed-ast==1.5.0 # via black -typing-extensions==3.7.4.3 +typing-extensions==4.0.0 # via # black # importlib-metadata # libcst # typing-inspect -typing-inspect==0.6.0 +typing-inspect==0.7.1 # via libcst -zipp==3.4.0 +zipp==3.6.0 # via importlib-metadata diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/src/hypothesmith/__init__.py new/hypothesmith-0.2.0/src/hypothesmith/__init__.py --- old/hypothesmith-0.1.8/src/hypothesmith/__init__.py 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/src/hypothesmith/__init__.py 2021-11-27 09:58:08.000000000 +0100 @@ -3,5 +3,5 @@ from hypothesmith.cst import from_node from hypothesmith.syntactic import from_grammar -__version__ = "0.1.8" +__version__ = "0.2.0" __all__ = ["from_grammar", "from_node"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/src/hypothesmith/cst.py new/hypothesmith-0.2.0/src/hypothesmith/cst.py --- old/hypothesmith-0.1.8/src/hypothesmith/cst.py 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/src/hypothesmith/cst.py 2021-11-27 09:58:08.000000000 +0100 @@ -76,9 +76,12 @@ [libcst.AsName, st.from_type(libcst.Name)], [libcst.AnnAssign, infer, infer, infer], [libcst.Assign, nonempty_seq(libcst.AssignTarget)], + [libcst.Await, infer, st.just(()), st.just(()), nonempty_whitespace], + [libcst.Attribute, infer, infer, infer], [libcst.Comparison, infer, nonempty_seq(libcst.ComparisonTarget)], [libcst.Decorator, st.from_type(libcst.Name) | st.from_type(libcst.Attribute)], [libcst.EmptyLine, infer, infer, infer], + [libcst.ExceptHandler, infer, infer, infer, infer, nonempty_whitespace, infer], [libcst.Global, nonempty_seq(libcst.NameItem)], [libcst.Import, nonempty_seq(libcst.ImportAlias)], [ @@ -132,6 +135,7 @@ # If a Try node has no `except` clause, it *must* have a `finally` clause and # *must not* have an `else` clause. With one or more except clauses, it may # have an else and/or a finally, or neither. +# The .map() ensures that any bare-`except:` clauses are ordered last. st.register_type_strategy( libcst.Try, st.builds(libcst.Try, finalbody=st.from_type(libcst.Finally)) @@ -142,7 +146,7 @@ st.deferred(lambda: st.from_type(libcst.ExceptHandler)), min_size=1, unique_by=lambda caught: caught.type, - ), + ).map(lambda xs: sorted(xs, key=lambda x: x.type is None)), orelse=infer, finalbody=infer, ), @@ -210,6 +214,10 @@ st.register_type_strategy(libcst.BooleanOperation, boolean_op_with_whitespace()) +st.register_type_strategy( + libcst.ComparisonTarget, builds_filtering(libcst.ComparisonTarget) +) + # TODO: this works pretty well, but it's also a pretty poor trick for performance. # Instead of filtering, we should continue expanding the specific node diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/src/hypothesmith/syntactic.py new/hypothesmith-0.2.0/src/hypothesmith/syntactic.py --- old/hypothesmith-0.1.8/src/hypothesmith/syntactic.py 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/src/hypothesmith/syntactic.py 2021-11-27 09:58:08.000000000 +0100 @@ -2,7 +2,6 @@ import ast import dis -import re import sys import urllib.request from functools import lru_cache @@ -10,6 +9,7 @@ from hypothesis import assume, strategies as st from hypothesis.extra.lark import LarkStrategy +from hypothesis.internal.charmap import _union_intervals from lark import Lark from lark.indenter import Indenter @@ -35,19 +35,25 @@ } +def _chars_to_regex_set(s: list) -> str: + spans = tuple((ord(c), ord(c)) for c in s) + return "".join( + chr(a) if a == b else f"{chr(a)}-{chr(b)}" + for a, b in _union_intervals(spans, spans) + ) + + @lru_cache() def identifiers() -> st.SearchStrategy[str]: - _lead = [] - _subs = [] + lead = [] + subs = [] for c in map(chr, range(sys.maxunicode + 1)): - if not utf8_encodable(c): - continue - if c.isidentifier(): - _lead.append(c) # e.g. "a" - if ("_" + c).isidentifier(): - _subs.append(c) # e.g. "1" - pattern = "[{}][{}]*".format(re.escape("".join(_lead)), re.escape("".join(_subs))) - return st.from_regex(pattern, fullmatch=True).filter(str.isidentifier) + if utf8_encodable(c) and ("_" + c).isidentifier(): + subs.append(c) # e.g. "1" + if c.isidentifier(): + lead.append(c) # e.g. "a" + pattern = f"[{_chars_to_regex_set(lead)}][{_chars_to_regex_set(subs)}]*" + return st.from_regex(pattern, fullmatch=True) class PythonIndenter(Indenter): @@ -121,9 +127,15 @@ # of bizzare errors in CPython, especially with the new PEG parser, # and so we maintain this extra clause to ensure that we get a decent # error message out of it. - if isinstance(err, SystemError) and sys.version_info[:3] == (3, 9, 0): + if isinstance(err, SystemError) and ( + sys.version_info[:3] == (3, 9, 0) + or sys.version_info[:3] >= (3, 9, 8) + and str(err) == "Negative size passed to PyUnicode_New" + ): # We've triggered https://bugs.python.org/issue42218 - it's been # fixed upstream, so we'll treat it as if it were a SyntaxError. + # Or the new https://bugs.python.org/issue45738 which makes me + # wish CPython would start running proptests in CI already. assume(False) source_code = ascii("".join(draw_state.result[count:])) raise type(err)( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/src/hypothesmith.egg-info/PKG-INFO new/hypothesmith-0.2.0/src/hypothesmith.egg-info/PKG-INFO --- old/hypothesmith-0.1.8/src/hypothesmith.egg-info/PKG-INFO 2021-01-10 13:36:41.000000000 +0100 +++ new/hypothesmith-0.2.0/src/hypothesmith.egg-info/PKG-INFO 2021-11-27 09:58:16.000000000 +0100 @@ -1,75 +1,12 @@ Metadata-Version: 2.1 Name: hypothesmith -Version: 0.1.8 +Version: 0.2.0 Summary: Hypothesis strategies for generating Python programs, something like CSmith Home-page: https://github.com/Zac-HD/hypothesmith Author: Zac Hatfield-Dodds Author-email: zac@hypothesis.works License: MPL 2.0 Project-URL: Funding, https://github.com/sponsors/Zac-HD -Description: # hypothesmith - Hypothesis strategies for generating Python programs, something like CSmith. - - 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. - - Get it today with [`pip install hypothesmith`](https://pypi.org/project/hypothesmith/), - or by cloning [the GitHub repo](https://github.com/Zac-HD/hypothesmith). - - You can run the tests, such as they are, with `tox` on Python 3.6 or later. - Use `tox -va` to see what environments are available. - - ## Usage - This package provides two Hypothesis strategies for generating Python source code. - - The generated code will always be syntatically valid, and is useful for testing - parsers, linters, auto-formatters, and other tools that operate on source code. - - > DO NOT EXECUTE CODE GENERATED BY THESE STRATEGIES. - > - > It could do literally anything that running Python code is able to do, - > including changing, deleting, or uploading important data. Arbitrary - > code can be useful, but "arbitrary code execution" can be very, very bad. - - #### `hypothesmith.from_grammar(start="file_input", *, auto_target=True)` - - Generates syntactically-valid Python source code based on the grammar. - - Valid values for ``start`` are ``"single_input"``, ``"file_input"``, or - ``"eval_input"``; respectively a single interactive statement, a module or - sequence of commands read from a file, and input for the eval() function. - - If ``auto_target`` is ``True``, this strategy uses ``hypothesis.target()`` - internally to drive towards larger and more complex examples. We recommend - leaving this enabled, as the grammar is quite complex and only simple examples - tend to be generated otherwise. - - #### `hypothesmith.from_node(node=libcst.Module, *, auto_target=True)` - - Generates syntactically-valid Python source code based on the node types - defined by the [`LibCST`](https://libcst.readthedocs.io/en/latest/) project. - - You can pass any subtype of `libcst.CSTNode`. Alternatively, you can use - Hypothesis' built-in `from_type(node_type).map(lambda n: libcst.Module([n]).code`, - after Hypothesmith has registered the required strategies. However, this does - not include automatic targeting and limitations of LibCST may lead to invalid - code being generated. - - ## Notable bugs found with Hypothesmith - - [BPO-40661, a segfault in the new parser](https://bugs.python.org/issue40661), - was given maximum priority and blocked the planned release of CPython 3.9 beta1. - - [BPO-38953](https://bugs.python.org/issue38953) `tokenize` -> `untokenize` roundtrip bugs. - - [BPO-42218](https://bugs.python.org/issue42218) mishandled error case in new PEG parser. - - [`lib2to3` errors on \r in comment](https://github.com/psf/black/issues/970) - - [Black fails on files ending in a backslash](https://github.com/psf/black/issues/1012) - - [At least three round-trip bugs in LibCST](https://github.com/Instagram/LibCST#acknowledgements) - (search commits for "hypothesis") - - [Invalid code generated by LibCST](https://github.com/Instagram/LibCST/issues/287) - - ### Changelog - - Patch notes [can be found in `CHANGELOG.md`](https://github.com/Zac-HD/hypothesmith/blob/master/CHANGELOG.md). - Keywords: python testing fuzzing property-based-testing Platform: UNKNOWN Classifier: Development Status :: 4 - Beta @@ -85,3 +22,69 @@ Classifier: Topic :: Software Development :: Testing Requires-Python: >=3.6 Description-Content-Type: text/markdown +License-File: LICENSE + +# hypothesmith +Hypothesis strategies for generating Python programs, something like CSmith. + +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. + +Get it today with [`pip install hypothesmith`](https://pypi.org/project/hypothesmith/), +or by cloning [the GitHub repo](https://github.com/Zac-HD/hypothesmith). + +You can run the tests, such as they are, with `tox` on Python 3.6 or later. +Use `tox -va` to see what environments are available. + +## Usage +This package provides two Hypothesis strategies for generating Python source code. + +The generated code will always be syntatically valid, and is useful for testing +parsers, linters, auto-formatters, and other tools that operate on source code. + +> DO NOT EXECUTE CODE GENERATED BY THESE STRATEGIES. +> +> It could do literally anything that running Python code is able to do, +> including changing, deleting, or uploading important data. Arbitrary +> code can be useful, but "arbitrary code execution" can be very, very bad. + +#### `hypothesmith.from_grammar(start="file_input", *, auto_target=True)` + +Generates syntactically-valid Python source code based on the grammar. + +Valid values for ``start`` are ``"single_input"``, ``"file_input"``, or +``"eval_input"``; respectively a single interactive statement, a module or +sequence of commands read from a file, and input for the eval() function. + +If ``auto_target`` is ``True``, this strategy uses ``hypothesis.target()`` +internally to drive towards larger and more complex examples. We recommend +leaving this enabled, as the grammar is quite complex and only simple examples +tend to be generated otherwise. + +#### `hypothesmith.from_node(node=libcst.Module, *, auto_target=True)` + +Generates syntactically-valid Python source code based on the node types +defined by the [`LibCST`](https://libcst.readthedocs.io/en/latest/) project. + +You can pass any subtype of `libcst.CSTNode`. Alternatively, you can use +Hypothesis' built-in `from_type(node_type).map(lambda n: libcst.Module([n]).code`, +after Hypothesmith has registered the required strategies. However, this does +not include automatic targeting and limitations of LibCST may lead to invalid +code being generated. + +## Notable bugs found with Hypothesmith +- [BPO-40661, a segfault in the new parser](https://bugs.python.org/issue40661), + was given maximum priority and blocked the planned release of CPython 3.9 beta1. +- [BPO-38953](https://bugs.python.org/issue38953) `tokenize` -> `untokenize` roundtrip bugs. +- [BPO-42218](https://bugs.python.org/issue42218) mishandled error case in new PEG parser. +- [`lib2to3` errors on \r in comment](https://github.com/psf/black/issues/970) +- [Black fails on files ending in a backslash](https://github.com/psf/black/issues/1012) +- [At least three round-trip bugs in LibCST](https://github.com/Instagram/LibCST#acknowledgements) + ([search commits for "hypothesis"](https://github.com/Instagram/LibCST/search?q=Fix+hypothesis&type=commits)) +- [Invalid code generated by LibCST](https://github.com/Instagram/LibCST/issues/287) + +### Changelog + +Patch notes [can be found in `CHANGELOG.md`](https://github.com/Zac-HD/hypothesmith/blob/master/CHANGELOG.md). + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/src/hypothesmith.egg-info/SOURCES.txt new/hypothesmith-0.2.0/src/hypothesmith.egg-info/SOURCES.txt --- old/hypothesmith-0.1.8/src/hypothesmith.egg-info/SOURCES.txt 2021-01-10 13:36:42.000000000 +0100 +++ new/hypothesmith-0.2.0/src/hypothesmith.egg-info/SOURCES.txt 2021-11-27 09:58:16.000000000 +0100 @@ -20,6 +20,7 @@ src/hypothesmith.egg-info/not-zip-safe src/hypothesmith.egg-info/requires.txt src/hypothesmith.egg-info/top_level.txt +tests/__init__.py tests/conftest.py tests/test_cst.py tests/test_syntactic.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/tests/test_syntactic.py new/hypothesmith-0.2.0/tests/test_syntactic.py --- old/hypothesmith-0.1.8/tests/test_syntactic.py 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/tests/test_syntactic.py 2021-11-27 09:58:08.000000000 +0100 @@ -103,6 +103,6 @@ @given(source_code=hypothesmith.from_grammar()) -def test_parso_from_node(source_code): +def test_parso_from_grammar(source_code): result = parso.parse(source_code).get_code() assert source_code == result diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hypothesmith-0.1.8/tox.ini new/hypothesmith-0.2.0/tox.ini --- old/hypothesmith-0.1.8/tox.ini 2021-01-10 13:36:24.000000000 +0100 +++ new/hypothesmith-0.2.0/tox.ini 2021-11-27 09:58:08.000000000 +0100 @@ -12,7 +12,7 @@ commands = shed flake8 - mypy --config-file=tox.ini . src/ + mypy --config-file=tox.ini . [testenv:test] description = Runs pytest with posargs - `tox -e test -- -v` == `pytest -v` @@ -49,17 +49,8 @@ ignore = D1,E501,W503,S101,S310 exclude = .*,__pycache__ -[isort] -known_first_party = hypothesmith -default_section = THIRDPARTY -multi_line_output = 3 -include_trailing_comma = True -force_grid_wrap = 0 -combine_as_imports = True -line_length = 88 - [mypy] -python_version = 3.6 +python_version = 3.8 platform = linux disallow_untyped_calls = True disallow_untyped_defs = True @@ -71,5 +62,5 @@ warn_unused_ignores = True warn_unused_configs = True warn_redundant_casts = True -[mypy-test_hypothesmith] +[mypy-tests.*] ignore_errors = True
participants (1)
-
Source-Sync