Code Monkey home page Code Monkey logo

ruff-pre-commit's People

Contributors

albertocerrone avatar charliermarsh avatar coderjoshdk avatar eerovaher avatar eggplants avatar flpm avatar fsouza avatar github-actions[bot] avatar hamdanal avatar henryiii avatar hugovk avatar jonathanplasse avatar konstin avatar mkniewallner avatar pmbarrett314 avatar sudosubin avatar tgross35 avatar whynothugo avatar zanieb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ruff-pre-commit's Issues

Support autohooks or create git hooks directly

The problem with pre-commit is that it does not support pyproject.toml and its author is unfortunately unwilling to even discuss the issue. I have tried to find an alternative that is configured from pyproject.toml and have found autohooks. It would be great if there were a ruff plugin for that. I've also raised it on that project's repo in this issue.

Failing that, since ruff supports both linting and autoformatting, removing the need for several other tools, could it create git hooks directly removing the need for another tool like pre-commit?

import sorting?

When I use this pyproject.toml config:

[tool.ruff]
select = [
    "I",  # isort formatting.
]

And this .pre-commit-config.yaml:

repos:
-   repo: https://github.com/charliermarsh/ruff-pre-commit
    rev: v0.1.13
    hooks:
    -   id: ruff
        types_or: [ python, pyi, jupyter ]
        args: [ --fix ]
    -   id: ruff-format
        types_or: [ python, pyi, jupyter ]

On code like this:

from typing import TypeVar, Generic

T = TypeVar("T")

class CameraOptimizerConfig(Generic[T]):
    pass

The ruff hook passes even though the imports aren't sorted:

$ pre-commit run --verbose
ruff.....................................................................Passed
- hook id: ruff
- duration: 0.07s
ruff-format..............................................................Failed
- hook id: ruff-format
- duration: 0.01s
- files were modified by this hook

But if I run ruff check --fix manually it does fix the imports:

$ ruff check nerfstudio/a.py --fix
Found 1 error (1 fixed, 0 remaining).

Am I missing some other configuration to get import sorting via the ruff pre-commit hook using args: [ --fix ]?

missing tag for v0.0.155

$ cat .pre-commit-config.yaml
repos:
  - repo: https://github.com/charliermarsh/ruff-pre-commit
    # as specified by https://github.com/charliermarsh/ruff#usage
    rev: v0.0.155
    hooks:
      - id: ruff


$ pre-commit install --install-hooks
pre-commit installed at .git/hooks/pre-commit
[INFO] Initializing environment for https://gitlab.com/bmares/check-json5.
[INFO] Initializing environment for https://github.com/charliermarsh/ruff-pre-commit.
An unexpected error has occurred: CalledProcessError: command: ('/usr/bin/git', 'checkout', 'v0.0.155')
return code: 1
expected return code: 0
stdout: (none)
stderr:
    error: pathspec 'v0.0.155' did not match any file(s) known to git

Autorelease on tag creation doesn't get triggered by other workflow

GitHub workflows do not trigger other workflows. As such, the creation of the tag in mirror.py does not trigger the release workflow. Manual creation and pushing of the tag, does trigger this workflow. As such, there are 2 fixes (but really only 1). Where we keep the release.yml file and trigger it manually through the main.yml workflow. Or just simplify things by having it all in a single file. The change would end up looking like:

      - name: Check for unpushed commits
        id: check_unpushed
        run: |
          UNPUSHED_COMMITS=$(git log origin/main..HEAD)
          if [ -z "$UNPUSHED_COMMITS" ]; then
            echo "No unpushed commits found."
            echo "changes_exist=false" >> $GITHUB_ENV
          else
            echo "Unpushed commits found."
            echo "changes_exist=true" >> $GITHUB_ENV
          fi

      - run: |
          git push origin HEAD:refs/heads/main
          git push origin HEAD:refs/heads/main --tags
        if: env.changes_exist == 'true'

      - run: |
          TAG_NAME=$(git describe --tags $(git rev-list --tags --max-count=1))
          echo $TAG_NAME
          gh release create "$TAG_NAME" \
            --title "$TAG_NAME" \
            --notes "See: https://github.com/astral-sh/uv/releases/tag/$TAG_NAME" \
            --latest
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        if: env.changes_exist == 'true'

There are other subtle things being changed here too.

For one, gh release create is now being passed the --latest flag. While this flag is active by default, this helps make that more explicit and clear.

Another thing, is the change to how the tag name is picked up. Before was a little more brittle since there was a possibility for:

