diff --git a/.flake8 b/.flake8 index 83d055938..51d7c7a65 100644 --- a/.flake8 +++ b/.flake8 @@ -1,8 +1,65 @@ +# https://flake8.pycqa.org/en/latest/user/configuration.html [flake8] max-line-length = 80 per-file-ignores = # E501: line too long - tests/test_git_superproject.py: E501 + tests/test_git_superproject.py: E501 IMR241, + # IMR241: When using the from syntax, only submodules are imported, not module elements. + # NB: Do not add any more here. + command.py: IMR241, + fetch.py: IMR241, + git_command.py: IMR241, + git_status.py: IMR241, + git_superproject.py: IMR241, + git_trace2_event_log.py: IMR241, + main.py: IMR241, + manifest_xml.py: IMR241, + project.py: IMR241, + repo_logging.py: IMR241, + subcmds/abandon.py: IMR241, + subcmds/branches.py: IMR241, + subcmds/checkout.py: IMR241, + subcmds/cherry_pick.py: IMR241, + subcmds/diffmanifests.py: IMR241, + subcmds/diff.py: IMR241, + subcmds/download.py: IMR241, + subcmds/forall.py: IMR241, + subcmds/gc.py: IMR241, + subcmds/grep.py: IMR241, + subcmds/help.py: IMR241, + subcmds/info.py: IMR241, + subcmds/init.py: IMR241, + subcmds/list.py: IMR241, + subcmds/manifest.py: IMR241, + subcmds/overview.py: IMR241, + subcmds/prune.py: IMR241, + subcmds/rebase.py: IMR241, + subcmds/selfupdate.py: IMR241, + subcmds/smartsync.py: IMR241, + subcmds/stage.py: IMR241, + subcmds/start.py: IMR241, + subcmds/status.py: IMR241, + subcmds/sync.py: IMR241, + subcmds/upload.py: IMR241, + subcmds/version.py: IMR241, + subcmds/wipe.py: IMR241, + tests/e2e/test_failures.py: IMR241, + tests/e2e/test_groups.py: IMR241, + tests/e2e/test_init_sync.py: IMR241, + tests/e2e/test_manifest_regressions.py: IMR241, + tests/e2e/test_partial_clone.py: IMR241, + tests/e2e/test_sync_modes.py: IMR241, + tests/e2e/test_workflows.py: IMR241, + tests/test_command.py: IMR241, + tests/test_editor.py: IMR241, + tests/test_error.py: IMR241, + tests/test_hooks.py: IMR241, + tests/test_main.py: IMR241, + tests/test_release_update_manpages.py: IMR241, + tests/test_repo_logging.py: IMR241, + tests/test_subcmds.py: IMR241, + tests/test_subcmds_rebase.py: IMR241, + tests/test_subcmds_sync.py: IMR241, extend-ignore = # E203: Whitespace before ':' # See https://github.com/PyCQA/pycodestyle/issues/373 @@ -15,3 +72,11 @@ exclude = .venv, venv, .tox, +# IMR241: When using the from syntax, only submodules are imported, not module elements. +# NB: Do not add more modules here without strong discussion. This is aligned +# with Google's Python style guide. +imr241_exclude = + collections.abc, + pathlib, + typing, + typing_extensions, diff --git a/run_tests b/run_tests index 3d4d42a1f..484ce884f 100755 --- a/run_tests +++ b/run_tests @@ -18,9 +18,10 @@ # dependencies = [ # 'pytest==8.3.4', # 'black==25.1.0', -# 'flake8==6.0.0', -# 'flake8-bugbear==24.12.12', -# 'flake8-comprehensions==3.16.0', +# 'flake8==7.4.1', +# 'flake8-bugbear==26.9.30', +# 'flake8-comprehensions==3.17.0', +# 'flake8-import-restrictions==2.1', # 'isort==5.10.1' # ] # /// diff --git a/run_tests.uv.lock b/run_tests.uv.lock index 97869fd87..24b306f7d 100644 --- a/run_tests.uv.lock +++ b/run_tests.uv.lock @@ -1,101 +1,78 @@ -attrs==24.2.0 \ - --hash=sha256:37c4653e51383dc1249dba15635d59011ca11714a8e61db8cd6dc73011e4b603 \ - --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 +attrs==25.4.0 ; python_full_version < '3.12' \ + --hash=sha256:3e2be3ccc931d6c0cda7d37122b992d6d4b905968a437da7843cff016e2c41e8 \ + --hash=sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373 # via flake8-bugbear -black==25.1.0 \ +black==25.1.0 ; python_full_version < '3.12' \ --hash=sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717 \ --hash=sha256:c9ed033e41998dd45d6f19bf9923e2444cb401185ccb26d1a2101a9049637c1f -click==8.0.3 \ - --hash=sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3 \ - --hash=sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3 \ - --hash=sha256:b0a0492d07c8e7e4a88ee153ca6553d357a0746792d6868bfca79dc1a344bb1b +click==8.4.1 ; python_full_version < '3.12' \ + --hash=sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2 # via black -colorama==0.4.6 ; sys_platform == 'win32' \ +colorama==0.4.6 ; python_full_version < '3.12' and sys_platform == 'win32' \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 \ --hash=sha256:8a5a9494346d7ae2d8f599e4661738007d2df56dbbf4ccbbf7a6a23679a3a302 # via # click # pytest -flake8==6.0.0 \ +flake8==6.0.0 ; python_full_version < '3.12' \ --hash=sha256:9b5bf0ebd06aff1601e38dfc4e91f9b99ba3cdf446e74ee25a9cbbe01aef81ee \ --hash=sha256:f34b5cb8bf908ff49e4673d3dbc557b2381a14132b637d53e9d3a59816f4b6ba # via # flake8-bugbear # flake8-comprehensions -flake8-bugbear==24.12.12 \ +flake8-bugbear==24.12.12 ; python_full_version < '3.12' \ --hash=sha256:1b6967436f65ca22a42e5373aaa6f2d87966ade9aa38d4baf2a1be550767545e -flake8-comprehensions==3.16.0 \ +flake8-comprehensions==3.16.0 ; python_full_version < '3.12' \ --hash=sha256:7c1eadc9d22e765f39857798febe7766b4d9c519793c6c149e3e13bf99693f70 -iniconfig==1.1.1 \ - --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \ - --hash=sha256:9d81514370059186276e9a1799e5a9752e4c060233c254d6954b53fad2ff8a5e +flake8-import-restrictions==2.1 ; python_full_version < '3.12' \ + --hash=sha256:77522e76b82a6ccb25820b1e195825a695094ceded23a18c1b5ce026c23e1071 +iniconfig==2.3.0 ; python_full_version < '3.12' \ + --hash=sha256:e6ae3625a739878eeb4baf25f17a0b4e9d985421e45b897d1332ed7478f822d9 \ + --hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 # via pytest -isort==5.10.1 \ +isort==5.10.1 ; python_full_version < '3.12' \ --hash=sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7 \ --hash=sha256:ec0da0d88470e89ade75bf1e2ea7b4349ec906f95c84aff08e4d41dea6864d25 -mccabe==0.7.0 \ +mccabe==0.7.0 ; python_full_version < '3.12' \ --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e \ --hash=sha256:b85abd0a321cdd357d0be34adbf49cf01453a857a23e94d44612ec6f159cb261 # via flake8 -mypy-extensions==0.4.3 \ - --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ - --hash=sha256:38cbac35a502c4f13b9d9b1d06258fa51e01da4f5828b171b4d1200d00378e7c +mypy-extensions==1.1.0 ; python_full_version < '3.12' \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:4ec363d206d93f233330fa7f08eefe9a382dd1e326112a94244f95ec2f22f10e # via black -packaging==23.0 \ - --hash=sha256:37cb5b4759d17ae6bad78ee3347f0ee1057452895fcd1bbff48fb12908ce00a1 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ - --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 +packaging==26.2 ; python_full_version < '3.12' \ + --hash=sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e # via # black # pytest -pathspec==0.9.0 \ - --hash=sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a \ - --hash=sha256:aaf90f4ad38a16bd3ebe0fa64da7f6ee01819c881120db68cc6440941a9adc08 +pathspec==1.0.4 ; python_full_version < '3.12' \ + --hash=sha256:eeaf9fc7cbc0a4492b666be276f38956baa67cd3faca745462db83d98f1cef87 \ + --hash=sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723 # via black -platformdirs==2.5.2 \ - --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ - --hash=sha256:e257a04b5d0528cb9836b766c8a16a85368e249cba7ae42888a403976ccd7d2d +platformdirs==4.9.2 ; python_full_version < '3.12' \ + --hash=sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd \ + --hash=sha256:ef245e78eb7a2ba57599bdb39c4ff323cfae3de356a47207b58bb29e7f479f46 # via black -pluggy==1.5.0 \ - --hash=sha256:40da5bf96b15e359e280fd760a80c11d7a8ea20c3c296c3f3e09f8be67cec10b \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +pluggy==1.6.0 ; python_full_version < '3.12' \ + --hash=sha256:88349c39e440567519b15b27a781bcd3430de6bae17c44c37e758795be96dc5a \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 # via pytest -py==1.11.0 \ - --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 \ - --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 -pycodestyle==2.10.0 \ +pycodestyle==2.10.0 ; python_full_version < '3.12' \ --hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610 \ --hash=sha256:aacf8d28ecea10fad31b2d14943a42d85d007f4d2fee8f212fc05751c8460647 # via flake8 -pyflakes==3.0.1 \ +pyflakes==3.0.1 ; python_full_version < '3.12' \ --hash=sha256:a968b8baa43926124b692c7e76279bc5fa8c6ef9a2281e4a2a475be69f954bdf \ --hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf # via flake8 -pyparsing==3.0.7 \ - --hash=sha256:943c220ca64e93940b74dd070152ed9ef1402bc3b28fd1f899843bee34e83708 \ - --hash=sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484 -pytest==8.3.4 \ +pytest==8.3.4 ; python_full_version < '3.12' \ --hash=sha256:00cba7845d2dccfe5403025a688d60ceae228b1ddaa866d2eb86b2edb6923e73 \ --hash=sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6 -toml==0.10.1 \ - --hash=sha256:4099063d9b50219bf09bfa693ab8dcd96ce585cee9fdadce5a48a08ee23b0646 \ - --hash=sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88 -tomli==2.0.1 \ - --hash=sha256:864f310e021d68415d6ba45b23e29808f99703b471d884267d6942eecdf8d6c5 \ - --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc -typing-extensions==4.3.0 \ - --hash=sha256:09126dab54422810a541e078c37e62024e7260a022d4f67c075a6707d9553649 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02