Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-flake8-comprehensions for 
openSUSE:Factory checked in at 2024-07-01 11:22:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-flake8-comprehensions (Old)
 and      /work/SRC/openSUSE:Factory/.python-flake8-comprehensions.new.18349 
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-flake8-comprehensions"

Mon Jul  1 11:22:14 2024 rev:15 rq:1184214 version:3.15.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-flake8-comprehensions/python-flake8-comprehensions.changes
        2024-02-29 21:50:37.278575809 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-flake8-comprehensions.new.18349/python-flake8-comprehensions.changes
     2024-07-01 11:23:05.448994367 +0200
@@ -1,0 +2,7 @@
+Mon Jul  1 07:37:44 UTC 2024 - Dirk Müller <[email protected]>
+
+- update to 3.15.0:
+  * Add rule C420 to check for dict comprehensions with constant
+    values, encouraging replacement with dict.fromkeys().
+
+-------------------------------------------------------------------

Old:
----
  flake8-comprehensions-3.14.0-gh.tar.gz

New:
----
  flake8-comprehensions-3.15.0-gh.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-flake8-comprehensions.spec ++++++
--- /var/tmp/diff_new_pack.OUf7wb/_old  2024-07-01 11:23:05.957012753 +0200
+++ /var/tmp/diff_new_pack.OUf7wb/_new  2024-07-01 11:23:05.957012753 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           python-flake8-comprehensions
-Version:        3.14.0
+Version:        3.15.0
 Release:        0
 Summary:        A flake8 plugin to help you write better list/set/dict 
comprehensions
 License:        ISC

++++++ flake8-comprehensions-3.14.0-gh.tar.gz -> 
flake8-comprehensions-3.15.0-gh.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/.github/FUNDING.yml 
new/flake8-comprehensions-3.15.0/.github/FUNDING.yml
--- old/flake8-comprehensions-3.14.0/.github/FUNDING.yml        1970-01-01 
01:00:00.000000000 +0100
+++ new/flake8-comprehensions-3.15.0/.github/FUNDING.yml        2024-06-30 
00:29:44.000000000 +0200
@@ -0,0 +1,3 @@
+tidelift: pypi/flake8-comprehensions
+custom:
+- "https://adamj.eu/books/";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/.github/dependabot.yml 
new/flake8-comprehensions-3.15.0/.github/dependabot.yml
--- old/flake8-comprehensions-3.14.0/.github/dependabot.yml     2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/.github/dependabot.yml     2024-06-30 
00:29:44.000000000 +0200
@@ -2,5 +2,9 @@
 updates:
 - package-ecosystem: github-actions
   directory: "/"
+  groups:
+    "GitHub Actions":
+      patterns:
+      - "*"
   schedule:
     interval: weekly
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/flake8-comprehensions-3.14.0/.github/workflows/main.yml 
new/flake8-comprehensions-3.15.0/.github/workflows/main.yml
--- old/flake8-comprehensions-3.14.0/.github/workflows/main.yml 2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/.github/workflows/main.yml 2024-06-30 
00:29:44.000000000 +0200
@@ -25,9 +25,9 @@
         - '3.12'
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
-    - uses: actions/setup-python@v4
+    - uses: actions/setup-python@v5
       with:
         python-version: ${{ matrix.python-version }}
         allow-prereleases: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/.pre-commit-config.yaml 
new/flake8-comprehensions-3.15.0/.pre-commit-config.yaml
--- old/flake8-comprehensions-3.14.0/.pre-commit-config.yaml    2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/.pre-commit-config.yaml    2024-06-30 
00:29:44.000000000 +0200
@@ -1,9 +1,9 @@
 default_language_version:
-  python: python3.11
+  python: python3.12
 
 repos:
 - repo: https://github.com/pre-commit/pre-commit-hooks
-  rev: v4.4.0
+  rev: v4.6.0
   hooks:
   - id: check-added-large-files
   - id: check-case-conflict
@@ -14,62 +14,49 @@
   - id: end-of-file-fixer
   - id: trailing-whitespace
 - repo: https://github.com/tox-dev/pyproject-fmt
-  rev: 0.12.1
+  rev: 2.1.3
   hooks:
   - id: pyproject-fmt
-- repo: https://github.com/asottile/setup-cfg-fmt
-  rev: v2.4.0
-  hooks:
-  - id: setup-cfg-fmt
-    args:
-    - --include-version-classifiers
-    - --max-py-version
-    - '3.12'
 - repo: https://github.com/tox-dev/tox-ini-fmt
   rev: 1.3.1
   hooks:
   - id: tox-ini-fmt
 - repo: https://github.com/rstcheck/rstcheck
-  rev: v6.1.2
+  rev: v6.2.0
   hooks:
   - id: rstcheck
     additional_dependencies:
     - tomli==2.0.1
 - repo: https://github.com/asottile/pyupgrade
