Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-parso for openSUSE:Factory checked in at 2024-07-30 11:53:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-parso (Old) and /work/SRC/openSUSE:Factory/.python-parso.new.1882 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-parso" Tue Jul 30 11:53:46 2024 rev:21 rq:1190186 version:0.8.4 Changes: -------- --- /work/SRC/openSUSE:Factory/python-parso/python-parso.changes 2023-10-04 22:30:42.734038078 +0200 +++ /work/SRC/openSUSE:Factory/.python-parso.new.1882/python-parso.changes 2024-07-30 11:53:58.468337179 +0200 @@ -1,0 +2,8 @@ +Mon Jul 22 11:38:30 UTC 2024 - John Paul Adrian Glaubitz <adrian.glaubitz@suse.com> + +- Update to 0.8.4 + * Add basic support for Python 3.13 +- Drop patches for issues fixed upstream + * cf5969d7a109798adbf9538d70e92138f077d700.patch + +------------------------------------------------------------------- Old: ---- cf5969d7a109798adbf9538d70e92138f077d700.patch parso-0.8.3.tar.gz New: ---- parso-0.8.4.tar.gz BETA DEBUG BEGIN: Old:- Drop patches for issues fixed upstream * cf5969d7a109798adbf9538d70e92138f077d700.patch BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-parso.spec ++++++ --- /var/tmp/diff_new_pack.tyLoFC/_old 2024-07-30 11:53:59.024359612 +0200 +++ /var/tmp/diff_new_pack.tyLoFC/_new 2024-07-30 11:53:59.024359612 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-parso # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,13 +18,12 @@ %{?sle15_python_module_pythons} Name: python-parso -Version: 0.8.3 +Version: 0.8.4 Release: 0 Summary: An autocompletion tool for Python License: MIT AND Python-2.0 URL: https://github.com/davidhalter/parso Source0: https://files.pythonhosted.org/packages/source/p/parso/parso-%{version}.tar.gz -Patch1: https://github.com/davidhalter/parso/commit/cf5969d7a109798adbf9538d70e92138... BuildRequires: %{python_module pip} BuildRequires: %{python_module pytest >= 3.0.7} BuildRequires: %{python_module setuptools} ++++++ parso-0.8.3.tar.gz -> parso-0.8.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/CHANGELOG.rst new/parso-0.8.4/CHANGELOG.rst --- old/parso-0.8.3/CHANGELOG.rst 2021-11-30 22:04:12.000000000 +0100 +++ new/parso-0.8.4/CHANGELOG.rst 2024-04-05 10:44:00.000000000 +0200 @@ -6,6 +6,11 @@ Unreleased ++++++++++ +0.8.4 (2024-04-05) +++++++++++++++++++ + +- Add basic support for Python 3.13 + 0.8.3 (2021-11-30) ++++++++++++++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/PKG-INFO new/parso-0.8.4/PKG-INFO --- old/parso-0.8.3/PKG-INFO 2021-11-30 22:05:45.521858000 +0100 +++ new/parso-0.8.4/PKG-INFO 2024-04-05 10:44:26.357275500 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: parso -Version: 0.8.3 +Version: 0.8.4 Summary: A Python Parser Home-page: https://github.com/davidhalter/parso Author: David Halter @@ -113,6 +113,11 @@ Unreleased ++++++++++ + 0.8.4 (2024-04-05) + ++++++++++++++++++ + + - Add basic support for Python 3.13 + 0.8.3 (2021-11-30) ++++++++++++++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso/__init__.py new/parso-0.8.4/parso/__init__.py --- old/parso-0.8.3/parso/__init__.py 2021-11-30 22:04:12.000000000 +0100 +++ new/parso-0.8.4/parso/__init__.py 2024-04-05 10:44:00.000000000 +0200 @@ -43,7 +43,7 @@ from parso.utils import split_lines, python_bytes_to_unicode -__version__ = '0.8.3' +__version__ = '0.8.4' def parse(code=None, **kwargs): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso/grammar.py new/parso-0.8.4/parso/grammar.py --- old/parso-0.8.3/parso/grammar.py 2021-11-30 22:04:12.000000000 +0100 +++ new/parso-0.8.4/parso/grammar.py 2024-04-05 10:44:00.000000000 +0200 @@ -106,14 +106,14 @@ if file_io is None: if code is None: - file_io = FileIO(path) # type: ignore + file_io = FileIO(path) # type: ignore[arg-type] else: file_io = KnownContentFileIO(path, code) if cache and file_io.path is not None: module_node = load_module(self._hashed, file_io, cache_path=cache_path) if module_node is not None: - return module_node # type: ignore + return module_node # type: ignore[no-any-return] if code is None: code = file_io.read() @@ -132,7 +132,7 @@ module_node = module_cache_item.node old_lines = module_cache_item.lines if old_lines == lines: - return module_node # type: ignore + return module_node # type: ignore[no-any-return] new_node = self._diff_parser( self._pgen_grammar, self._tokenizer, module_node @@ -144,7 +144,7 @@ # Never pickle in pypy, it's slow as hell. pickling=cache and not is_pypy, cache_path=cache_path) - return new_node # type: ignore + return new_node # type: ignore[no-any-return] tokens = self._tokenizer(lines) @@ -160,7 +160,7 @@ # Never pickle in pypy, it's slow as hell. pickling=cache and not is_pypy, cache_path=cache_path) - return root_node # type: ignore + return root_node # type: ignore[no-any-return] def _get_token_namespace(self): ns = self._token_namespace diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso/pgen2/generator.py new/parso-0.8.4/parso/pgen2/generator.py --- old/parso-0.8.3/parso/pgen2/generator.py 2021-11-30 22:04:12.000000000 +0100 +++ new/parso-0.8.4/parso/pgen2/generator.py 2024-04-05 10:44:00.000000000 +0200 @@ -276,7 +276,7 @@ dfa_state.transitions[transition] = DFAPlan(next_dfa) _calculate_tree_traversal(rule_to_dfas) - return Grammar(start_nonterminal, rule_to_dfas, reserved_strings) # type: ignore + return Grammar(start_nonterminal, rule_to_dfas, reserved_strings) # type: ignore[arg-type] def _make_transition(token_namespace, reserved_syntax_strings, label): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso/python/errors.py new/parso-0.8.4/parso/python/errors.py --- old/parso-0.8.3/parso/python/errors.py 2021-11-30 22:04:12.000000000 +0100 +++ new/parso-0.8.4/parso/python/errors.py 2024-04-05 10:44:00.000000000 +0200 @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import codecs +import sys import warnings import re from contextlib import contextmanager @@ -33,7 +34,10 @@ return "literal" else: if second.children[1] == ":" or second.children[0] == "**": - return "dict display" + if version < (3, 10): + return "dict display" + else: + return "dict literal" else: return "set display" elif ( @@ -47,7 +51,10 @@ elif first == "[": return "list" elif first == "{" and second == "}": - return "dict display" + if version < (3, 10): + return "dict display" + else: + return "dict literal" elif first == "{" and len(node.children) > 2: return "set display" elif type_ == "keyword": @@ -58,7 +65,10 @@ else: return str(node.value) elif type_ == "operator" and node.value == "...": - return "Ellipsis" + if version < (3, 10): + return "Ellipsis" + else: + return "ellipsis" elif type_ == "comparison": return "comparison" elif type_ in ("string", "number", "strings"): @@ -83,7 +93,10 @@ or "_test" in type_ or type_ in ("term", "factor") ): - return "operator" + if version < (3, 10): + return "operator" + else: + return "expression" elif type_ == "star_expr": return "starred" elif type_ == "testlist_star_expr": @@ -610,7 +623,10 @@ @ErrorFinder.register_rule(type='string') class _StringChecks(SyntaxRule): - message = "bytes can only contain ASCII literal characters." + if sys.version_info < (3, 10): + message = "bytes can only contain ASCII literal characters." + else: + message = "bytes can only contain ASCII literal characters" def is_issue(self, leaf): string_prefix = leaf.string_prefix.lower() @@ -1043,14 +1059,20 @@ error = 'literal' else: if second.children[1] == ':': - error = 'dict display' + if self._normalizer.version < (3, 10): + error = 'dict display' + else: + error = 'dict literal' else: error = 'set display' elif first == "{" and second == "}": if self._normalizer.version < (3, 8): error = 'literal' else: - error = "dict display" + if self._normalizer.version < (3, 10): + error = "dict display" + else: + error = "dict literal" elif first == "{" and len(node.children) > 2: if self._normalizer.version < (3, 8): error = 'literal' @@ -1083,7 +1105,10 @@ error = str(node.value) elif type_ == 'operator': if node.value == '...': - error = 'Ellipsis' + if self._normalizer.version < (3, 10): + error = 'Ellipsis' + else: + error = 'ellipsis' elif type_ == 'comparison': error = 'comparison' elif type_ in ('string', 'number', 'strings'): @@ -1098,7 +1123,10 @@ if node.children[0] == 'await': error = 'await expression' elif node.children[-2] == '**': - error = 'operator' + if self._normalizer.version < (3, 10): + error = 'operator' + else: + error = 'expression' else: # Has a trailer trailer = node.children[-1] @@ -1120,7 +1148,10 @@ elif ('expr' in type_ and type_ != 'star_expr' # is a substring or '_test' in type_ or type_ in ('term', 'factor')): - error = 'operator' + if self._normalizer.version < (3, 10): + error = 'operator' + else: + error = 'expression' elif type_ == "star_expr": if is_deletion: if self._normalizer.version >= (3, 9): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso/python/grammar313.txt new/parso-0.8.4/parso/python/grammar313.txt --- old/parso-0.8.3/parso/python/grammar313.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/parso-0.8.4/parso/python/grammar313.txt 2024-04-05 10:44:00.000000000 +0200 @@ -0,0 +1,169 @@ +# Grammar for Python + +# NOTE WELL: You should also follow all the steps listed at +# https://devguide.python.org/grammar/ + +# Start symbols for the grammar: +# single_input is a single interactive statement; +# file_input is a module or sequence of commands read from an input file; +# eval_input is the input for the eval() functions. +# NB: compound_stmt in single_input is followed by extra NEWLINE! +single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE +file_input: stmt* ENDMARKER +eval_input: testlist NEWLINE* ENDMARKER + +decorator: '@' namedexpr_test NEWLINE +decorators: decorator+ +decorated: decorators (classdef | funcdef | async_funcdef) + +async_funcdef: 'async' funcdef +funcdef: 'def' NAME parameters ['->' test] ':' suite + +parameters: '(' [typedargslist] ')' +typedargslist: ( + (tfpdef ['=' test] (',' tfpdef ['=' test])* ',' '/' [',' [ tfpdef ['=' test] ( + ',' tfpdef ['=' test])* ([',' [ + '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]] + | '**' tfpdef [',']]]) + | '*' [tfpdef] (',' tfpdef ['=' test])* ([',' ['**' tfpdef [',']]]) + | '**' tfpdef [',']]] ) +| (tfpdef ['=' test] (',' tfpdef ['=' test])* [',' [ + '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]] + | '**' tfpdef [',']]] + | '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]] + | '**' tfpdef [',']) +) +tfpdef: NAME [':' test] +varargslist: vfpdef ['=' test ](',' vfpdef ['=' test])* ',' '/' [',' [ (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [ + '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] + | '**' vfpdef [',']]] + | '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] + | '**' vfpdef [',']) ]] | (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [ + '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] + | '**' vfpdef [',']]] + | '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] + | '**' vfpdef [','] +) +vfpdef: NAME + +stmt: simple_stmt | compound_stmt | NEWLINE +simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE +small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt | + import_stmt | global_stmt | nonlocal_stmt | assert_stmt) +expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | + ('=' (yield_expr|testlist_star_expr))*) +annassign: ':' test ['=' (yield_expr|testlist_star_expr)] +testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] +augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | + '<<=' | '>>=' | '**=' | '//=') +# For normal and annotated assignments, additional restrictions enforced by the interpreter +del_stmt: 'del' exprlist +pass_stmt: 'pass' +flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt +break_stmt: 'break' +continue_stmt: 'continue' +return_stmt: 'return' [testlist_star_expr] +yield_stmt: yield_expr +raise_stmt: 'raise' [test ['from' test]] +import_stmt: import_name | import_from +import_name: 'import' dotted_as_names +# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS +import_from: ('from' (('.' | '...')* dotted_name | ('.' | '...')+) + 'import' ('*' | '(' import_as_names ')' | import_as_names)) +import_as_name: NAME ['as' NAME] +dotted_as_name: dotted_name ['as' NAME] +import_as_names: import_as_name (',' import_as_name)* [','] +dotted_as_names: dotted_as_name (',' dotted_as_name)* +dotted_name: NAME ('.' NAME)* +global_stmt: 'global' NAME (',' NAME)* +nonlocal_stmt: 'nonlocal' NAME (',' NAME)* +assert_stmt: 'assert' test [',' test] + +compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt +async_stmt: 'async' (funcdef | with_stmt | for_stmt) +if_stmt: 'if' namedexpr_test ':' suite ('elif' namedexpr_test ':' suite)* ['else' ':' suite] +while_stmt: 'while' namedexpr_test ':' suite ['else' ':' suite] +for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] +try_stmt: ('try' ':' suite + ((except_clause ':' suite)+ + ['else' ':' suite] + ['finally' ':' suite] | + 'finally' ':' suite)) +with_stmt: 'with' with_item (',' with_item)* ':' suite +with_item: test ['as' expr] +# NB compile.c makes sure that the default except clause is last +except_clause: 'except' [test ['as' NAME]] +suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT + +namedexpr_test: test [':=' test] +test: or_test ['if' or_test 'else' test] | lambdef +lambdef: 'lambda' [varargslist] ':' test +or_test: and_test ('or' and_test)* +and_test: not_test ('and' not_test)* +not_test: 'not' not_test | comparison +comparison: expr (comp_op expr)* +# <> isn't actually a valid comparison operator in Python. It's here for the +# sake of a __future__ import described in PEP 401 (which really works :-) +comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' +star_expr: '*' expr +expr: xor_expr ('|' xor_expr)* +xor_expr: and_expr ('^' and_expr)* +and_expr: shift_expr ('&' shift_expr)* +shift_expr: arith_expr (('<<'|'>>') arith_expr)* +arith_expr: term (('+'|'-') term)* +term: factor (('*'|'@'|'/'|'%'|'//') factor)* +factor: ('+'|'-'|'~') factor | power +power: atom_expr ['**' factor] +atom_expr: ['await'] atom trailer* +atom: ('(' [yield_expr|testlist_comp] ')' | + '[' [testlist_comp] ']' | + '{' [dictorsetmaker] '}' | + NAME | NUMBER | strings | '...' | 'None' | 'True' | 'False') +testlist_comp: (namedexpr_test|star_expr) ( comp_for | (',' (namedexpr_test|star_expr))* [','] ) +trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME +subscriptlist: subscript (',' subscript)* [','] +subscript: test [':=' test] | [test] ':' [test] [sliceop] +sliceop: ':' [test] +exprlist: (expr|star_expr) (',' (expr|star_expr))* [','] +testlist: test (',' test)* [','] +dictorsetmaker: ( ((test ':' test | '**' expr) + (comp_for | (',' (test ':' test | '**' expr))* [','])) | + ((test [':=' test] | star_expr) + (comp_for | (',' (test [':=' test] | star_expr))* [','])) ) + +classdef: 'class' NAME ['(' [arglist] ')'] ':' suite + +arglist: argument (',' argument)* [','] + +# The reason that keywords are test nodes instead of NAME is that using NAME +# results in an ambiguity. ast.c makes sure it's a NAME. +# "test '=' test" is really "keyword '=' test", but we have no such token. +# These need to be in a single rule to avoid grammar that is ambiguous +# to our LL(1) parser. Even though 'test' includes '*expr' in star_expr, +# we explicitly match '*' here, too, to give it proper precedence. +# Illegal combinations and orderings are blocked in ast.c: +# multiple (test comp_for) arguments are blocked; keyword unpackings +# that precede iterable unpackings are blocked; etc. +argument: ( test [comp_for] | + test ':=' test | + test '=' test | + '**' test | + '*' test ) + +comp_iter: comp_for | comp_if +sync_comp_for: 'for' exprlist 'in' or_test [comp_iter] +comp_for: ['async'] sync_comp_for +comp_if: 'if' or_test [comp_iter] + +# not used in grammar, but may appear in "node" passed from Parser to Compiler +encoding_decl: NAME + +yield_expr: 'yield' [yield_arg] +yield_arg: 'from' test | testlist_star_expr + +strings: (STRING | fstring)+ +fstring: FSTRING_START fstring_content* FSTRING_END +fstring_content: FSTRING_STRING | fstring_expr +fstring_conversion: '!' NAME +fstring_expr: '{' (testlist_comp | yield_expr) ['='] [ fstring_conversion ] [ fstring_format_spec ] '}' +fstring_format_spec: ':' fstring_content* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso/python/tree.py new/parso-0.8.4/parso/python/tree.py --- old/parso-0.8.3/parso/python/tree.py 2021-11-30 22:04:12.000000000 +0100 +++ new/parso-0.8.4/parso/python/tree.py 2024-04-05 10:44:00.000000000 +0200 @@ -295,6 +295,8 @@ class _StringComparisonMixin: + __slots__ = () + def __eq__(self, other): """ Make comparisons with strings easy. @@ -544,6 +546,7 @@ 4. annotation (if present) """ type = 'funcdef' + __slots__ = () def __init__(self, children): super().__init__(children) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso.egg-info/PKG-INFO new/parso-0.8.4/parso.egg-info/PKG-INFO --- old/parso-0.8.3/parso.egg-info/PKG-INFO 2021-11-30 22:05:45.000000000 +0100 +++ new/parso-0.8.4/parso.egg-info/PKG-INFO 2024-04-05 10:44:26.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: parso -Version: 0.8.3 +Version: 0.8.4 Summary: A Python Parser Home-page: https://github.com/davidhalter/parso Author: David Halter @@ -113,6 +113,11 @@ Unreleased ++++++++++ + 0.8.4 (2024-04-05) + ++++++++++++++++++ + + - Add basic support for Python 3.13 + 0.8.3 (2021-11-30) ++++++++++++++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso.egg-info/SOURCES.txt new/parso-0.8.4/parso.egg-info/SOURCES.txt --- old/parso-0.8.3/parso.egg-info/SOURCES.txt 2021-11-30 22:05:45.000000000 +0100 +++ new/parso-0.8.4/parso.egg-info/SOURCES.txt 2024-04-05 10:44:26.000000000 +0200 @@ -51,6 +51,7 @@ parso/python/grammar310.txt parso/python/grammar311.txt parso/python/grammar312.txt +parso/python/grammar313.txt parso/python/grammar36.txt parso/python/grammar37.txt parso/python/grammar38.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/parso.egg-info/requires.txt new/parso-0.8.4/parso.egg-info/requires.txt --- old/parso-0.8.3/parso.egg-info/requires.txt 2021-11-30 22:05:45.000000000 +0100 +++ new/parso-0.8.4/parso.egg-info/requires.txt 2024-04-05 10:44:26.000000000 +0200 @@ -1,8 +1,9 @@ [qa] -flake8==3.8.3 -mypy==0.782 +flake8==5.0.4 +mypy==0.971 +types-setuptools==67.2.0.1 [testing] docopt -pytest<6.0.0 +pytest diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/setup.cfg new/parso-0.8.4/setup.cfg --- old/parso-0.8.3/setup.cfg 2021-11-30 22:05:45.521858000 +0100 +++ new/parso-0.8.4/setup.cfg 2024-04-05 10:44:26.357275500 +0200 @@ -9,6 +9,8 @@ W503, [mypy] +show_error_codes = true +enable_error_code = ignore-without-code disallow_subclassing_any = True warn_redundant_casts = True warn_unused_ignores = True @@ -16,6 +18,7 @@ warn_unused_configs = True warn_unreachable = True strict_equality = True +no_implicit_optional = False [egg_info] tag_build = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/setup.py new/parso-0.8.4/setup.py --- old/parso-0.8.3/setup.py 2021-11-30 22:04:12.000000000 +0100 +++ new/parso-0.8.4/setup.py 2024-04-05 10:44:00.000000000 +0200 @@ -47,12 +47,16 @@ ], extras_require={ 'testing': [ - 'pytest<6.0.0', + 'pytest', 'docopt', ], 'qa': [ - 'flake8==3.8.3', - 'mypy==0.782', + # Latest version which supports Python 3.6 + 'flake8==5.0.4', + # Latest version which supports Python 3.6 + 'mypy==0.971', + # Arbitrary pins, latest at the time of pinning + 'types-setuptools==67.2.0.1', ], }, ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parso-0.8.3/test/test_python_errors.py new/parso-0.8.4/test/test_python_errors.py --- old/parso-0.8.3/test/test_python_errors.py 2021-11-30 22:04:12.000000000 +0100 +++ new/parso-0.8.4/test/test_python_errors.py 2024-04-05 10:44:00.000000000 +0200 @@ -1,6 +1,7 @@ """ Testing if parso finds syntax errors and indentation errors. """ +import re import sys import warnings @@ -136,6 +137,28 @@ wanted = 'SyntaxError: invalid syntax' elif wanted == "SyntaxError: f-string: single '}' is not allowed": wanted = 'SyntaxError: invalid syntax' + elif "Maybe you meant '==' instead of '='?" in wanted: + wanted = wanted.removesuffix(" here. Maybe you meant '==' instead of '='?") + elif re.match( + r"SyntaxError: unterminated string literal \(detected at line \d+\)", wanted + ): + wanted = "SyntaxError: EOL while scanning string literal" + elif re.match( + r"SyntaxError: unterminated triple-quoted string literal \(detected at line \d+\)", + wanted, + ): + wanted = 'SyntaxError: EOF while scanning triple-quoted string literal' + elif wanted == 'SyntaxError: cannot use starred expression here': + wanted = "SyntaxError: can't use starred expression here" + elif wanted == 'SyntaxError: f-string: cannot use starred expression here': + wanted = "SyntaxError: f-string: can't use starred expression here" + elif re.match( + r"IndentationError: expected an indented block after '[^']*' statement on line \d", + wanted, + ): + wanted = 'IndentationError: expected an indented block' + elif wanted == 'SyntaxError: unterminated string literal': + wanted = 'SyntaxError: EOL while scanning string literal' return [wanted], line_nr