TAG_NAME=${GITHUB_REF#refs/tags/}

to return something besides a tag name. In normal operation, this is correct. But as an example, if someone would fork this repo, that line would cause a failed run.

Please let me know if these changes make sense or if you have any notes. If this seems reasonable, I will create a PR for the change.

Could you tag latest version also with `latest` so we get automatic updates?

Currently, the docs suggest you to specify the rev in your precommit file

- repo: https://github.com/charliermarsh/ruff-pre-commit
  rev: 'v0.0.209'
  hooks:
    - id: ruff
      args: ["--force-exclude"]

My request would be to also be able to do

repo: https://github.com/charliermarsh/ruff-pre-commit
-   rev: 'v0.0.209'
+   rev: 'latest'
     hooks:
         - id: ruff
           args: ["--force-exclude"]

to always run the latest release.

Perhaps it's currently possible, but i didn't find it on the docs

Thank you for your awesome work! I have refactored our whole codebase with it in a few PRs, autofix is ๐Ÿš€

Question: Proper Way to Run ruff-pre-commit on Submodules in a Monorepo.

Hi,

I'm working on a monorepo that follows PEP 420 Implicit Namespace Packages.

We want to introduce ruff gradually by enabling ruff-pre-commit on select submodules only in order to lint docstrings.

In other words there are multiple independent but collaborating project submodule repositories that start from one root directory.

Would the proper way to selectively enable ruff on only select submodules be to add cascading pyproject.toml files to the submodules that I want linted as described here?

https://beta.ruff.rs/docs/configuration/#pyprojecttoml-discovery

And then ruff should pick those files up and only lint the respective submodules.

Does that sound like a good approach to take?

Any advice much appreciated.

Question: Proper way of excluding some rules

Hi,
I am trying to disable line-lengths check in pre-commit with ruff.
I tried

- repo: https://github.com/charliermarsh/ruff-pre-commit
  # Ruff version.
  rev: 'v0.0.245'
  hooks:
    - id: ruff
      args: [--fix, --exit-non-zero-on-fix,--ignore 'E501']

but it produces an error:

ruff.....................................................................Failed
- hook id: ruff
- exit code: 2

error: unexpected argument '--ignore E501' found

  note: argument '--ignore' exists

I tried E501 both with and without extra quotes, result is the same.
I also tried '--line-length 100' - result is the same.

Can you please advise what is the proper way to include extra params in ruff pre-commit?

--check option for ruff-format

Such option is available in ruff format, but inside precommit config gives no effect.

  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.3.0
    hooks:
      - id: ruff-format
    args: ['--check']

now results as reformatting instead of just checking

Possibly it is a repeat of #61, but in black there is ability to just check without formating

Can ruff-pre-commit be configured to replace pre-commit-hooks like trailing-whitespace, end-of-file-fixer and check-ast?

I am using some pre-commit-hooks along with ruff. Can ruff already do what those pre-commit hooks (trailing-whitespace, end-of-file-fixer and check-ast) do? If so, how do I configure the ruff pre-commit to replace any or all of those hooks?

- repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.5.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-ast
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.3.2
    hooks:
      # Run the linter.
      - id: ruff
        args: [--config, .config/ruff.toml, --fix]
      # Run the formatter.
      - id: ruff-format
        args: [--config, .config/ruff.toml]

types_or needs expanding?

I've noticed in 0.276 there's now preliminary support for Jupyter notebooks, and recently pyproject.toml was added too. Does that mean the current types_or should add toml and notebooks too?

Feature Request: predefined hooks for common uses.

Just switching over to ruff from [other tools] and it has been a great experience!

A minor request would be to build more pre-commit hooks for common invocations (rather than passing arguments). This helps keep the .pre-commit-config.yaml tidy as well as gives the authors the ability to adjust arguments as needed.

Specifically, I was hoping for the following hooks:

- id: ruff-fix-all
- id: ruff-check

Of course, keeping the default ruff hook for any other custom hooks is great, too.

I'd be happy to submit a PR if this seems useful to the project. Thanks again!

Failed to create cache file

Getting below error with 0.1.12 but works fine with 0.1.11. If I create .ruff_cache/0.1.12 then it proceeds without error.

pre-commit 3.6.0
ruff 0.1.13
Amazon Linux 2
Python 3.11

Error running pre-commit run -a

ruff.....................................................................Failed
- hook id: ruff
- exit code: 2

ruff failed
  Cause: Failed to create cache file '/home/me/src/repo/.ruff_cache/0.1.12/6018100345838758466'
  Cause: No such file or directory (os error 2)

My hook:

  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.1.12
    hooks:
      - id: ruff
        args:
          - --line-length
          - "140"
          - --ignore
          - "E501"

Is it better to run format before lint?

There are various ruff lint rules that are automatically fixed by ruff format, such as extra whitespace (W291) or semicolons (E703). Hence, is it better to recommend running the formatting hook before the linting hook, when using both?

re-staging after formatting

It seems that pre-commit doesn't re-stage files that are changed, making auto-fixes and formatting in pre-commit, while not useless, a lot less ergonomic. Could this be handled on the hook's side?

Automatically trigger mirror job from upstream

It would be helpful if the mirror workflow triggered automatically when a new version was pushed to pypi rather than every 4 hours. Specifically I'm running ruff itself via a github action, but also locally via pre-commit, so if I try to push during those 4 hours it can break my workflows.

This github community thread looks like a solution.

Consider not using --force-exclude by default

Contrary to #19, making --force-exclude an implicit default can cause confusing behaviors. As some CI environments might run under paths that are excluded by default or excluded by custom configuration.

For example, the Bitbucket pipeline runs under /opt/atlassian/pipelines/agent/build, which is excluded by default (build), so running pre-commit run --all-files takes no effect at all, but it totally works as expected under local repo, really confusing!

Take me quite some time to figure out why our CI is not working, apparently, others have the same problem.

I suggest making the --force-exclude an opt-in, or at least add a reminder in README for setting --no-force-exclude.

Request: automatic update upon new `ruff` release

v0.0.268 was released about 30-mins ago. I went to pre-commit autoupdate and getting:

[https://github.com/charliermarsh/ruff-pre-commit] already up to date!

It would be cool if a ruff release would automatically kick off an update here.

Seems like #17 was about this, but it appears not to have been done

How to use flake8-print in pre-commit-config.yaml?

flake8-print seems to have no effect when I try to use it (ruff works perfectly). My configuration is:

- repo: https://github.com/charliermarsh/ruff-pre-commit
  rev: v0.0.261
  hooks:
    - id: ruff
      args: [--fix]
      additional_dependencies: [flake8-print]

How can I make it work? Additionality, if I change the additional_dependencies: [flake8-print] to something else -> additional_dependencies: [flake5-print], it gives an error ERROR: No matching distribution found for flake5-print therefore I understand that it installs but not using it.

I also cannot see flake8-print if I run ruff config.

Consider always using --force-exclude

If it's true that running in pre-commit always needs --force-exclude to work properly, then you can set it as part of the entry, such as:

entry: ruff --force-exclude

This will then always include this option when running, regardless of what args is set to. Assume ruff is fine if this is passed twice (for backward compatibly with existing user's args:), then this is the recommended way to do this (for an example, see https://github.com/pre-commit/mirrors-clang-format/blob/ea59a72ffc9a1ce6b79b02a8076d031aa7ea7805/.pre-commit-hooks.yaml#L4 ).

If it's not the case that this (or any other flag) is always required for pre-commit, then nevermind. :)

Ruff configuration from pyproject.toml is ignored

Hi,

I'm trying to use the pre-commit hook for Ruff, but it ignores my settings from the pyproject.toml. I want Ruff to ignore the line-length but if I commit a file with lines that exceed this limit it is complaining about it. If I use a ruff.toml to configure Ruff it works as expected.

I use version 0.0.292.

My settings in .pre-commit-config.yaml:

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: end-of-file-fixer
    -   id: check-added-large-files
-   repo: https://github.com/charliermarsh/ruff-pre-commit
    rev: v0.0.292
    hooks:
    -   id: ruff

Ruff configuration part in my pyproject.toml (same is used in the ruff.toml)

[tool.ruff]
select = ["E"]

# Never enforce `E501` (line length violations).
ignore = ["E501"]

Should we add `--check` for `ruff format`?

According to the exit codes, without --check, the exit code of ruff format will be

0 if Ruff terminates successfully, regardless of whether any files were formatted.

So, I assume to have the pre-commit run as expected, we should add --check flag, right?

How to limit checks to certain directories?

How to limit checks to certain directories?

I tried:

-   repo: https://github.com/astral-sh/ruff-pre-commit.git
    rev: v0.3.3
    hooks:
      - id: ruff
        args: [ "--fix", "src", "tests" ]
      - id: ruff-format

but it still checks files in my docs folder. So apparently it is not restricted to src and tests as expected.

--fix should be included by default

Most pre-commit hooks apply any changes that need to be made. The task of actually adding (e.g.: git add) is left to the user.

It would be a good fit for this hook to do the same; since after running the hooks one can check the changes and act upon them (rather than requiring that one re-runs ruff manually).

How to configure include for pre-commit

When I use ruff with include from my shell, its work and ignore all directory and only apply ruff to the include directory.

 ruff check --config 'include = ["core/others/"]'

But when I'm going to use include with pre-commit its not working

-   repo: https://github.com/astral-sh/ruff-pre-commit
    # Ruff version.
    rev: 'v0.2.2'
    hooks:
      - id: ruff
        include: "[core/drones/api_extern/**/*.py]"

But exclude works -

-   repo: https://github.com/astral-sh/ruff-pre-commit
    # Ruff version.
    rev: 'v0.2.2'
    hooks:
      - id: ruff
        exclude: "(core/others/)"

I'm using a ruff.toml also where exclude=[...] basing excluding list.

Hook ID comment from pre-commit maintainer

I suggested adding ruff's hook to the official supported hooks list, the maintainer mentioned that hook ID should be something identifying to the project (like ruff). I think this is to avoid conflicts when specifying which hook ID to run (pre-commit run -a lint would potentially conflict with other linters otherwise)

What are your thoughts here @charliermarsh? It would probably be easy enough to add an identical ruff hook, and update the lint description to say that option is deprecated.

Link to discussion: pre-commit/pre-commit.com#737

Consider using `require_serial: true`

Ruff already runs on multiple threads, so there is no performance benefit on having pre-commit spawn multiple instances of Ruff.

On top of that the output becomes less readable:

With require_serial: false

$ pre-commit run -a ruff
ruff.....................................................................Failed
- hook id: ruff
- exit code: 1

Found 4 error(s).
misc/gen_types.py:5:1: I001 Import block is un-sorted or un-formatted
misc/license_headers.py:5:1: I001 Import block is un-sorted or un-formatted
packaging/macOS/freeze_program.py:3:1: I001 Import block is un-sorted or un-formatted
packaging/windows/make_installer.py:3:1: I001 Import block is un-sorted or un-formatted
4 potentially fixable with the --fix option.
Found 4 error(s).
.github/scripts/sink_cache.py:7:1: I001 Import block is un-sorted or un-formatted
misc/generate_pyqt.py:5:1: I001 Import block is un-sorted or un-formatted
packaging/macOS/launch_script.py:3:1: I001 Import block is un-sorted or un-formatted
packaging/windows/launch_script.py:3:1: I001 Import block is un-sorted or un-formatted
4 potentially fixable with the --fix option.
Found 2 error(s).
.github/scripts/check_commit_signature.py:10:1: I001 Import block is un-sorted or un-formatted
misc/format_material.py:5:1: I001 Import block is un-sorted or un-formatted
2 potentially fixable with the --fix option.
Found 6 error(s).
.github/scripts/check_newsfragments.py:7:1: I001 Import block is un-sorted or un-formatted
build.py:3:1: I001 Import block is un-sorted or un-formatted
misc/po_to_csv.py:5:1: I001 Import block is un-sorted or un-formatted
misc/releaser.py:31:1: I001 Import block is un-sorted or un-formatted
packaging/wheel/wheel_it.py:3:1: I001 Import block is un-sorted or un-formatted
packaging/windows/freeze_program.py:3:1: I001 Import block is un-sorted or un-formatted
6 potentially fixable with the --fix option.

With require_serial: true

 pre-commit run -a ruff
ruff.....................................................................Failed
- hook id: ruff
- exit code: 1

Found 16 error(s).
.github/scripts/check_commit_signature.py:10:1: I001 Import block is un-sorted or un-formatted
.github/scripts/check_newsfragments.py:7:1: I001 Import block is un-sorted or un-formatted
.github/scripts/sink_cache.py:7:1: I001 Import block is un-sorted or un-formatted
build.py:3:1: I001 Import block is un-sorted or un-formatted
misc/format_material.py:5:1: I001 Import block is un-sorted or un-formatted
misc/gen_types.py:5:1: I001 Import block is un-sorted or un-formatted
misc/generate_pyqt.py:5:1: I001 Import block is un-sorted or un-formatted
misc/license_headers.py:5:1: I001 Import block is un-sorted or un-formatted
misc/po_to_csv.py:5:1: I001 Import block is un-sorted or un-formatted
misc/releaser.py:31:1: I001 Import block is un-sorted or un-formatted
packaging/macOS/freeze_program.py:3:1: I001 Import block is un-sorted or un-formatted
packaging/macOS/launch_script.py:3:1: I001 Import block is un-sorted or un-formatted
packaging/wheel/wheel_it.py:3:1: I001 Import block is un-sorted or un-formatted
packaging/windows/freeze_program.py:3:1: I001 Import block is un-sorted or un-formatted
packaging/windows/launch_script.py:3:1: I001 Import block is un-sorted or un-formatted
packaging/windows/make_installer.py:3:1: I001 Import block is un-sorted or un-formatted
16 potentially fixable with the --fix option.

Nix: No such file or directory: '~/.cache/pre-commit/...python3.10/bin/ruff'

I'm working on a project which uses ruff via pre-commit. I've simplified the .pre-commit-config.yaml to the following:

---
repos:
  - repo: meta
    hooks:
      - id: check-hooks-apply
      - id: check-useless-excludes

  - repo: https://github.com/charliermarsh/ruff-pre-commit
    rev: 'v0.0.229'
    hooks:
      - id: ruff

When I run pre-commit run --all-files I get the following:

 โฏ pre-commit run --all-files
[INFO] Initializing environment for https://github.com/charliermarsh/ruff-pre-commit.
[INFO] Installing environment for https://github.com/charliermarsh/ruff-pre-commit.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
Check hooks apply to the repository......................................Passed
Check for useless excludes...............................................Passed
ruff.....................................................................Failed
- hook id: ruff
- exit code: 1

[Errno 2] No such file or directory: '/home/matt/.cache/pre-commit/repo2mikycmg/py_env-python3.10/bin/ruff'

Which is weird, because that file definitely exists.

This is on my Linux machine (NixOS 23.05). I've been working around it by just doing the linting on macOS, but that's kind of a pain. Any idea what I can do to fix this?

Format Python code in documentation files

I am wondering if the format check pre-commit hook can deal with Python code blocks in Markdown, reStructuredText, and LaTex files, like the blacken-docs hook, and, if not, whether you are planning to add such a capability at some point.

pre-commit run -a ruff fails on python 3.12 due to pkgutil.ImpImporter usage

I'm trying to run pre-commit run -a ruff from within a python:3.12-alpine docker container but I am running into some issues with pkgutil. This works:

ruff check .

This doesn't:

pre-commit run -a ruff

This also fails, in the same way:

pre-commit install --install-hooks

See error information, below, for more details.

pre-commit configuration

repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.3.1
    hooks:
      - id: ruff
        args: [--fix, --exit-non-zero-on-fix]

version information

pre-commit version: 3.7.0
git --version: git version 2.43.0
sys.version:
    3.12.3 (main, Apr 10 2024, 03:09:48) [GCC 13.2.1 20231014]
sys.executable: /usr/local/bin/python
os.name: posix
sys.platform: linux

error information

An unexpected error has occurred: CalledProcessError: command: ('/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/bin/python', '-mpip', 'install', '.')
return code: 2
stdout: (none)
stderr:
    ERROR: Exception:
    Traceback (most recent call last):
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/cli/base_command.py", line 160, in exc_logging_wrapper
        status = run_func(*args)
                 ^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/cli/req_command.py", line 247, in wrapper
        return func(self, options, args)
               ^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/commands/install.py", line 326, in run
        session = self.get_default_session(options)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/cli/req_command.py", line 98, in get_default_session
        self._session = self.enter_context(self._build_session(options))
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/cli/req_command.py", line 125, in _build_session
        session = PipSession(
                  ^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/network/session.py", line 343, in __init__
        self.headers["User-Agent"] = user_agent()
                                     ^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/network/session.py", line 175, in user_agent
        setuptools_dist = get_default_environment().get_distribution("setuptools")
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 188, in get_distribution
        return next(matches, None)
               ^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 183, in <genexpr>
        matches = (
                  ^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/base.py", line 612, in iter_all_distributions
        for dist in self._iter_distributions():
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 176, in _iter_distributions
        for dist in finder.find_eggs(location):
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 144, in find_eggs
        yield from self._find_eggs_in_dir(location)
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 111, in _find_eggs_in_dir
        from pip._vendor.pkg_resources import find_distributions
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2164, in <module>
        register_finder(pkgutil.ImpImporter, find_on_path)
                        ^^^^^^^^^^^^^^^^^^^
    AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/pre_commit/error_handler.py", line 73, in error_handler
    yield
  File "/usr/local/lib/python3.12/site-packages/pre_commit/main.py", line 417, in main
    return run(args.config, store, args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pre_commit/commands/run.py", line 442, in run
    install_hook_envs(to_install, store)
  File "/usr/local/lib/python3.12/site-packages/pre_commit/repository.py", line 238, in install_hook_envs
    _hook_install(hook)
  File "/usr/local/lib/python3.12/site-packages/pre_commit/repository.py", line 94, in _hook_install
    lang.install_environment(
  File "/usr/local/lib/python3.12/site-packages/pre_commit/languages/python.py", line 214, in install_environment
    lang_base.setup_cmd(prefix, install_cmd)
  File "/usr/local/lib/python3.12/site-packages/pre_commit/lang_base.py", line 86, in setup_cmd
    cmd_output_b(*cmd, cwd=prefix.prefix_dir, **kwargs)
  File "/usr/local/lib/python3.12/site-packages/pre_commit/util.py", line 111, in cmd_output_b
    raise CalledProcessError(returncode, cmd, stdout_b, stderr_b)
pre_commit.util.CalledProcessError: command: ('/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/bin/python', '-mpip', 'install', '.')
return code: 2
stdout: (none)
stderr:
    ERROR: Exception:
    Traceback (most recent call last):
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/cli/base_command.py", line 160, in exc_logging_wrapper
        status = run_func(*args)
                 ^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/cli/req_command.py", line 247, in wrapper
        return func(self, options, args)
               ^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/commands/install.py", line 326, in run
        session = self.get_default_session(options)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/cli/req_command.py", line 98, in get_default_session
        self._session = self.enter_context(self._build_session(options))
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/cli/req_command.py", line 125, in _build_session
        session = PipSession(
                  ^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/network/session.py", line 343, in __init__
        self.headers["User-Agent"] = user_agent()
                                     ^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/network/session.py", line 175, in user_agent
        setuptools_dist = get_default_environment().get_distribution("setuptools")
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 188, in get_distribution
        return next(matches, None)
               ^^^^^^^^^^^^^^^^^^^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 183, in <genexpr>
        matches = (
                  ^
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/base.py", line 612, in iter_all_distributions
        for dist in self._iter_distributions():
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 176, in _iter_distributions
        for dist in finder.find_eggs(location):
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 144, in find_eggs
        yield from self._find_eggs_in_dir(location)
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py", line 111, in _find_eggs_in_dir
        from pip._vendor.pkg_resources import find_distributions
      File "/root/.cache/pre-commit/reporfpz3vi4/py_env-python3.12/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2164, in <module>
        register_finder(pkgutil.ImpImporter, find_on_path)
                        ^^^^^^^^^^^^^^^^^^^
    AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?

additional information

# python -V
Python 3.12.3

# pre-commit -V
pre-commit 3.7.0

# npm --version
10.2.5

# node --version
v21.7.2

# env
HOSTNAME=d4db66811e34
PYTHON_VERSION=3.12.3
PWD=/code
HOME=/root
LANG=C.UTF-8
GPG_KEY=OMIT
TERM=xterm
SHLVL=1
PYTHON_PIP_VERSION=24.0
PYTHON_GET_PIP_SHA256=OMIT
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/OMIT/public/get-pip.py
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

# pip freeze
aiohttp @ file:///wheels/aiohttp-3.9.2-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=1956e3ac376b1711c1533266dec4efd485f821d84c13ce1217d53e42c9e65f08
aiosignal @ file:///wheels/aiosignal-1.3.1-py3-none-any.whl#sha256=f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17
aniso8601 @ file:///wheels/aniso8601-7.0.0-py2.py3-none-any.whl#sha256=d10a4bf949f619f719b227ef5386e31f49a2b6d453004b21f02661ccc8670c7b
annotated-types @ file:///wheels/annotated_types-0.6.0-py3-none-any.whl#sha256=0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43
anyio @ file:///wheels/anyio-4.2.0-py3-none-any.whl#sha256=745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee
asgiref @ file:///wheels/asgiref-3.6.0-py3-none-any.whl#sha256=71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac
astroid @ file:///wheels/astroid-2.11.7-py3-none-any.whl#sha256=86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b
attrs @ file:///wheels/attrs-22.2.0-py3-none-any.whl#sha256=29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836
awslambdaric @ file:///wheels/awslambdaric-2.0.7-cp312-cp312-linux_aarch64.whl#sha256=bb48257f72bce96ab13bf11781b06a8d48090b2837e016afcf9ece7a731c2f43
boto3 @ file:///wheels/boto3-1.28.85-py3-none-any.whl#sha256=1fb7e7ba32a6701990168eb7a08e1fb624ae48130784dfab25904ed47deabb31
botocore @ file:///wheels/botocore-1.31.85-py3-none-any.whl#sha256=b8f35d65f2b45af50c36fc25cc1844d6bd61d38d2148b2ef133b8f10e198555d
bytecode @ file:///wheels/bytecode-0.15.1-py3-none-any.whl#sha256=0a1dc340cac823cff605609b8b214f7f9bf80418c6b9e0fc8c6db1793c27137d
cachetools @ file:///wheels/cachetools-5.0.0-py3-none-any.whl#sha256=8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4
cattrs @ file:///wheels/cattrs-22.2.0-py3-none-any.whl#sha256=bc12b1f0d000b9f9bee83335887d532a1d3e99a833d1bf0882151c97d3e68c21
Cerberus @ file:///wheels/Cerberus-1.3.4-py3-none-any.whl#sha256=0ec690c62472c6ffc37196c9cdc0c3525406f6423ded091a4253e9c4b5bbbdf1
certifi @ file:///wheels/certifi-2023.7.22-py3-none-any.whl#sha256=92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9
cffi @ file:///wheels/cffi-1.15.1-cp312-cp312-linux_aarch64.whl#sha256=9fc6b146cbe466dcc9e1bf2e38c5659f335b6c6387de84dafcc74c4487887e6f
cfgv @ file:///wheels/cfgv-3.3.1-py2.py3-none-any.whl#sha256=c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426
charset-normalizer @ file:///wheels/charset_normalizer-2.1.1-py3-none-any.whl#sha256=83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f
click @ file:///wheels/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28
codeguru-profiler-agent @ file:///wheels/codeguru_profiler_agent-1.2.4-py3-none-any.whl#sha256=7325777f83acd0e5be342eba7acc5bc372a4d992eb3e22218e3f42f137bebe95
coverage @ file:///wheels/coverage-7.0.5-cp312-cp312-linux_aarch64.whl#sha256=4fc2f4debd9a3aeb4135916d5b55c83e65670ff7cfb94cf84e13cce632310b7b
cramjam @ file:///wheels/cramjam-2.8.3-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=afa065bab70e27565695441f69f493af3d379b8723030f2c3d2547d2e312a4be
croniter @ file:///wheels/croniter-1.3.5-py2.py3-none-any.whl#sha256=4f72faca42c00beb6e30907f1315145f43dfbe5ec0ad4ada24b4c0d57b86a33a
cryptography @ file:///wheels/cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl#sha256=3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc
dataclasses-json @ file:///wheels/dataclasses_json-0.6.1-py3-none-any.whl#sha256=1bd8418a61fe3d588bb0079214d7fb71d44937da40742b787256fd53b26b6c80
datadog @ file:///wheels/datadog-0.47.0-py2.py3-none-any.whl#sha256=a45ec997ab554208837e8c44d81d0e1456539dc14da5743687250e028bc809b7
datadog-lambda @ file:///wheels/datadog_lambda-5.87.0-py3-none-any.whl#sha256=e7cf98cfb15fcb6fbe34f2808840e2741a3daa7f1770e6f1039484dace732316
ddsketch @ file:///wheels/ddsketch-3.0.1-py3-none-any.whl#sha256=6d047b455fe2837c43d366ff1ae6ba0c3166e15499de8688437a75cea914224e
ddtrace @ file:///wheels/ddtrace-2.8.0-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=7489d735c7ed51d16652e8fa06a471cc78c78ba1fcce8c4d3b1277d2e72fc4c8
decorator @ file:///wheels/decorator-5.1.1-py3-none-any.whl#sha256=b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186
defusedxml @ file:///wheels/defusedxml-0.7.1-py2.py3-none-any.whl#sha256=a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61
Deprecated @ file:///wheels/Deprecated-1.2.13-py2.py3-none-any.whl#sha256=64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d
dill @ file:///wheels/dill-0.3.6-py3-none-any.whl#sha256=a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0
distlib @ file:///wheels/distlib-0.3.6-py2.py3-none-any.whl#sha256=f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e
distro @ file:///wheels/distro-1.9.0-py3-none-any.whl#sha256=7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2
Django @ file:///wheels/Django-4.2.10-py3-none-any.whl#sha256=a2d4c4d4ea0b6f0895acde632071aff6400bfc331228fc978b05452a0ff3e9f1
django-auditlog @ file:///wheels/django_auditlog-2.7.0-py3-none-any.whl#sha256=0fe2e81c90038567328a521d233f2784115614859728a03dceb48ac3b54669f5
django-cors-headers @ file:///wheels/django_cors_headers-3.14.0-py3-none-any.whl#sha256=684180013cc7277bdd8702b80a3c5a4b3fcae4abb2bf134dceb9f5dfe300228e
django-csp @ file:///wheels/django_csp-3.7-py2.py3-none-any.whl#sha256=01443a07723f9a479d498bd7bb63571aaa771e690f64bde515db6cdb76e8041a
django-database-view @ file:///wheels/django_database_view-0.3.0-py3-none-any.whl#sha256=dc0982c64c31e7b4e7f249ebf04241c48766cc21d7d489f329c8b17399d98f76
django-extensions @ file:///wheels/django_extensions-3.2.3-py3-none-any.whl#sha256=9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401
django-filter @ file:///wheels/django_filter-23.2-py3-none-any.whl#sha256=d12d8e0fc6d3eb26641e553e5d53b191eb8cec611427d4bdce0becb1f7c172b5
django-ipware @ file:///wheels/django_ipware-5.0.2-py2.py3-none-any.whl#sha256=838b7aede77734603bd32ebd08ad7957304266580b646f8cbe982c4833b71c84
django-polymorphic @ file:///wheels/django_polymorphic-3.1.0-py3-none-any.whl#sha256=08bc4f4f4a773a19b2deced5a56deddd1ef56ebd15207bf4052e2901c25ef57e
django-postgres-extra @ file:///wheels/django_postgres_extra-2.0.8-py3-none-any.whl#sha256=447d5a971759943ee63a9d4cef9c6c1fa290e518611ea521a38b6732681d2f3a
django-test-migrations @ file:///wheels/django_test_migrations-1.2.0-py3-none-any.whl#sha256=9e8b9b4364fef70dde10a5f85c5a75d447ca2189ec648325610fab1268daec97
django-thread @ file:///wheels/django_thread-0.0.1-py3-none-any.whl#sha256=a65398ded5cc99bb5a09cd4d32befef26662882e7993d5409e7824b82c0947f7
django-types @ file:///wheels/django_types-0.19.1-py3-none-any.whl#sha256=b3f529de17f6374d41ca67232aa01330c531bbbaa3ac4097896f31ac33c96c30
djangorestframework @ file:///wheels/djangorestframework-3.14.0-py3-none-any.whl#sha256=eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08
ElasticMock @ file:///wheels/ElasticMock-1.10.0-py3-none-any.whl#sha256=7001edd95ebe0965dd51af05dd7a7834d4007dc303e65f8c3d42ec83d4d8da39
elasticsearch @ file:///wheels/elasticsearch-7.13.0-py2.py3-none-any.whl#sha256=8213d6b7d3f984a23e2f8b6ff63366224b3de9129839ed0cb8195d9e8339dc85
elasticsearch-dsl @ file:///wheels/elasticsearch_dsl-7.3.0-py2.py3-none-any.whl#sha256=9390d8e5cf82ebad3505e7f656e407259cf703f5a4035f211cef454127672572
emoji @ file:///wheels/emoji-2.8.0-py2.py3-none-any.whl#sha256=a8468fd836b7ecb6d1eac054c9a591701ce0ccd6c6f7779ad71b66f76664df90
envier @ file:///wheels/envier-0.5.1-py3-none-any.whl#sha256=b45ef6051fea33d0c32a64e186bff2cfb446e2242d6781216c9bc9ce708c5909
execnet @ file:///wheels/execnet-1.9.0-py2.py3-none-any.whl#sha256=a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142
expiringdict @ file:///wheels/expiringdict-1.1.4-py3-none-any.whl#sha256=bbb77c13e5488e236f181b391c7e225c4d4e9b427d8e020bd5ccd0cc09715587
fakeredis @ file:///wheels/fakeredis-2.21.3-py3-none-any.whl#sha256=033fe5882a20ec308ed0cf67a86c1cd982a1bffa63deb0f52eaa625bd8ce305f
filelock @ file:///wheels/filelock-3.9.0-py3-none-any.whl#sha256=f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d
freezegun @ file:///wheels/freezegun-1.4.0-py3-none-any.whl#sha256=55e0fc3c84ebf0a96a5aa23ff8b53d70246479e9a68863f1fcac5a3e52f19dd6
frozenlist @ file:///wheels/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6
future @ file:///wheels/future-1.0.0-py3-none-any.whl#sha256=929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216
google-auth @ file:///wheels/google_auth-2.25.2-py2.py3-none-any.whl#sha256=473a8dfd0135f75bb79d878436e568f2695dce456764bf3a02b6f8c540b1d256
google-auth-httplib2 @ file:///wheels/google_auth_httplib2-0.2.0-py2.py3-none-any.whl#sha256=b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d
google-auth-oauthlib @ file:///wheels/google_auth_oauthlib-1.2.0-py2.py3-none-any.whl#sha256=297c1ce4cb13a99b5834c74a1fe03252e1e499716718b190f56bcb9c4abc4faf
gprof2dot @ file:///wheels/gprof2dot-2022.7.29-py2.py3-none-any.whl#sha256=f165b3851d3c52ee4915eb1bd6cca571e5759823c2cd0f71a79bda93c2dc85d6
graphene @ file:///wheels/graphene-2.1.9-py2.py3-none-any.whl#sha256=3d446eb1237c551052bc31155cf1a3a607053e4f58c9172b83a1b597beaa0868
graphene-django @ file:///wheels/graphene_django-2.16.0-py2.py3-none-any.whl#sha256=ec89469ec94507c1ed998f85ee087d634ec489e20fe08a72893c3ca5e646fc14
graphene-file-upload @ file:///wheels/graphene_file_upload-1.2.2-py3-none-any.whl#sha256=034ff72d2834b7aebd06fda412fa88a10aba34bac604317f7552457e47040654
graphql-core @ file:///wheels/graphql_core-2.3.2-py2.py3-none-any.whl#sha256=44c9bac4514e5e30c5a595fac8e3c76c1975cae14db215e8174c7fe995825bad
graphql-relay @ file:///wheels/graphql_relay-2.0.1-py3-none-any.whl#sha256=ac514cb86db9a43014d7e73511d521137ac12cf0101b2eaa5f0a3da2e10d913d
gunicorn @ file:///wheels/gunicorn-20.0.4-py2.py3-none-any.whl#sha256=cd4a810dd51bf497552cf3f863b575dabd73d6ad6a91075b65936b151cbf4f9c
h11 @ file:///wheels/h11-0.14.0-py3-none-any.whl#sha256=e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761
httpcore @ file:///wheels/httpcore-1.0.2-py3-none-any.whl#sha256=096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7
httplib2 @ file:///wheels/httplib2-0.21.0-py3-none-any.whl#sha256=987c8bb3eb82d3fa60c68699510a692aa2ad9c4bd4f123e51dfb1488c14cdd01
httpx @ file:///wheels/httpx-0.26.0-py3-none-any.whl#sha256=8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd
hupper @ file:///wheels/hupper-1.12.1-py3-none-any.whl#sha256=e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19
hvac @ file:///wheels/hvac-0.11.2-py2.py3-none-any.whl#sha256=3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568
identify @ file:///wheels/identify-2.5.13-py2.py3-none-any.whl#sha256=8aa48ce56e38c28b6faa9f261075dea0a942dfbb42b341b4e711896cbb40f3f7
idna @ file:///wheels/idna-3.4-py3-none-any.whl#sha256=90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2
importlib-metadata @ file:///wheels/importlib_metadata-6.8.0-py3-none-any.whl#sha256=3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb
importlib-resources @ file:///wheels/importlib_resources-6.0.0-py3-none-any.whl#sha256=d952faee11004c045f785bb5636e8f885bed30dc3c940d5d42798a2a4541c185
iniconfig @ file:///wheels/iniconfig-2.0.0-py3-none-any.whl#sha256=b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
isort @ file:///wheels/isort-5.11.4-py3-none-any.whl#sha256=c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b
Jinja2 @ file:///wheels/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa
jira @ file:///wheels/jira-3.4.1-py3-none-any.whl#sha256=9b1286a3eada593bb1c83e12989dc2e7c796867523049fa6a680c3a2757e4d17
jmespath @ file:///wheels/jmespath-0.10.0-py2.py3-none-any.whl#sha256=cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f
jsonschema @ file:///wheels/jsonschema-4.16.0-py3-none-any.whl#sha256=9e74b8f9738d6a946d70705dc692b74b5429cd0960d58e79ffecfc43b2221eb9
launchdarkly-server-sdk @ file:///wheels/launchdarkly_server_sdk-8.1.4-py3-none-any.whl#sha256=c0075fbaccf8eee5f41eaf7de4a949930a80be0b6b91c648841032704cd4d014
lazy-object-proxy @ file:///wheels/lazy_object_proxy-1.9.0-cp312-cp312-linux_aarch64.whl#sha256=8d8981798e5a1a6e7142e9b9ff9fdae5f4d4eea7282b868e6777fe1e40a86d12
limits @ file:///wheels/limits-3.5.0-py3-none-any.whl#sha256=3ad525faeb7e1c63859ca1cae34c9ed22a8f22c9ea9d96e2f412869f6b36beb9
luqum @ file:///wheels/luqum-0.11.0-py3-none-any.whl#sha256=f7518558bcfd219771083fcca9c2c877c3ff621beb2f5197d569e14ec2c6fe6f
MarkupSafe @ file:///wheels/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c
marshmallow @ file:///wheels/marshmallow-3.19.0-py3-none-any.whl#sha256=93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b
mccabe @ file:///wheels/mccabe-0.7.0-py2.py3-none-any.whl#sha256=6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e
mixpanel @ file:///wheels/mixpanel-4.9.0-py2.py3-none-any.whl#sha256=28093420171ca42c3204e5fe614f2d4270c24766c61d4a956df396b1f308dba5
mock @ file:///wheels/mock-4.0.3-py3-none-any.whl#sha256=122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62
moto @ file:///wheels/moto-4.2.13-py2.py3-none-any.whl#sha256=93e0fd13b624bd79115494f833308c3641b2be0fc9f4f18aa9264aa01f6168e0
multidict @ file:///wheels/multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb
mypy-extensions @ file:///wheels/mypy_extensions-1.0.0-py3-none-any.whl#sha256=4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d
neo4j @ file:///wheels/neo4j-5.19.0-py3-none-any.whl#sha256=e6adb29c054664e790c39e68325f303dd632e3bfe6420a2185261604d75cc014
nodeenv @ file:///wheels/nodeenv-1.7.0-py2.py3-none-any.whl#sha256=27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e
numpy @ file:///wheels/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a
oauthlib @ file:///wheels/oauthlib-3.2.2-py3-none-any.whl#sha256=8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca
openai @ file:///wheels/openai-1.13.3-py3-none-any.whl#sha256=5769b62abd02f350a8dd1a3a242d8972c947860654466171d60fb0972ae0a41c
opentelemetry-api @ file:///wheels/opentelemetry_api-1.20.0-py3-none-any.whl#sha256=982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5
packaging @ file:///wheels/packaging-23.0-py3-none-any.whl#sha256=714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2
pandas @ file:///wheels/pandas-2.2.1-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc
parameterized @ file:///wheels/parameterized-0.7.4-py2.py3-none-any.whl#sha256=59ab908e31c01505a987a2be78854e19cb1630c047bbab7848169c371d614d56
platformdirs @ file:///wheels/platformdirs-2.6.2-py3-none-any.whl#sha256=83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490
pluggy @ file:///wheels/pluggy-1.0.0-py2.py3-none-any.whl#sha256=74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3
ply @ file:///wheels/ply-3.11-py2.py3-none-any.whl#sha256=096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce
pre-commit==3.7.0
prometheus_client @ file:///wheels/prometheus_client-0.20.0-py3-none-any.whl#sha256=cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7
promise @ file:///wheels/promise-2.3-py3-none-any.whl#sha256=ed539fa5e6008af38d2484b0474a1214b046abd9edaf91df63e0929325b5a281
protobuf @ file:///wheels/protobuf-4.21.12-py3-none-any.whl#sha256=b98d0148f84e3a3c569e19f52103ca1feacdac0d2df8d6533cf983d1fda28462
psycopg2-binary==2.9.9
py @ file:///wheels/py-1.11.0-py2.py3-none-any.whl#sha256=607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378
pyasn1 @ file:///wheels/pyasn1-0.4.8-py2.py3-none-any.whl#sha256=39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d
pyasn1-modules @ file:///wheels/pyasn1_modules-0.2.8-py2.py3-none-any.whl#sha256=a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74
pycarlo @ file:///wheels/pycarlo-0.8.14-py3-none-any.whl#sha256=e7dc5682f0705c8b2f8974fae8e2efd199f1c9bf491ce6aaaf279541b1f89ea2
pycparser @ file:///wheels/pycparser-2.21-py2.py3-none-any.whl#sha256=8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9
pydantic @ file:///wheels/pydantic-2.6.3-py3-none-any.whl#sha256=72c6034df47f46ccdf81869fddb81aade68056003900a8724a4f160700016a2a
pydantic_core @ file:///wheels/pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca
PyGithub @ file:///wheels/PyGithub-2.1.1-py3-none-any.whl#sha256=4b528d5d6f35e991ea5fd3f942f58748f24938805cb7fcf24486546637917337
PyJWT @ file:///wheels/PyJWT-2.6.0-py3-none-any.whl#sha256=d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14
pylint @ file:///wheels/pylint-2.13.9-py3-none-any.whl#sha256=705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526
PyNaCl @ file:///wheels/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl#sha256=a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b
pynamodb @ file:///wheels/pynamodb-5.4.0-py3-none-any.whl#sha256=f05784988d48429e7490a25346ad6e8a73cad3e20674993e31e78e9e4b40c93a
pyparsing @ file:///wheels/pyparsing-3.0.9-py3-none-any.whl#sha256=5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc
pyRFC3339 @ file:///wheels/pyRFC3339-1.1-py2.py3-none-any.whl#sha256=67196cb83b470709c580bb4738b83165e67c6cc60e1f2e4f286cfcb402a926f4
pyright @ file:///wheels/pyright-1.1.357-py3-none-any.whl#sha256=1cf29ee38e4928131895cd8e90eef37b5b77e2ed72a14e6e8e2405266f5f0aca
pyrsistent @ file:///wheels/pyrsistent-0.19.3-py3-none-any.whl#sha256=ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64
pytest @ file:///wheels/pytest-7.1.2-py3-none-any.whl#sha256=13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c
pytest-cov @ file:///wheels/pytest_cov-3.0.0-py3-none-any.whl#sha256=578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6
pytest-datadir @ file:///wheels/pytest_datadir-1.4.1-py3-none-any.whl#sha256=095f441782b1b907587eca7227fdbae94be43f1c96b4b2cbcc6801a4645be1af
pytest-django @ file:///wheels/pytest_django-4.5.2-py3-none-any.whl#sha256=c60834861933773109334fe5a53e83d1ef4828f2203a1d6a0fa9972f4f75ab3e
pytest-env @ file:///wheels/pytest_env-0.6.2-py3-none-any.whl#sha256=6f18ddb2865248ea28b435727dc69966db1985eaa5093794f05bcf5ae9856fe0
pytest-freezegun @ file:///wheels/pytest_freezegun-0.4.2-py2.py3-none-any.whl#sha256=5318a6bfb8ba4b709c8471c94d0033113877b3ee02da5bfcd917c1889cde99a7
pytest-profiling @ file:///wheels/pytest_profiling-1.7.0-py2.py3-none-any.whl#sha256=999cc9ac94f2e528e3f5d43465da277429984a1c237ae9818f8cfd0b06acb019
pytest-regressions @ file:///wheels/pytest_regressions-2.4.2-py3-none-any.whl#sha256=b47f92c39d5dd2faa90716ee74c584d705c08e14f435a947f67706c4e5b8ef9a
pytest-unordered @ file:///wheels/pytest_unordered-0.5.2-py3-none-any.whl#sha256=b01bb0e8ba80db6dd8c840fe24ad1804c8672919303dc9302688221390a7dc29
pytest-xdist @ file:///wheels/pytest_xdist-3.1.0-py3-none-any.whl#sha256=70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89
python-box @ file:///wheels/python_box-7.0.1-py3-none-any.whl#sha256=f26f210b2257fd973413e75e8b91aaff9c95d7d61266426a7d3df473c4adcfd4
python-dateutil @ file:///wheels/python_dateutil-2.8.2-py2.py3-none-any.whl#sha256=961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9
python-snappy @ file:///wheels/python_snappy-0.7.1-py3-none-any.whl#sha256=7c9111be1ae1dcbf4ce32b752366d4a5d4f07898d517691c4003d41e04b03488
pytz @ file:///wheels/pytz-2022.7-py2.py3-none-any.whl#sha256=93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd
PyYAML @ file:///wheels/PyYAML-6.0.1-cp312-cp312-linux_aarch64.whl#sha256=134770b0d9a0e0242eb3426bb88e7bb186efda966e196adbde242c6f8731c320
redis @ file:///wheels/redis-4.5.4-py3-none-any.whl#sha256=2c19e6767c474f2e85167909061d525ed65bea9301c0770bb151e041b7ac89a2
regex @ file:///wheels/regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420
requests @ file:///wheels/requests-2.31.0-py3-none-any.whl#sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f
requests-aws4auth @ file:///wheels/requests_aws4auth-1.2.3-py2.py3-none-any.whl#sha256=8070a5207e95fa5fe88e87d9a75f34e768cbab35bb3557ef20cbbf9426dee4d5
requests-oauthlib @ file:///wheels/requests_oauthlib-1.3.1-py2.py3-none-any.whl#sha256=2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5
requests-toolbelt @ file:///wheels/requests_toolbelt-0.10.1-py2.py3-none-any.whl#sha256=18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7
responses @ file:///wheels/responses-0.22.0-py3-none-any.whl#sha256=dcf294d204d14c436fddcc74caefdbc5764795a40ff4e6a7740ed8ddbf3294be
retry @ file:///wheels/retry-0.9.2-py2.py3-none-any.whl#sha256=ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606
rsa @ file:///wheels/rsa-4.9-py3-none-any.whl#sha256=90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7
ruff @ file:///wheels/ruff-0.3.0-py3-none-musllinux_1_2_aarch64.whl#sha256=cc30a9053ff2f1ffb505a585797c23434d5f6c838bacfe206c0e6cf38c921a1e
Rx @ file:///wheels/Rx-1.6.3-py2.py3-none-any.whl#sha256=762c48c05152b2666b4a6eb9ec179a6b65c57270d02578e3c68dd4ea2b06ec30
s3transfer @ file:///wheels/s3transfer-0.7.0-py3-none-any.whl#sha256=10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a
semver @ file:///wheels/semver-2.13.0-py2.py3-none-any.whl#sha256=ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4
sentry-sdk @ file:///wheels/sentry_sdk-1.44.0-py2.py3-none-any.whl#sha256=eb65289da013ca92fad2694851ad2f086aa3825e808dc285bd7dcaf63602bb18
setproctitle @ file:///wheels/setproctitle-1.3.2-cp312-cp312-linux_aarch64.whl#sha256=290769b2a2f52d21431d9334adf8644994138d7d2aed0a22b4734624f6cb3061
setuptools==69.2.0
sgqlc @ file:///wheels/sgqlc-16.0-py3-none-any.whl#sha256=fd55d808e17c96392bcc9058b31433ef9ae6376ca36a6352d4bd602b968193a2
simplejson @ file:///wheels/simplejson-3.17.2-cp312-cp312-linux_aarch64.whl#sha256=f2280e57bf93c842c3105dddd46668b2c04c70d08f0d096bcc52f87f39f7d478
singledispatch @ file:///wheels/singledispatch-4.0.0-py2.py3-none-any.whl#sha256=b8f69397a454b45b91e2f949fcc87896c53718ca59aab6367966e8b3f010ec77
six @ file:///wheels/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
slack-bolt @ file:///wheels/slack_bolt-1.9.2-py2.py3-none-any.whl#sha256=fafd7b68a6add820525fcccff388ae944ea9345995296fb0fa0f57698874aa41
slack-sdk @ file:///wheels/slack_sdk-3.19.5-py2.py3-none-any.whl#sha256=0b52bb32a87c71f638b9eb47e228dffeebf89de5e762684ef848276f9f186c84
slackclient @ file:///wheels/slackclient-2.9.4-py2.py3-none-any.whl#sha256=a8cab9146795e23d66a03473b80dd23df8c500829dfa9d06b3e3d5aec0a2b293
sniffio @ file:///wheels/sniffio-1.3.0-py3-none-any.whl#sha256=eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384
sortedcontainers @ file:///wheels/sortedcontainers-2.4.0-py2.py3-none-any.whl#sha256=a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0
sqlglot @ file:///wheels/sqlglot-20.11.0-py3-none-any.whl#sha256=658509272da15e90dd1c59d9ca5281d7bff2e87121f87e6f9e6541067a057c9c
sqlparse @ file:///wheels/sqlparse-0.4.4-py3-none-any.whl#sha256=5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3
text-unidecode @ file:///wheels/text_unidecode-1.3-py2.py3-none-any.whl#sha256=1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8
tiktoken @ file:///wheels/tiktoken-0.6.0-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=1f5f0f2ed67ba16373f9a6013b68da298096b27cd4e1cf276d2d3868b5c7efd1
toml @ file:///wheels/toml-0.10.2-py2.py3-none-any.whl#sha256=806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b
tomli @ file:///wheels/tomli-2.0.1-py3-none-any.whl#sha256=939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc
tqdm @ file:///wheels/tqdm-4.65.0-py3-none-any.whl#sha256=c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671
types-psycopg2 @ file:///wheels/types_psycopg2-2.9.21.14-py3-none-any.whl#sha256=cd9c5350631f3bc6184ec8d48f2ed31d4ea660f89d0fffe78239450782f383c5
types-python-dateutil @ file:///wheels/types_python_dateutil-2.8.19.13-py3-none-any.whl#sha256=0b0e7c68e7043b0354b26a1e0225cb1baea7abb1b324d02b50e2d08f1221043f
types-toml @ file:///wheels/types_toml-0.10.8.1-py3-none-any.whl#sha256=b7b5c4977f96ab7b5ac06d8a6590d17c0bf252a96efc03b109c2711fb3e0eafd
typing-inspect @ file:///wheels/typing_inspect-0.8.0-py3-none-any.whl#sha256=5fbf9c1e65d4fa01e701fe12a5bca6c6e08a4ffd5bc60bfac028253a447c5188
typing_extensions @ file:///wheels/typing_extensions-4.9.0-py3-none-any.whl#sha256=af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
tzdata @ file:///wheels/tzdata-2023.3-py2.py3-none-any.whl#sha256=7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda
uritemplate @ file:///wheels/uritemplate-4.1.1-py2.py3-none-any.whl#sha256=830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e
urllib3 @ file:///wheels/urllib3-1.26.18-py2.py3-none-any.whl#sha256=34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07
virtualenv @ file:///wheels/virtualenv-20.17.1-py3-none-any.whl#sha256=ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4
watchdog @ file:///wheels/watchdog-2.2.1-py3-none-any.whl#sha256=868311d9025d1130831b1ce69a4bc513b67a3811619aaddb332bc728d1841915
watchtower @ file:///wheels/watchtower-3.1.0-py3-none-any.whl#sha256=c9a26d720233ca4fb47acf1218d92a9ab3e52307b31728a407974e89586b70e2
webexteamssdk @ file:///wheels/webexteamssdk-1.6.1-py3-none-any.whl#sha256=52a7f9d515cd3d53a853e679e16572ec6ca036a223e35b14fea14c99f492a6a4
Werkzeug @ file:///wheels/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10
wheel==0.43.0
whitenoise @ file:///wheels/whitenoise-6.4.0-py3-none-any.whl#sha256=599dc6ca57e48929dfeffb2e8e187879bfe2aed0d49ca419577005b7f2cc930b
wrapt @ file:///wheels/wrapt-1.15.0-py3-none-any.whl#sha256=64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640
xmltodict @ file:///wheels/xmltodict-0.13.0-py2.py3-none-any.whl#sha256=aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852
yarl @ file:///wheels/yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl#sha256=008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51
zipp @ file:///wheels/zipp-3.16.2-py3-none-any.whl#sha256=679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.