-  rev: v3.8.0
+  rev: v3.16.0
   hooks:
   - id: pyupgrade
     args: [--py38-plus]
-- repo: https://github.com/psf/black
-  rev: 23.3.0
+- repo: https://github.com/psf/black-pre-commit-mirror
+  rev: 24.4.2
   hooks:
   - id: black
 - repo: https://github.com/adamchainz/blacken-docs
-  rev: 1.14.0
+  rev: 1.16.0
   hooks:
   - id: blacken-docs
     additional_dependencies:
     - black==23.1.0
-- repo: https://github.com/asottile/reorder-python-imports
-  rev: v3.10.0
+- repo: https://github.com/pycqa/isort
+  rev: 5.13.2
   hooks:
-  - id: reorder-python-imports
-    args:
-    - --py38-plus
-    - --application-directories
-    - .:example:src
-    - --add-import
-    - 'from __future__ import annotations'
+    - id: isort
+      name: isort (python)
 - repo: https://github.com/PyCQA/flake8
-  rev: 6.0.0
+  rev: 7.1.0
   hooks:
   - id: flake8
     additional_dependencies:
     - flake8-bugbear
     - flake8-comprehensions
+    - flake8-logging
     - flake8-tidy-imports
-    - flake8-typing-imports
 - repo: https://github.com/pre-commit/mirrors-mypy
-  rev: v1.4.1
+  rev: v1.10.0
   hooks:
   - id: mypy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/CHANGELOG.rst 
new/flake8-comprehensions-3.15.0/CHANGELOG.rst
--- old/flake8-comprehensions-3.14.0/CHANGELOG.rst      2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/CHANGELOG.rst      2024-06-30 
00:29:44.000000000 +0200
@@ -2,6 +2,13 @@
 Changelog
 =========
 
+3.15.0 (2024-06-29)
+-------------------
+
+* Add rule C420 to check for dict comprehensions with constant values, 
encouraging replacement with ``dict.fromkeys()``.
+
+  Thanks to Tom Kuson in `PR #553 
<https://github.com/adamchainz/flake8-comprehensions/pull/553>`__.
+
 3.14.0 (2023-07-10)
 -------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/README.rst 
new/flake8-comprehensions-3.15.0/README.rst
--- old/flake8-comprehensions-3.14.0/README.rst 2023-07-10 14:46:03.000000000 
+0200
+++ new/flake8-comprehensions-3.15.0/README.rst 2024-06-30 00:29:44.000000000 
+0200
@@ -2,7 +2,7 @@
 flake8-comprehensions
 =====================
 
-.. image:: 
https://img.shields.io/github/actions/workflow/status/adamchainz/flake8-comprehensions/main.yml?branch=main&style=for-the-badge
+.. image:: 
https://img.shields.io/github/actions/workflow/status/adamchainz/flake8-comprehensions/main.yml.svg?branch=main&style=for-the-badge
    :target: 
https://github.com/adamchainz/flake8-comprehensions/actions?workflow=CI
 
 .. image:: 
https://img.shields.io/pypi/v/flake8-comprehensions.svg?style=for-the-badge
@@ -15,7 +15,14 @@
    :target: https://github.com/pre-commit/pre-commit
    :alt: pre-commit
 
-A `flake8 <https://flake8.readthedocs.io/en/latest/index.html>`_ plugin that 
helps you write better list/set/dict comprehensions.
+A `flake8 <https://flake8.readthedocs.io/en/latest/>`_ plugin that helps you 
write better list/set/dict comprehensions.
+
+----
+
+**Linting a Django project?**
+Check out my book `Boost Your Django DX 
<https://adamchainz.gumroad.com/l/byddx>`__ which covers Flake8 and many other 
code quality tools.
+
+----
 
 Requirements
 ============
@@ -34,13 +41,6 @@
 Second, if you define Flake8’s ``select`` setting, add the ``C4`` prefix to 
it.
 Otherwise, the plugin should be active by default.
 
-----
-
-**Linting a Django project?**
-Check out my book `Boost Your Django DX 
<https://adamchainz.gumroad.com/l/byddx>`__ which covers Flake8 and many other 
code quality tools.
-
-----
-
 Rules
 =====
 
@@ -227,3 +227,13 @@
 
 * Rewrite ``all([condition(x) for x in iterable])`` as ``all(condition(x) for 
x in iterable)``
 * Rewrite ``any([condition(x) for x in iterable])`` as ``any(condition(x) for 
x in iterable)``
+
+C420: Unnecessary dict comprehension - rewrite using dict.fromkeys().
+----------------------------------------------------------------------
+
+It's unnecessary to use a dict comprehension to build a dict with all values 
set to the same constant.
+Use ``dict.fromkeys()`` instead, which is faster.
+For example:
+
+* Rewrite ``{x: 1 for x in iterable}`` as ``dict.fromkeys(iterable, 1)``
+* Rewrite ``{x: None for x in iterable}`` as ``dict.fromkeys(iterable)``
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/pyproject.toml 
new/flake8-comprehensions-3.15.0/pyproject.toml
--- old/flake8-comprehensions-3.14.0/pyproject.toml     2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/pyproject.toml     2024-06-30 
00:29:44.000000000 +0200
@@ -4,8 +4,48 @@
   "setuptools",
 ]
 
