diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index 21681c913..d9eab19a0 100644 --- a/certbot-nginx/setup.py +++ b/certbot-nginx/setup.py @@ -11,7 +11,7 @@ install_requires = [ # PyOpenSSL>=25.0.0 is just needed to satisfy mypy right now so this dependency can probably be # relaxed to >=24.0.0 if needed. 'PyOpenSSL>=25.0.0', - 'pyparsing>=2.4.7', + 'pyparsing>=3.0.0', ] setup( diff --git a/certbot-nginx/src/certbot_nginx/_internal/nginxparser.py b/certbot-nginx/src/certbot_nginx/_internal/nginxparser.py index e82329717..be46368e0 100644 --- a/certbot-nginx/src/certbot_nginx/_internal/nginxparser.py +++ b/certbot-nginx/src/certbot_nginx/_internal/nginxparser.py @@ -33,14 +33,14 @@ class RawNginxParser: """A class that parses nginx configuration with pyparsing.""" # constants - space = Optional(White(ws=' \t\r\n\u00a0')).leaveWhitespace() - required_space = White(ws=' \t\r\n\u00a0').leaveWhitespace() + space = Optional(White(ws=' \t\r\n\u00a0')).leave_whitespace() + required_space = White(ws=' \t\r\n\u00a0').leave_whitespace() left_bracket = Literal("{").suppress() right_bracket = space + Literal("}").suppress() semicolon = Literal(";").suppress() - dquoted = QuotedString('"', multiline=True, unquoteResults=False, escChar='\\') - squoted = QuotedString("'", multiline=True, unquoteResults=False, escChar='\\') + dquoted = QuotedString('"', multiline=True, unquote_results=False, esc_char='\\') + squoted = QuotedString("'", multiline=True, unquote_results=False, esc_char='\\') quoted = dquoted | squoted head_tokenchars = Regex(r"(\$\{)|[^{};\s'\"]") # if (last_space) tail_tokenchars = Regex(r"(\$\{)|[^{;\s]") # else @@ -61,18 +61,18 @@ class RawNginxParser: contents = Group(comment) | Group(block) | Group(assignment) block_begin = Group(whitespace_token_group) - block_innards = Group(ZeroOrMore(contents) + space).leaveWhitespace() + block_innards = Group(ZeroOrMore(contents) + space).leave_whitespace() block << block_begin + left_bracket + block_innards + right_bracket script = ZeroOrMore(contents) + space + stringEnd - script.parseWithTabs().leaveWhitespace() + script.parse_with_tabs().leave_whitespace() def __init__(self, source: str) -> None: self.source = source def parse(self) -> ParseResults: """Returns the parsed tree.""" - return self.script.parseString(self.source) + return self.script.parse_string(self.source) def as_list(self) -> list[Any]: """Returns the parsed tree as a list.""" diff --git a/certbot-nginx/src/certbot_nginx/_internal/tests/nginxparser_test.py b/certbot-nginx/src/certbot_nginx/_internal/tests/nginxparser_test.py index f53f6a40f..764634832 100644 --- a/certbot-nginx/src/certbot_nginx/_internal/tests/nginxparser_test.py +++ b/certbot-nginx/src/certbot_nginx/_internal/tests/nginxparser_test.py @@ -23,21 +23,21 @@ class TestRawNginxParser(unittest.TestCase): """Test the raw low-level Nginx config parser.""" def test_assignments(self): - parsed = RawNginxParser.assignment.parseString('root /test;').asList() + parsed = RawNginxParser.assignment.parse_string('root /test;').asList() assert parsed == ['root', ' ', '/test'] - parsed = RawNginxParser.assignment.parseString('root /test;foo bar;').asList() + parsed = RawNginxParser.assignment.parse_string('root /test;foo bar;').asList() assert parsed == ['root', ' ', '/test'], ['foo', ' ', 'bar'] def test_blocks(self): - parsed = RawNginxParser.block.parseString('foo {}').asList() + parsed = RawNginxParser.block.parse_string('foo {}').asList() assert parsed == [['foo', ' '], []] - parsed = RawNginxParser.block.parseString('location /foo{}').asList() + parsed = RawNginxParser.block.parse_string('location /foo{}').asList() assert parsed == [['location', ' ', '/foo'], []] - parsed = RawNginxParser.block.parseString('foo { bar foo ; }').asList() + parsed = RawNginxParser.block.parse_string('foo { bar foo ; }').asList() assert parsed == [['foo', ' '], [[' ', 'bar', ' ', 'foo', ' '], ' ']] def test_nested_blocks(self): - parsed = RawNginxParser.block.parseString('foo { bar {} }').asList() + parsed = RawNginxParser.block.parse_string('foo { bar {} }').asList() block, content = parsed assert FIRST(content) == [[' ', 'bar', ' '], []] assert FIRST(block) == 'foo' diff --git a/newsfragments/10560.changed b/newsfragments/10560.changed new file mode 100644 index 000000000..e61b2e3a5 --- /dev/null +++ b/newsfragments/10560.changed @@ -0,0 +1 @@ +certbot-nginx now requires pyparsing>=3.0.0. diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index ac72a441c..b7be924e5 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -2,30 +2,30 @@ # that script. apacheconfig==0.3.2 ; python_version == "3.10" asn1crypto==0.24.0 ; python_version == "3.10" -astroid==4.0.1 ; python_version == "3.10" +astroid==4.0.3 ; python_version == "3.10" attrs==25.4.0 ; python_version == "3.10" -beautifulsoup4==4.14.2 ; python_version == "3.10" +beautifulsoup4==4.14.3 ; python_version == "3.10" boto3==1.20.34 ; python_version == "3.10" botocore==1.23.34 ; python_version == "3.10" cachetools==5.5.2 ; python_version == "3.10" -certifi==2025.10.5 ; python_version == "3.10" +certifi==2026.1.4 ; python_version == "3.10" cffi==1.14.1 ; python_version == "3.10" chardet==3.0.4 ; python_version == "3.10" cloudflare==2.19.0 ; python_version == "3.10" colorama==0.4.6 ; (sys_platform == "win32" or platform_system == "Windows") and python_version == "3.10" configargparse==1.5.3 ; python_version == "3.10" configobj==5.0.6 ; python_version == "3.10" -coverage==7.11.0 ; python_version == "3.10" +coverage==7.13.3 ; python_version == "3.10" cryptography==43.0.0 ; python_version == "3.10" cython==0.29.37 ; python_version == "3.10" -dill==0.4.0 ; python_version == "3.10" +dill==0.4.1 ; python_version == "3.10" distlib==0.4.0 ; python_version == "3.10" distro==1.0.1 ; python_version == "3.10" dns-lexicon==3.15.1 ; python_version == "3.10" dnspython==2.6.1 ; python_version == "3.10" -exceptiongroup==1.3.0 ; python_version == "3.10" -execnet==2.1.1 ; python_version == "3.10" -filelock==3.20.0 ; python_version == "3.10" +exceptiongroup==1.3.1 ; python_version == "3.10" +execnet==2.1.2 ; python_version == "3.10" +filelock==3.20.3 ; python_version == "3.10" funcsigs==0.4 ; python_version == "3.10" google-api-python-client==1.6.5 ; python_version == "3.10" google-auth==2.16.0 ; python_version == "3.10" @@ -38,17 +38,18 @@ jmespath==0.10.0 ; python_version == "3.10" josepy==2.2.0 ; python_version == "3.10" jsonlines==4.0.0 ; python_version == "3.10" jsonpickle==4.1.1 ; python_version == "3.10" +librt==0.7.8 ; python_version == "3.10" and platform_python_implementation != "PyPy" mccabe==0.7.0 ; python_version == "3.10" mypy-extensions==1.1.0 ; python_version == "3.10" -mypy==1.18.2 ; python_version == "3.10" +mypy==1.19.1 ; python_version == "3.10" ndg-httpsclient==0.3.2 ; python_version == "3.10" oauth2client==4.1.3 ; python_version == "3.10" -packaging==25.0 ; python_version == "3.10" +packaging==26.0 ; python_version == "3.10" parsedatetime==2.6 ; python_version == "3.10" -pathspec==0.12.1 ; python_version == "3.10" +pathspec==1.0.4 ; python_version == "3.10" pbr==1.8.0 ; python_version == "3.10" -pip==25.3 ; python_version == "3.10" -platformdirs==4.5.0 ; python_version == "3.10" +pip==26.0 ; python_version == "3.10" +platformdirs==4.5.1 ; python_version == "3.10" pluggy==1.6.0 ; python_version == "3.10" ply==3.4 ; python_version == "3.10" py==1.11.0 ; python_version == "3.10" @@ -56,14 +57,14 @@ pyasn1-modules==0.4.1 ; python_version == "3.10" pyasn1==0.4.8 ; python_version == "3.10" pycparser==2.14 ; python_version == "3.10" pygments==2.19.2 ; python_version == "3.10" -pylint==4.0.2 ; python_version == "3.10" +pylint==4.0.4 ; python_version == "3.10" pyopenssl==25.0.0 ; python_version == "3.10" pyotp==2.9.0 ; python_version == "3.10" -pyparsing==2.4.7 ; python_version == "3.10" +pyparsing==3.0.0 ; python_version == "3.10" pyrfc3339==1.0 ; python_version == "3.10" pytest-cov==7.0.0 ; python_version == "3.10" pytest-xdist==3.8.0 ; python_version == "3.10" -pytest==8.4.2 ; python_version == "3.10" +pytest==9.0.2 ; python_version == "3.10" python-augeas==0.5.0 ; python_version == "3.10" python-dateutil==2.9.0.post0 ; python_version == "3.10" python-digitalocean==1.15.0 ; python_version == "3.10" @@ -73,25 +74,25 @@ pyyaml==6.0.3 ; python_version == "3.10" requests-file==3.0.1 ; python_version == "3.10" requests==2.25.1 ; python_version == "3.10" rsa==4.9.1 ; python_version == "3.10" -ruff==0.14.3 ; python_version == "3.10" +ruff==0.15.0 ; python_version == "3.10" s3transfer==0.5.2 ; python_version == "3.10" -setuptools==80.9.0 ; python_version == "3.10" +setuptools==80.10.2 ; python_version == "3.10" six==1.16.0 ; python_version == "3.10" -soupsieve==2.8 ; python_version == "3.10" -tldextract==5.3.0 ; python_version == "3.10" -tomli==2.3.0 ; python_version == "3.10" -tomlkit==0.13.3 ; python_version == "3.10" +soupsieve==2.8.3 ; python_version == "3.10" +tldextract==5.3.1 ; python_version == "3.10" +tomli==2.4.0 ; python_version == "3.10" +tomlkit==0.14.0 ; python_version == "3.10" tox==3.28.0 ; python_version == "3.10" -types-httplib2==0.31.0.20250913 ; python_version == "3.10" +types-httplib2==0.31.2.20260125 ; python_version == "3.10" types-pyrfc3339==2.0.1.20250825 ; python_version == "3.10" -types-python-dateutil==2.9.0.20251008 ; python_version == "3.10" +types-python-dateutil==2.9.0.20260124 ; python_version == "3.10" types-pywin32==311.0.0.20251008 ; python_version == "3.10" types-requests==2.31.0.6 ; python_version == "3.10" -types-setuptools==80.9.0.20250822 ; python_version == "3.10" +types-setuptools==80.10.0.20260124 ; python_version == "3.10" types-urllib3==1.26.25.14 ; python_version == "3.10" typing-extensions==4.15.0 ; python_version == "3.10" uritemplate==3.0.1 ; python_version == "3.10" urllib3==1.26.5 ; python_version == "3.10" -uv==0.9.7 ; python_version == "3.10" -virtualenv==20.35.4 ; python_version == "3.10" -wheel==0.45.1 ; python_version == "3.10" +uv==0.9.28 ; python_version == "3.10" +virtualenv==20.36.1 ; python_version == "3.10" +wheel==0.46.3 ; python_version == "3.10" diff --git a/tools/pinning/oldest/pyproject.toml b/tools/pinning/oldest/pyproject.toml index b56625e1f..a5e70e455 100644 --- a/tools/pinning/oldest/pyproject.toml +++ b/tools/pinning/oldest/pyproject.toml @@ -79,7 +79,7 @@ pyOpenSSL = "25.0.0" pyRFC3339 = "1.0" pyasn1 = "0.4.8" pycparser = "2.14" -pyparsing = "2.4.7" +pyparsing = "3.0.0" python-augeas = "0.5.0" python-digitalocean = "1.15.0" requests = "2.25.1" diff --git a/tools/requirements.txt b/tools/requirements.txt index f17d805dc..e393a6802 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -13,15 +13,15 @@ asttokens==3.0.1 ; python_version >= "3.10" and python_version < "4.0" attrs==25.4.0 ; python_version >= "3.10" and python_version < "4.0" azure-core==1.38.0 ; python_version >= "3.10" and python_version < "4.0" azure-devops==7.1.0b4 ; python_version >= "3.10" and python_version < "4.0" -babel==2.17.0 ; python_version >= "3.10" and python_version < "4.0" +babel==2.18.0 ; python_version >= "3.10" and python_version < "4.0" backports-tarfile==1.2.0 ; python_version >= "3.10" and python_version < "3.12" bcrypt==5.0.0 ; python_version >= "3.10" and python_version < "4.0" beautifulsoup4==4.14.3 ; python_version >= "3.10" and python_version < "4.0" -boto3==1.42.38 ; python_version >= "3.10" and python_version < "4.0" -botocore==1.42.38 ; python_version >= "3.10" and python_version < "4.0" +boto3==1.42.40 ; python_version >= "3.10" and python_version < "4.0" +botocore==1.42.40 ; python_version >= "3.10" and python_version < "4.0" build==1.4.0 ; python_version >= "3.10" and python_version < "4.0" cachecontrol==0.14.4 ; python_version >= "3.10" and python_version < "4.0" -cachetools==6.2.6 ; python_version >= "3.10" and python_version < "4.0" +cachetools==7.0.0 ; python_version >= "3.10" and python_version < "4.0" certifi==2026.1.4 ; python_version >= "3.10" and python_version < "4.0" cffi==2.0.0 ; python_version >= "3.10" and python_version < "4.0" chardet==5.2.0 ; python_version >= "3.10" and python_version < "4.0" @@ -32,7 +32,7 @@ cloudflare==2.19.4 ; python_version >= "3.10" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" configargparse==1.7.1 ; python_version >= "3.10" and python_version < "4.0" configobj==5.0.9 ; python_version >= "3.10" and python_version < "4.0" -coverage==7.13.2 ; python_version >= "3.10" and python_version < "4.0" +coverage==7.13.3 ; python_version >= "3.10" and python_version < "4.0" crashtest==0.4.1 ; python_version >= "3.10" and python_version < "4.0" cryptography==46.0.4 ; python_version >= "3.10" and python_version < "4.0" cython==0.29.37 ; python_version >= "3.10" and python_version <= "3.12" @@ -46,7 +46,7 @@ dns-lexicon==3.23.2 ; python_version >= "3.10" and python_version < "4.0" dnspython==2.8.0 ; python_version >= "3.10" and python_version < "4.0" docutils==0.21.2 ; python_version == "3.10" docutils==0.22.4 ; python_version >= "3.11" and python_version < "4.0" -dulwich==0.25.2 ; python_version >= "3.10" and python_version < "4.0" +dulwich==1.0.0 ; python_version >= "3.10" and python_version < "4.0" exceptiongroup==1.3.1 ; python_version == "3.10" execnet==2.1.2 ; python_version >= "3.10" and python_version < "4.0" executing==2.2.1 ; python_version >= "3.10" and python_version < "4.0" @@ -73,7 +73,7 @@ invoke==2.2.1 ; python_version >= "3.10" and python_version < "4.0" ipdb==0.13.13 ; python_version >= "3.10" and python_version < "4.0" ipython-pygments-lexers==1.1.1 ; python_version >= "3.11" and python_version < "4.0" ipython==8.38.0 ; python_version == "3.10" -ipython==9.9.0 ; python_version >= "3.11" and python_version < "4.0" +ipython==9.10.0 ; python_version >= "3.11" and python_version < "4.0" isodate==0.7.2 ; python_version >= "3.10" and python_version < "4.0" isort==5.13.2 ; python_version >= "3.10" and python_version < "4.0" jaraco-classes==3.4.0 ; python_version >= "3.10" and python_version < "4.0" @@ -105,16 +105,16 @@ parsedatetime==2.6 ; python_version >= "3.10" and python_version < "4.0" parso==0.8.5 ; python_version >= "3.10" and python_version < "4.0" pbs-installer==2026.1.27 ; python_version >= "3.10" and python_version < "4.0" pexpect==4.9.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform != "win32" and sys_platform != "emscripten" -pip==25.3 ; python_version >= "3.10" and python_version < "4.0" +pip==26.0 ; python_version >= "3.10" and python_version < "4.0" pkginfo==1.12.1.2 ; python_version >= "3.10" and python_version < "4.0" platformdirs==4.5.1 ; python_version >= "3.10" and python_version < "4.0" pluggy==1.6.0 ; python_version >= "3.10" and python_version < "4.0" ply==3.11 ; python_version >= "3.10" and python_version < "4.0" -poetry-core==2.3.0 ; python_version >= "3.10" and python_version < "4.0" +poetry-core==2.3.1 ; python_version >= "3.10" and python_version < "4.0" poetry-plugin-export==1.10.0 ; python_version >= "3.10" and python_version < "4.0" -poetry==2.3.1 ; python_version >= "3.10" and python_version < "4.0" +poetry==2.3.2 ; python_version >= "3.10" and python_version < "4.0" prompt-toolkit==3.0.52 ; python_version >= "3.10" and python_version < "4.0" -proto-plus==1.27.0 ; python_version >= "3.10" and python_version < "4.0" +proto-plus==1.27.1 ; python_version >= "3.10" and python_version < "4.0" protobuf==6.33.5 ; python_version >= "3.10" and python_version < "4.0" ptyprocess==0.7.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform != "win32" and sys_platform != "emscripten" pure-eval==0.2.3 ; python_version >= "3.10" and python_version < "4.0" @@ -126,7 +126,7 @@ pylint==3.3.3 ; python_version >= "3.10" and python_version < "4.0" pynacl==1.6.2 ; python_version >= "3.10" and python_version < "4.0" pyopenssl==25.3.0 ; python_version >= "3.10" and python_version < "4.0" pyotp==2.9.0 ; python_version >= "3.10" and python_version < "4.0" -pyparsing==3.2.5 ; python_version >= "3.10" and python_version < "4.0" +pyparsing==3.3.2 ; python_version >= "3.10" and python_version < "4.0" pyproject-api==1.10.0 ; python_version >= "3.10" and python_version < "4.0" pyproject-hooks==1.2.0 ; python_version >= "3.10" and python_version < "4.0" pyrfc3339==2.1.0 ; python_version >= "3.10" and python_version < "4.0" @@ -146,10 +146,10 @@ requests-oauthlib==2.0.0 ; python_version >= "3.10" and python_version < "4.0" requests-toolbelt==1.0.0 ; python_version >= "3.10" and python_version < "4.0" requests==2.32.5 ; python_version >= "3.10" and python_version < "4.0" rfc3986==2.0.0 ; python_version >= "3.10" and python_version < "4.0" -rich==14.3.1 ; python_version >= "3.10" and python_version < "4.0" +rich==14.3.2 ; python_version >= "3.10" and python_version < "4.0" roman-numerals==4.1.0 ; python_version >= "3.11" and python_version < "4.0" rsa==4.9.1 ; python_version >= "3.10" and python_version < "4.0" -ruff==0.14.14 ; python_version >= "3.10" and python_version < "4.0" +ruff==0.15.0 ; python_version >= "3.10" and python_version < "4.0" s3transfer==0.16.0 ; python_version >= "3.10" and python_version < "4.0" secretstorage==3.5.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "linux" semantic-version==2.10.0 ; python_version >= "3.10" and python_version < "4.0" @@ -190,9 +190,9 @@ uritemplate==4.2.0 ; python_version >= "3.10" and python_version < "4.0" urllib3==2.6.3 ; python_version >= "3.10" and python_version < "4.0" uv==0.9.28 ; python_version >= "3.10" and python_version < "4.0" virtualenv==20.36.1 ; python_version >= "3.10" and python_version < "4.0" -wcwidth==0.5.2 ; python_version >= "3.10" and python_version < "4.0" +wcwidth==0.5.3 ; python_version >= "3.10" and python_version < "4.0" wheel==0.46.3 ; python_version >= "3.10" and python_version < "4.0" -wrapt==2.0.1 ; python_version >= "3.10" and python_version < "4.0" +wrapt==2.1.1 ; python_version >= "3.10" and python_version < "4.0" xattr==1.3.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "darwin" zipp==3.23.0 ; python_version >= "3.10" and python_version < "3.12" zstandard==0.25.0 ; python_version >= "3.10" and python_version < "4.0"