-[tool.black]
-target-version = ['py38']
+[project]
+name = "flake8-comprehensions"
+version = "3.15.0"
+description = "A flake8 plugin to help you write better list/set/dict 
comprehensions."
+readme = "README.rst"
+keywords = [
+  "comprehensions",
+  "dict comprehension",
+  "flake8",
+  "list comprehension",
+  "set comprehension",
+]
+authors = [
+  { name = "Adam Johnson", email = "[email protected]" },
+]
+requires-python = ">=3.8"
+classifiers = [
+  "Development Status :: 5 - Production/Stable",
+  "Framework :: Flake8",
+  "Intended Audience :: Developers",
+  "License :: OSI Approved :: MIT License",
+  "Natural Language :: English",
+  "Programming Language :: Python :: 3 :: Only",
+  "Programming Language :: Python :: 3.8",
+  "Programming Language :: Python :: 3.9",
+  "Programming Language :: Python :: 3.10",
+  "Programming Language :: Python :: 3.11",
+  "Programming Language :: Python :: 3.12",
+  "Typing :: Typed",
+]
+dependencies = [
+  "flake8!=3.2,>=3",
+]
+urls = { Changelog = 
"https://github.com/adamchainz/flake8-comprehensions/blob/main/CHANGELOG.rst";, 
Funding = "https://adamj.eu/books/";, Repository = 
"https://github.com/adamchainz/flake8-comprehensions"; }
+entry-points."flake8.extension".C4 = 
"flake8_comprehensions:ComprehensionChecker"
+
+[tool.isort]
+add_imports = [
+  "from __future__ import annotations",
+]
+force_single_line = true
+profile = "black"
 
 [tool.pytest.ini_options]
 addopts = """\
@@ -14,9 +54,13 @@
     """
 
 [tool.mypy]
+enable_error_code = [
+  "ignore-without-code",
+  "redundant-expr",
+  "truthy-bool",
+]
 mypy_path = "src/"
 namespace_packages = false
-show_error_codes = true
 strict = true
 warn_unreachable = true
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/requirements/compile.py 
new/flake8-comprehensions-3.15.0/requirements/compile.py
--- old/flake8-comprehensions-3.14.0/requirements/compile.py    2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/requirements/compile.py    2024-06-30 
00:29:44.000000000 +0200
@@ -4,41 +4,23 @@
 import os
 import subprocess
 import sys
+from functools import partial
 from pathlib import Path
 
 if __name__ == "__main__":
     os.chdir(Path(__file__).parent)
-    os.environ["CUSTOM_COMPILE_COMMAND"] = "requirements/compile.py"
-    os.environ["PIP_REQUIRE_VIRTUALENV"] = "0"
     common_args = [
-        "-m",
-        "piptools",
+        "uv",
+        "pip",
         "compile",
+        "--quiet",
         "--generate-hashes",
-        "--allow-unsafe",
-    ] + sys.argv[1:]
-    subprocess.run(
-        ["python3.8", *common_args, "-o", "py38.txt"],
-        check=True,
-        capture_output=True,
-    )
-    subprocess.run(
-        ["python3.9", *common_args, "-o", "py39.txt"],
-        check=True,
-        capture_output=True,
-    )
-    subprocess.run(
-        ["python3.10", *common_args, "-o", "py310.txt"],
-        check=True,
-        capture_output=True,
-    )
-    subprocess.run(
-        ["python3.11", *common_args, "-o", "py311.txt"],
-        check=True,
-        capture_output=True,
-    )
-    subprocess.run(
-        ["python3.12", *common_args, "-o", "py312.txt"],
-        check=True,
-        capture_output=True,
-    )
+        "requirements.in",
+        *sys.argv[1:],
+    ]
+    run = partial(subprocess.run, check=True)
+    run([*common_args, "--python", "3.8", "--output-file", "py38.txt"])
+    run([*common_args, "--python", "3.9", "--output-file", "py39.txt"])
+    run([*common_args, "--python", "3.10", "--output-file", "py310.txt"])
+    run([*common_args, "--python", "3.11", "--output-file", "py311.txt"])
+    run([*common_args, "--python", "3.12", "--output-file", "py312.txt"])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/requirements/py310.txt 
new/flake8-comprehensions-3.15.0/requirements/py310.txt
--- old/flake8-comprehensions-3.14.0/requirements/py310.txt     2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/requirements/py310.txt     2024-06-30 
00:29:44.000000000 +0200
@@ -1,16 +1,12 @@
-#
-# This file is autogenerated by pip-compile with Python 3.10
-# by the following command:
-#
-#    requirements/compile.py
-#
-exceptiongroup==1.1.1 \
-    
--hash=sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e \
-    
--hash=sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785
+# This file was autogenerated by uv via the following command:
+#    uv pip compile --generate-hashes requirements.in --python 3.10 
--output-file py310.txt
+exceptiongroup==1.2.1 \
+    
--hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \
+    
--hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16
     # via pytest
-flake8==6.0.0 \
-    
--hash=sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7 \
-    
--hash=sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181
+flake8==7.0.0 \
+    
--hash=sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132 \
+    
--hash=sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3
     # via pytest-flake8-path
 iniconfig==2.0.0 \
     
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
@@ -20,36 +16,36 @@
     
--hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \
     
--hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e
     # via flake8
-packaging==23.1 \
-    
--hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \
-    
--hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f
+packaging==24.1 \
+    
--hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \
+    
--hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124
     # via pytest
-pluggy==1.0.0 \
-    
--hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \
-    
--hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3
+pluggy==1.5.0 \
+    
--hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \
+    
--hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669
     # via pytest
-pycodestyle==2.10.0 \
-    
--hash=sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053 \
-    
--hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610
+pycodestyle==2.11.1 \
+    
--hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \
+    
--hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67
     # via flake8
-pyflakes==3.0.1 \
-    
--hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf \
-    
--hash=sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd
+pyflakes==3.2.0 \
+    
--hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \
+    
--hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a
     # via flake8
-pytest==7.3.2 \
-    
--hash=sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295 \
-    
--hash=sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b
+pytest==8.2.2 \
+    
--hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \
+    
--hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977
     # via
     #   -r requirements.in
     #   pytest-flake8-path
     #   pytest-randomly
-pytest-flake8-path==1.4.0 \
-    
--hash=sha256:b1c21f599158c90b68a16d301d1ffa19d25c297ef22f0ca4560160065a852e8b \
-    
--hash=sha256:c873d169e4ea5ab889413212bc33eb13d653c0e7f6c630fce6dc982076a228b7
+pytest-flake8-path==1.5.0 \
+    
--hash=sha256:2c144a3127995d34e82df397350dbef7780c9920c5b7e9ebc81f63299011381e \
+    
--hash=sha256:8766879344883e67762fc3f4f8f0d624a0d143de71f6488788599b3583e279a9
     # via -r requirements.in
-pytest-randomly==3.12.0 \
-    
--hash=sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2 \
-    
--hash=sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd
+pytest-randomly==3.15.0 \
+    
--hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \
+    
--hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047
     # via -r requirements.in
 tomli==2.0.1 \
     
--hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/requirements/py311.txt 
new/flake8-comprehensions-3.15.0/requirements/py311.txt
--- old/flake8-comprehensions-3.14.0/requirements/py311.txt     2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/requirements/py311.txt     2024-06-30 
00:29:44.000000000 +0200
@@ -1,12 +1,8 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-#    requirements/compile.py
-#
-flake8==6.0.0 \
-    
--hash=sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7 \
-    
--hash=sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181
+# This file was autogenerated by uv via the following command:
+#    uv pip compile --generate-hashes requirements.in --python 3.11 
--output-file py311.txt
+flake8==7.0.0 \
+    
--hash=sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132 \
+    
--hash=sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3
     # via pytest-flake8-path
 iniconfig==2.0.0 \
     
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
@@ -16,34 +12,34 @@
     
--hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \
     
--hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e
     # via flake8
-packaging==23.1 \
-    
--hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \
-    
--hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f
+packaging==24.1 \
+    
--hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \
+    
--hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124
     # via pytest
-pluggy==1.0.0 \
-    
--hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \
-    
--hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3
+pluggy==1.5.0 \
+    
--hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \
+    
--hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669
     # via pytest
-pycodestyle==2.10.0 \
-    
--hash=sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053 \
-    
--hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610
+pycodestyle==2.11.1 \
+    
--hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \
+    
--hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67
     # via flake8
-pyflakes==3.0.1 \
-    
--hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf \
-    
--hash=sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd
+pyflakes==3.2.0 \
+    
--hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \
+    
--hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a
     # via flake8
-pytest==7.3.2 \
-    
--hash=sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295 \
-    
--hash=sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b
+pytest==8.2.2 \
+    
--hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \
+    
--hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977
     # via
     #   -r requirements.in
     #   pytest-flake8-path
     #   pytest-randomly
-pytest-flake8-path==1.4.0 \
-    
--hash=sha256:b1c21f599158c90b68a16d301d1ffa19d25c297ef22f0ca4560160065a852e8b \
-    
--hash=sha256:c873d169e4ea5ab889413212bc33eb13d653c0e7f6c630fce6dc982076a228b7
+pytest-flake8-path==1.5.0 \
+    
--hash=sha256:2c144a3127995d34e82df397350dbef7780c9920c5b7e9ebc81f63299011381e \
+    
--hash=sha256:8766879344883e67762fc3f4f8f0d624a0d143de71f6488788599b3583e279a9
     # via -r requirements.in
-pytest-randomly==3.12.0 \
-    
--hash=sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2 \
-    
--hash=sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd
+pytest-randomly==3.15.0 \
+    
--hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \
+    
--hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047
     # via -r requirements.in
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/requirements/py312.txt 
new/flake8-comprehensions-3.15.0/requirements/py312.txt
--- old/flake8-comprehensions-3.14.0/requirements/py312.txt     2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/requirements/py312.txt     2024-06-30 
00:29:44.000000000 +0200
@@ -1,12 +1,8 @@
-#
-# This file is autogenerated by pip-compile with Python 3.12
-# by the following command:
-#
-#    requirements/compile.py
-#
-flake8==6.0.0 \
-    
--hash=sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7 \
-    
--hash=sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181
+# This file was autogenerated by uv via the following command:
+#    uv pip compile --generate-hashes requirements.in --python 3.12 
--output-file py312.txt
+flake8==7.0.0 \
+    
--hash=sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132 \
+    
--hash=sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3
     # via pytest-flake8-path
 iniconfig==2.0.0 \
     
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
@@ -16,34 +12,34 @@
     
--hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \
     
--hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e
     # via flake8
-packaging==23.1 \
-    
--hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \
-    
--hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f
+packaging==24.1 \
+    
--hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \
+    
--hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124
     # via pytest
-pluggy==1.0.0 \
-    
--hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \
-    
--hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3
+pluggy==1.5.0 \
+    
--hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \
+    
--hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669
     # via pytest
-pycodestyle==2.10.0 \
-    
--hash=sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053 \
-    
--hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610
+pycodestyle==2.11.1 \
+    
--hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \
+    
--hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67
     # via flake8
-pyflakes==3.0.1 \
-    
--hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf \
-    
--hash=sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd
+pyflakes==3.2.0 \
+    
--hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \
+    
--hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a
     # via flake8
-pytest==7.3.2 \
-    
--hash=sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295 \
-    
--hash=sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b
+pytest==8.2.2 \
+    
--hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \
+    
--hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977
     # via
     #   -r requirements.in
     #   pytest-flake8-path
     #   pytest-randomly
-pytest-flake8-path==1.4.0 \
-    
--hash=sha256:b1c21f599158c90b68a16d301d1ffa19d25c297ef22f0ca4560160065a852e8b \
-    
--hash=sha256:c873d169e4ea5ab889413212bc33eb13d653c0e7f6c630fce6dc982076a228b7
+pytest-flake8-path==1.5.0 \
+    
--hash=sha256:2c144a3127995d34e82df397350dbef7780c9920c5b7e9ebc81f63299011381e \
+    
--hash=sha256:8766879344883e67762fc3f4f8f0d624a0d143de71f6488788599b3583e279a9
     # via -r requirements.in
-pytest-randomly==3.12.0 \
-    
--hash=sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2 \
-    
--hash=sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd
+pytest-randomly==3.15.0 \
+    
--hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \
+    
--hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047
     # via -r requirements.in
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/requirements/py38.txt 
new/flake8-comprehensions-3.15.0/requirements/py38.txt
--- old/flake8-comprehensions-3.14.0/requirements/py38.txt      2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/requirements/py38.txt      2024-06-30 
00:29:44.000000000 +0200
@@ -1,20 +1,16 @@
-#
-# This file is autogenerated by pip-compile with Python 3.8
-# by the following command:
-#
-#    requirements/compile.py
-#
-exceptiongroup==1.1.1 \
-    
--hash=sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e \
-    
--hash=sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785
+# This file was autogenerated by uv via the following command:
+#    uv pip compile --generate-hashes requirements.in --python 3.8 
--output-file py38.txt
+exceptiongroup==1.2.1 \
+    
--hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \
+    
--hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16
     # via pytest
-flake8==6.0.0 \
-    
--hash=sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7 \
-    
--hash=sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181
+flake8==7.0.0 \
+    
--hash=sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132 \
+    
--hash=sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3
     # via pytest-flake8-path
-importlib-metadata==6.6.0 \
-    
--hash=sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed \
-    
--hash=sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705
+importlib-metadata==7.1.0 \
+    
--hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \
+    
--hash=sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2
     # via pytest-randomly
 iniconfig==2.0.0 \
     
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
@@ -24,42 +20,42 @@
     
--hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \
     
--hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e
     # via flake8
-packaging==23.1 \
-    
--hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \
-    
--hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f
+packaging==24.1 \
+    
--hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \
+    
--hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124
     # via pytest
-pluggy==1.0.0 \
-    
--hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \
-    
--hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3
+pluggy==1.5.0 \
+    
--hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \
+    
--hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669
     # via pytest
-pycodestyle==2.10.0 \
-    
--hash=sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053 \
-    
--hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610
+pycodestyle==2.11.1 \
+    
--hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \
+    
--hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67
     # via flake8
-pyflakes==3.0.1 \
-    
--hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf \
-    
--hash=sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd
+pyflakes==3.2.0 \
+    
--hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \
+    
--hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a
     # via flake8
-pytest==7.3.2 \
-    
--hash=sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295 \
-    
--hash=sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b
+pytest==8.2.2 \
+    
--hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \
+    
--hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977
     # via
     #   -r requirements.in
     #   pytest-flake8-path
     #   pytest-randomly
-pytest-flake8-path==1.4.0 \
-    
--hash=sha256:b1c21f599158c90b68a16d301d1ffa19d25c297ef22f0ca4560160065a852e8b \
-    
--hash=sha256:c873d169e4ea5ab889413212bc33eb13d653c0e7f6c630fce6dc982076a228b7
+pytest-flake8-path==1.5.0 \
+    
--hash=sha256:2c144a3127995d34e82df397350dbef7780c9920c5b7e9ebc81f63299011381e \
+    
--hash=sha256:8766879344883e67762fc3f4f8f0d624a0d143de71f6488788599b3583e279a9
     # via -r requirements.in
-pytest-randomly==3.12.0 \
-    
--hash=sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2 \
-    
--hash=sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd
+pytest-randomly==3.15.0 \
+    
--hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \
+    
--hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047
     # via -r requirements.in
 tomli==2.0.1 \
     
--hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
     
--hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f
     # via pytest
-zipp==3.15.0 \
-    
--hash=sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b \
-    
--hash=sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556
+zipp==3.19.2 \
+    
--hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \
+    
--hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c
     # via importlib-metadata
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/requirements/py39.txt 
new/flake8-comprehensions-3.15.0/requirements/py39.txt
--- old/flake8-comprehensions-3.14.0/requirements/py39.txt      2023-07-10 
14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/requirements/py39.txt      2024-06-30 
00:29:44.000000000 +0200
@@ -1,20 +1,16 @@
-#
-# This file is autogenerated by pip-compile with Python 3.9
-# by the following command:
-#
-#    requirements/compile.py
-#
-exceptiongroup==1.1.1 \
-    
--hash=sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e \
-    
--hash=sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785
+# This file was autogenerated by uv via the following command:
+#    uv pip compile --generate-hashes requirements.in --python 3.9 
--output-file py39.txt
+exceptiongroup==1.2.1 \
+    
--hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \
+    
--hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16
     # via pytest
-flake8==6.0.0 \
-    
--hash=sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7 \
-    
--hash=sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181
+flake8==7.0.0 \
+    
--hash=sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132 \
+    
--hash=sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3
     # via pytest-flake8-path
-importlib-metadata==6.6.0 \
-    
--hash=sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed \
-    
--hash=sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705
+importlib-metadata==7.1.0 \
+    
--hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \
+    
--hash=sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2
     # via pytest-randomly
 iniconfig==2.0.0 \
     
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
@@ -24,42 +20,42 @@
     
--hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \
     
--hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e
     # via flake8
-packaging==23.1 \
-    
--hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \
-    
--hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f
+packaging==24.1 \
+    
--hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \
+    
--hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124
     # via pytest
-pluggy==1.0.0 \
-    
--hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \
-    
--hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3
+pluggy==1.5.0 \
+    
--hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \
+    
--hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669
     # via pytest
-pycodestyle==2.10.0 \
-    
--hash=sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053 \
-    
--hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610
+pycodestyle==2.11.1 \
+    
--hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \
+    
--hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67
     # via flake8
-pyflakes==3.0.1 \
-    
--hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf \
-    
--hash=sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd
+pyflakes==3.2.0 \
+    
--hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \
+    
--hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a
     # via flake8
-pytest==7.3.2 \
-    
--hash=sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295 \
-    
--hash=sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b
+pytest==8.2.2 \
+    
--hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \
+    
--hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977
     # via
     #   -r requirements.in
     #   pytest-flake8-path
     #   pytest-randomly
-pytest-flake8-path==1.4.0 \
-    
--hash=sha256:b1c21f599158c90b68a16d301d1ffa19d25c297ef22f0ca4560160065a852e8b \
-    
--hash=sha256:c873d169e4ea5ab889413212bc33eb13d653c0e7f6c630fce6dc982076a228b7
+pytest-flake8-path==1.5.0 \
+    
--hash=sha256:2c144a3127995d34e82df397350dbef7780c9920c5b7e9ebc81f63299011381e \
+    
--hash=sha256:8766879344883e67762fc3f4f8f0d624a0d143de71f6488788599b3583e279a9
     # via -r requirements.in
-pytest-randomly==3.12.0 \
-    
--hash=sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2 \
-    
--hash=sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd
+pytest-randomly==3.15.0 \
+    
--hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \
+    
--hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047
     # via -r requirements.in
 tomli==2.0.1 \
     
--hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
     
--hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f
     # via pytest
-zipp==3.15.0 \
-    
--hash=sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b \
-    
--hash=sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556
+zipp==3.19.2 \
+    
--hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \
+    
--hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c
     # via importlib-metadata
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/flake8-comprehensions-3.14.0/requirements/requirements.in 
new/flake8-comprehensions-3.15.0/requirements/requirements.in
--- old/flake8-comprehensions-3.14.0/requirements/requirements.in       
2023-07-10 14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/requirements/requirements.in       
2024-06-30 00:29:44.000000000 +0200
@@ -1,4 +1,3 @@
-importlib-metadata ; python_version < "3.8"
 pytest
 pytest-flake8-path
 pytest-randomly
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/setup.cfg 
new/flake8-comprehensions-3.15.0/setup.cfg
--- old/flake8-comprehensions-3.14.0/setup.cfg  2023-07-10 14:46:03.000000000 
+0200
+++ new/flake8-comprehensions-3.15.0/setup.cfg  1970-01-01 01:00:00.000000000 
+0100
@@ -1,51 +0,0 @@
-[metadata]
-name = flake8_comprehensions
-version = 3.14.0
-description = A flake8 plugin to help you write better list/set/dict 
comprehensions.
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-url = https://github.com/adamchainz/flake8-comprehensions
-author = Adam Johnson
-author_email = [email protected]
-license = MIT
-license_files = LICENSE
-classifiers =
-    Development Status :: 5 - Production/Stable
-    Framework :: Flake8
-    Intended Audience :: Developers
-    License :: OSI Approved :: MIT License
-    Natural Language :: English
-    Programming Language :: Python :: 3
-    Programming Language :: Python :: 3 :: Only
-    Programming Language :: Python :: 3.8
-    Programming Language :: Python :: 3.9
-    Programming Language :: Python :: 3.10
-    Programming Language :: Python :: 3.11
-    Programming Language :: Python :: 3.12
-    Typing :: Typed
-keywords = flake8, comprehensions, list comprehension, set comprehension, dict 
comprehension
-project_urls =
-    Changelog = 
https://github.com/adamchainz/flake8-comprehensions/blob/main/CHANGELOG.rst
-    Mastodon = https://fosstodon.org/@adamchainz
-    Twitter = https://twitter.com/adamchainz
-
-[options]
-packages = find:
-install_requires =
-    flake8!=3.2.0,>=3.0
-python_requires = >=3.8
-include_package_data = True
-package_dir =
-    =src
-zip_safe = False
-
-[options.packages.find]
-where = src
-
-[options.entry_points]
-flake8.extension =
-    C4 = flake8_comprehensions:ComprehensionChecker
-
-[flake8]
-max-line-length = 88
-extend-ignore = E203
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/flake8-comprehensions-3.14.0/src/flake8_comprehensions/__init__.py 
new/flake8-comprehensions-3.15.0/src/flake8_comprehensions/__init__.py
--- old/flake8-comprehensions-3.14.0/src/flake8_comprehensions/__init__.py      
2023-07-10 14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/src/flake8_comprehensions/__init__.py      
2024-06-30 00:29:44.000000000 +0200
@@ -46,6 +46,9 @@
             "C419 Unnecessary list comprehension passed to {func}() prevents "
             + "short-circuiting - rewrite as a generator."
         ),
+        "C420": (
+            "C420 Unnecessary {type} comprehension - rewrite using 
dict.fromkeys()."
+        ),
     }
 
     def run(self) -> Generator[tuple[int, int, str, type[Any]], None, None]:
@@ -335,32 +338,47 @@
                     len(node.generators) == 1
                     and not node.generators[0].ifs
                     and not node.generators[0].is_async
-                    and (
-                        (
-                            isinstance(node, (ast.ListComp, ast.SetComp))
-                            and isinstance(node.elt, ast.Name)
-                            and isinstance(node.generators[0].target, ast.Name)
-                            and node.elt.id == node.generators[0].target.id
+                ):
+                    if (
+                        isinstance(node, (ast.ListComp, ast.SetComp))
+                        and isinstance(node.elt, ast.Name)
+                        and isinstance(node.generators[0].target, ast.Name)
+                        and node.elt.id == node.generators[0].target.id
+                    ) or (
+                        isinstance(node, ast.DictComp)
+                        and isinstance(node.key, ast.Name)
+                        and isinstance(node.value, ast.Name)
+                        and isinstance(node.generators[0].target, ast.Tuple)
+                        and len(node.generators[0].target.elts) == 2
+                        and isinstance(node.generators[0].target.elts[0], 
ast.Name)
+                        and node.generators[0].target.elts[0].id == node.key.id
+                        and isinstance(node.generators[0].target.elts[1], 
ast.Name)
+                        and node.generators[0].target.elts[1].id == 
node.value.id
+                    ):
+                        yield (
+                            node.lineno,
+                            node.col_offset,
+                            self.messages["C416"].format(
+                                type=comp_type[node.__class__]
+                            ),
+                            type(self),
                         )
-                        or (
-                            isinstance(node, ast.DictComp)
-                            and isinstance(node.key, ast.Name)
-                            and isinstance(node.value, ast.Name)
-                            and isinstance(node.generators[0].target, 
ast.Tuple)
-                            and len(node.generators[0].target.elts) == 2
-                            and isinstance(node.generators[0].target.elts[0], 
ast.Name)
-                            and node.generators[0].target.elts[0].id == 
node.key.id
-                            and isinstance(node.generators[0].target.elts[1], 
ast.Name)
-                            and node.generators[0].target.elts[1].id == 
node.value.id
+
+                    elif (
+                        isinstance(node, ast.DictComp)
+                        and isinstance(node.key, ast.Name)
+                        and isinstance(node.value, ast.Constant)
+                        and isinstance(node.generators[0].target, ast.Name)
+                        and node.key.id == node.generators[0].target.id
+                    ):
+                        yield (
+                            node.lineno,
+                            node.col_offset,
+                            self.messages["C420"].format(
+                                type=comp_type[node.__class__]
+                            ),
+                            type(self),
                         )
-                    )
-                ):
-                    yield (
-                        node.lineno,
-                        node.col_offset,
-                        
self.messages["C416"].format(type=comp_type[node.__class__]),
-                        type(self),
-                    )
 
 
 def has_star_args(call_node: ast.Call) -> bool:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/flake8-comprehensions-3.14.0/tests/test_flake8_comprehensions.py 
new/flake8-comprehensions-3.15.0/tests/test_flake8_comprehensions.py
--- old/flake8-comprehensions-3.14.0/tests/test_flake8_comprehensions.py        
2023-07-10 14:46:03.000000000 +0200
+++ new/flake8-comprehensions-3.15.0/tests/test_flake8_comprehensions.py        
2024-06-30 00:29:44.000000000 +0200
@@ -886,7 +886,7 @@
     "code",
     [
         "dict({}, a=1)",
-        "dict({x: 1 for x in range(1)}, a=1)",
+        "dict({x: [] for x in range(1)}, a=1)",
     ],
 )
 def test_C418_pass(code, flake8_path):
@@ -963,3 +963,58 @@
     (flake8_path / "example.py").write_text(dedent(code))
     result = flake8_path.run_flake8()
     assert result.out_lines == failures
+
+
[email protected](
+    "code",
+    [
+        "{elt: elt * 2 for elt in range(5)}",
+        "{elt: [] for elt in foo}",
+        "{elt: {1, 2, 3} for elt in ['a', 'b', 'c']}",
+        "{elt: some_func() for elt in ['a', 'b', 'c']}",
+        "{elt: SomeClass() for elt in ['a', 'b', 'c']}",
+    ],
+)
+def test_C420_pass(code, flake8_path):
+    (flake8_path / "example.py").write_text(dedent(code))
+    result = flake8_path.run_flake8()
+    assert result.out_lines == []
+
+
[email protected](
+    "code,failures",
+    [
+        (
+            "{elt: None for elt in range(5)}",
+            [
+                "./example.py:1:1: C420 Unnecessary dict comprehension - "
+                + "rewrite using dict.fromkeys()."
+            ],
+        ),
+        (
+            "{elt: 1 for elt in foo}",
+            [
+                "./example.py:1:1: C420 Unnecessary dict comprehension - "
+                + "rewrite using dict.fromkeys()."
+            ],
+        ),
+        (
+            "{elt: 'value' for elt in ['a', 'b', 'c']}",
+            [
+                "./example.py:1:1: C420 Unnecessary dict comprehension - "
+                + "rewrite using dict.fromkeys()."
+            ],
+        ),
+        (
+            "{elt: True for elt in some_func()}",
+            [
+                "./example.py:1:1: C420 Unnecessary dict comprehension - "
+                + "rewrite using dict.fromkeys()."
+            ],
+        ),
+    ],
+)
+def test_C420_fail(code, failures, flake8_path):
+    (flake8_path / "example.py").write_text(dedent(code))
+    result = flake8_path.run_flake8()
+    assert result.out_lines == failures
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/flake8-comprehensions-3.14.0/tox.ini 
new/flake8-comprehensions-3.15.0/tox.ini
--- old/flake8-comprehensions-3.14.0/tox.ini    2023-07-10 14:46:03.000000000 
+0200
+++ new/flake8-comprehensions-3.15.0/tox.ini    2024-06-30 00:29:44.000000000 
+0200
@@ -6,6 +6,7 @@
 
 [testenv]
 package = wheel
+wheel_build_env = .pkg
 deps =
     -r requirements/{envname}.txt
 set_env =
@@ -16,3 +17,7 @@
       -W error::DeprecationWarning \
       -W error::PendingDeprecationWarning \
       -m pytest {posargs:tests}
+
+[flake8]
+max-line-length = 88
+extend-ignore = E203,E501

Reply via email to