├── .devcontainer └── devcontainer.json ├── .editorconfig ├── .github ├── actions │ └── setup-python │ │ └── action.yml ├── dependabot.yml └── workflows │ ├── release.yml │ └── ruff.yml ├── .gitignore ├── .pre-commit-config.yaml ├── LICENSE ├── README.md ├── nb_cli_plugin_docker ├── __init__.py ├── cli.py ├── exception.py ├── handler.py ├── plugin.py ├── static │ ├── common │ │ └── .dockerignore │ └── reverse │ │ └── docker │ │ ├── _main.py │ │ ├── gunicorn_conf.py │ │ └── start.sh ├── template │ └── docker │ │ ├── _helpers.Dockerfile.jinja │ │ ├── docker-compose.yml.jinja │ │ ├── forward.Dockerfile.jinja │ │ ├── get_driver_type.py.jinja │ │ └── reverse.Dockerfile.jinja └── utils.py ├── poetry.lock └── pyproject.toml /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Default Linux Universal", 3 | "image": "mcr.microsoft.com/devcontainers/universal:2-linux", 4 | "features": { 5 | "ghcr.io/devcontainers-contrib/features/poetry:2": {} 6 | }, 7 | "postCreateCommand": "poetry config virtualenvs.in-project true && poetry install && poetry run pre-commit install", 8 | "customizations": { 9 | "vscode": { 10 | "settings": { 11 | "python.analysis.diagnosticMode": "workspace", 12 | "ruff.organizeImports": false, 13 | "[python]": { 14 | "editor.defaultFormatter": "ms-python.black-formatter", 15 | "editor.codeActionsOnSave": { 16 | "source.fixAll.ruff": "explicit", 17 | "source.organizeImports": "explicit" 18 | } 19 | }, 20 | "[javascript]": { 21 | "editor.defaultFormatter": "esbenp.prettier-vscode" 22 | }, 23 | "[html]": { 24 | "editor.defaultFormatter": "esbenp.prettier-vscode" 25 | }, 26 | "[typescript]": { 27 | "editor.defaultFormatter": "esbenp.prettier-vscode" 28 | }, 29 | "[javascriptreact]": { 30 | "editor.defaultFormatter": "esbenp.prettier-vscode" 31 | }, 32 | "[typescriptreact]": { 33 | "editor.defaultFormatter": "esbenp.prettier-vscode" 34 | }, 35 | "files.exclude": { 36 | "**/__pycache__": true 37 | }, 38 | "files.watcherExclude": { 39 | "**/target/**": true, 40 | "**/__pycache__": true 41 | } 42 | }, 43 | "extensions": [ 44 | "ms-python.python", 45 | "ms-python.vscode-pylance", 46 | "ms-python.isort", 47 | "ms-python.black-formatter", 48 | "charliermarsh.ruff", 49 | "EditorConfig.EditorConfig", 50 | "esbenp.prettier-vscode" 51 | ] 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | # The JSON files contain newlines inconsistently 13 | [*.json] 14 | insert_final_newline = ignore 15 | 16 | # Minified JavaScript files shouldn't be changed 17 | [**.min.js] 18 | indent_style = ignore 19 | insert_final_newline = ignore 20 | 21 | # Makefiles always use tabs for indentation 22 | [Makefile] 23 | indent_style = tab 24 | 25 | # Batch files use tabs for indentation 26 | [*.bat] 27 | indent_style = tab 28 | 29 | [*.md] 30 | trim_trailing_whitespace = false 31 | 32 | # Matches the exact files either package.json or .travis.yml 33 | [{package.json,.travis.yml}] 34 | indent_size = 2 35 | 36 | [{*.py,*.pyi}] 37 | indent_size = 4 38 | -------------------------------------------------------------------------------- /.github/actions/setup-python/action.yml: -------------------------------------------------------------------------------- 1 | name: Setup Python 2 | description: Setup Python 3 | 4 | inputs: 5 | python-version: 6 | description: Python version 7 | required: false 8 | default: "3.10" 9 | 10 | runs: 11 | using: "composite" 12 | steps: 13 | - name: Install poetry 14 | run: pipx install poetry 15 | shell: bash 16 | 17 | - uses: actions/setup-python@v5 18 | with: 19 | python-version: ${{ inputs.python-version }} 20 | architecture: "x64" 21 | cache: "poetry" 22 | 23 | - run: poetry install 24 | shell: bash 25 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | groups: 8 | actions: 9 | patterns: 10 | - "*" 11 | 12 | - package-ecosystem: github-actions 13 | directory: "/.github/actions/setup-python" 14 | schedule: 15 | interval: daily 16 | groups: 17 | actions: 18 | patterns: 19 | - "*" 20 | 21 | - package-ecosystem: devcontainers 22 | directory: "/" 23 | schedule: 24 | interval: daily 25 | groups: 26 | devcontainers: 27 | patterns: 28 | - "*" 29 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | release: 10 | runs-on: ubuntu-latest 11 | permissions: 12 | id-token: write 13 | contents: write 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Setup Python environment 18 | uses: ./.github/actions/setup-python 19 | 20 | - name: Get Version 21 | id: version 22 | run: | 23 | echo "VERSION=$(poetry version -s)" >> $GITHUB_OUTPUT 24 | echo "TAG_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT 25 | echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT 26 | 27 | - name: Check Version 28 | if: steps.version.outputs.VERSION != steps.version.outputs.TAG_VERSION 29 | run: exit 1 30 | 31 | - name: Build 32 | run: poetry build 33 | 34 | - name: Publish a Python distribution to PyPI 35 | uses: pypa/gh-action-pypi-publish@release/v1 36 | 37 | - name: Upload Release Asset 38 | run: gh release upload --clobber ${{ steps.version.outputs.TAG_NAME }} dist/*.tar.gz dist/*.whl 39 | env: 40 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 41 | -------------------------------------------------------------------------------- /.github/workflows/ruff.yml: -------------------------------------------------------------------------------- 1 | name: Ruff Lint 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | ruff: 11 | name: Ruff Lint 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | 16 | - name: Run Ruff Lint 17 | uses: chartboost/ruff-action@v1 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ----- Project ----- 2 | 3 | # Created by https://www.toptal.com/developers/gitignore/api/python,node,visualstudiocode,jetbrains,macos,windows,linux 4 | # Edit at https://www.toptal.com/developers/gitignore?templates=python,node,visualstudiocode,jetbrains,macos,windows,linux 5 | 6 | ### JetBrains ### 7 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 8 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 9 | 10 | # User-specific stuff 11 | .idea/**/workspace.xml 12 | .idea/**/tasks.xml 13 | .idea/**/usage.statistics.xml 14 | .idea/**/dictionaries 15 | .idea/**/shelf 16 | 17 | # AWS User-specific 18 | .idea/**/aws.xml 19 | 20 | # Generated files 21 | .idea/**/contentModel.xml 22 | 23 | # Sensitive or high-churn files 24 | .idea/**/dataSources/ 25 | .idea/**/dataSources.ids 26 | .idea/**/dataSources.local.xml 27 | .idea/**/sqlDataSources.xml 28 | .idea/**/dynamic.xml 29 | .idea/**/uiDesigner.xml 30 | .idea/**/dbnavigator.xml 31 | 32 | # Gradle 33 | .idea/**/gradle.xml 34 | .idea/**/libraries 35 | 36 | # Gradle and Maven with auto-import 37 | # When using Gradle or Maven with auto-import, you should exclude module files, 38 | # since they will be recreated, and may cause churn. Uncomment if using 39 | # auto-import. 40 | # .idea/artifacts 41 | # .idea/compiler.xml 42 | # .idea/jarRepositories.xml 43 | # .idea/modules.xml 44 | # .idea/*.iml 45 | # .idea/modules 46 | # *.iml 47 | # *.ipr 48 | 49 | # CMake 50 | cmake-build-*/ 51 | 52 | # Mongo Explorer plugin 53 | .idea/**/mongoSettings.xml 54 | 55 | # File-based project format 56 | *.iws 57 | 58 | # IntelliJ 59 | out/ 60 | 61 | # mpeltonen/sbt-idea plugin 62 | .idea_modules/ 63 | 64 | # JIRA plugin 65 | atlassian-ide-plugin.xml 66 | 67 | # Cursive Clojure plugin 68 | .idea/replstate.xml 69 | 70 | # Crashlytics plugin (for Android Studio and IntelliJ) 71 | com_crashlytics_export_strings.xml 72 | crashlytics.properties 73 | crashlytics-build.properties 74 | fabric.properties 75 | 76 | # Editor-based Rest Client 77 | .idea/httpRequests 78 | 79 | # Android studio 3.1+ serialized cache file 80 | .idea/caches/build_file_checksums.ser 81 | 82 | ### JetBrains Patch ### 83 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 84 | 85 | # *.iml 86 | # modules.xml 87 | # .idea/misc.xml 88 | # *.ipr 89 | 90 | # Sonarlint plugin 91 | # https://plugins.jetbrains.com/plugin/7973-sonarlint 92 | .idea/**/sonarlint/ 93 | 94 | # SonarQube Plugin 95 | # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin 96 | .idea/**/sonarIssues.xml 97 | 98 | # Markdown Navigator plugin 99 | # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced 100 | .idea/**/markdown-navigator.xml 101 | .idea/**/markdown-navigator-enh.xml 102 | .idea/**/markdown-navigator/ 103 | 104 | # Cache file creation bug 105 | # See https://youtrack.jetbrains.com/issue/JBR-2257 106 | .idea/$CACHE_FILE$ 107 | 108 | # CodeStream plugin 109 | # https://plugins.jetbrains.com/plugin/12206-codestream 110 | .idea/codestream.xml 111 | 112 | ### Linux ### 113 | *~ 114 | 115 | # temporary files which can be created if a process still has a handle open of a deleted file 116 | .fuse_hidden* 117 | 118 | # KDE directory preferences 119 | .directory 120 | 121 | # Linux trash folder which might appear on any partition or disk 122 | .Trash-* 123 | 124 | # .nfs files are created when an open file is removed but is still being accessed 125 | .nfs* 126 | 127 | ### macOS ### 128 | # General 129 | .DS_Store 130 | .AppleDouble 131 | .LSOverride 132 | 133 | # Icon must end with two \r 134 | Icon 135 | 136 | # Thumbnails 137 | ._* 138 | 139 | # Files that might appear in the root of a volume 140 | .DocumentRevisions-V100 141 | .fseventsd 142 | .Spotlight-V100 143 | .TemporaryItems 144 | .Trashes 145 | .VolumeIcon.icns 146 | .com.apple.timemachine.donotpresent 147 | 148 | # Directories potentially created on remote AFP share 149 | .AppleDB 150 | .AppleDesktop 151 | Network Trash Folder 152 | Temporary Items 153 | .apdisk 154 | 155 | ### Node ### 156 | # Logs 157 | logs 158 | *.log 159 | npm-debug.log* 160 | yarn-debug.log* 161 | yarn-error.log* 162 | lerna-debug.log* 163 | .pnpm-debug.log* 164 | 165 | # Diagnostic reports (https://nodejs.org/api/report.html) 166 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 167 | 168 | # Runtime data 169 | pids 170 | *.pid 171 | *.seed 172 | *.pid.lock 173 | 174 | # Directory for instrumented libs generated by jscoverage/JSCover 175 | lib-cov 176 | 177 | # Coverage directory used by tools like istanbul 178 | coverage 179 | *.lcov 180 | 181 | # nyc test coverage 182 | .nyc_output 183 | 184 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 185 | .grunt 186 | 187 | # Bower dependency directory (https://bower.io/) 188 | bower_components 189 | 190 | # node-waf configuration 191 | .lock-wscript 192 | 193 | # Compiled binary addons (https://nodejs.org/api/addons.html) 194 | build/Release 195 | 196 | # Dependency directories 197 | node_modules/ 198 | jspm_packages/ 199 | 200 | # Snowpack dependency directory (https://snowpack.dev/) 201 | web_modules/ 202 | 203 | # TypeScript cache 204 | *.tsbuildinfo 205 | 206 | # Optional npm cache directory 207 | .npm 208 | 209 | # Optional eslint cache 210 | .eslintcache 211 | 212 | # Microbundle cache 213 | .rpt2_cache/ 214 | .rts2_cache_cjs/ 215 | .rts2_cache_es/ 216 | .rts2_cache_umd/ 217 | 218 | # Optional REPL history 219 | .node_repl_history 220 | 221 | # Output of 'npm pack' 222 | *.tgz 223 | 224 | # Yarn Integrity file 225 | .yarn-integrity 226 | 227 | # dotenv environment variables file 228 | .env 229 | .env.test 230 | .env.production 231 | 232 | # parcel-bundler cache (https://parceljs.org/) 233 | .cache 234 | .parcel-cache 235 | 236 | # Next.js build output 237 | .next 238 | out 239 | 240 | # Nuxt.js build / generate output 241 | .nuxt 242 | dist 243 | 244 | # Gatsby files 245 | .cache/ 246 | # Comment in the public line in if your project uses Gatsby and not Next.js 247 | # https://nextjs.org/blog/next-9-1#public-directory-support 248 | # public 249 | 250 | # vuepress build output 251 | .vuepress/dist 252 | 253 | # Serverless directories 254 | .serverless/ 255 | 256 | # FuseBox cache 257 | .fusebox/ 258 | 259 | # DynamoDB Local files 260 | .dynamodb/ 261 | 262 | # TernJS port file 263 | .tern-port 264 | 265 | # Stores VSCode versions used for testing VSCode extensions 266 | .vscode-test 267 | 268 | # yarn v2 269 | .yarn/cache 270 | .yarn/unplugged 271 | .yarn/build-state.yml 272 | .yarn/install-state.gz 273 | .pnp.* 274 | 275 | ### Node Patch ### 276 | # Serverless Webpack directories 277 | .webpack/ 278 | 279 | # Optional stylelint cache 280 | .stylelintcache 281 | 282 | # SvelteKit build / generate output 283 | .svelte-kit 284 | 285 | ### Python ### 286 | # Byte-compiled / optimized / DLL files 287 | __pycache__/ 288 | *.py[cod] 289 | *$py.class 290 | 291 | # C extensions 292 | *.so 293 | 294 | # Distribution / packaging 295 | .Python 296 | build/ 297 | develop-eggs/ 298 | dist/ 299 | downloads/ 300 | eggs/ 301 | .eggs/ 302 | lib/ 303 | lib64/ 304 | parts/ 305 | sdist/ 306 | var/ 307 | wheels/ 308 | share/python-wheels/ 309 | *.egg-info/ 310 | .installed.cfg 311 | *.egg 312 | MANIFEST 313 | 314 | # PyInstaller 315 | # Usually these files are written by a python script from a template 316 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 317 | *.manifest 318 | *.spec 319 | 320 | # Installer logs 321 | pip-log.txt 322 | pip-delete-this-directory.txt 323 | 324 | # Unit test / coverage reports 325 | htmlcov/ 326 | .tox/ 327 | .nox/ 328 | .coverage 329 | .coverage.* 330 | nosetests.xml 331 | coverage.xml 332 | *.cover 333 | *.py,cover 334 | .hypothesis/ 335 | .pytest_cache/ 336 | cover/ 337 | 338 | # Translations 339 | *.mo 340 | *.pot 341 | 342 | # Django stuff: 343 | local_settings.py 344 | db.sqlite3 345 | db.sqlite3-journal 346 | 347 | # Flask stuff: 348 | instance/ 349 | .webassets-cache 350 | 351 | # Scrapy stuff: 352 | .scrapy 353 | 354 | # Sphinx documentation 355 | docs/_build/ 356 | 357 | # PyBuilder 358 | .pybuilder/ 359 | target/ 360 | 361 | # Jupyter Notebook 362 | .ipynb_checkpoints 363 | 364 | # IPython 365 | profile_default/ 366 | ipython_config.py 367 | 368 | # pyenv 369 | # For a library or package, you might want to ignore these files since the code is 370 | # intended to run in multiple environments; otherwise, check them in: 371 | # .python-version 372 | 373 | # pipenv 374 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 375 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 376 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 377 | # install all needed dependencies. 378 | #Pipfile.lock 379 | 380 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 381 | __pypackages__/ 382 | 383 | # Celery stuff 384 | celerybeat-schedule 385 | celerybeat.pid 386 | 387 | # SageMath parsed files 388 | *.sage.py 389 | 390 | # Environments 391 | .venv 392 | env/ 393 | venv/ 394 | ENV/ 395 | env.bak/ 396 | venv.bak/ 397 | 398 | # Spyder project settings 399 | .spyderproject 400 | .spyproject 401 | 402 | # Rope project settings 403 | .ropeproject 404 | 405 | # mkdocs documentation 406 | /site 407 | 408 | # mypy 409 | .mypy_cache/ 410 | .dmypy.json 411 | dmypy.json 412 | 413 | # Pyre type checker 414 | .pyre/ 415 | 416 | # pytype static type analyzer 417 | .pytype/ 418 | 419 | # Cython debug symbols 420 | cython_debug/ 421 | 422 | ### VisualStudioCode ### 423 | .vscode/* 424 | !.vscode/settings.json 425 | !.vscode/tasks.json 426 | !.vscode/launch.json 427 | !.vscode/extensions.json 428 | *.code-workspace 429 | 430 | # Local History for Visual Studio Code 431 | .history/ 432 | 433 | ### VisualStudioCode Patch ### 434 | # Ignore all local history of files 435 | .history 436 | .ionide 437 | 438 | # Support for Project snippet scope 439 | !.vscode/*.code-snippets 440 | 441 | ### Windows ### 442 | # Windows thumbnail cache files 443 | Thumbs.db 444 | Thumbs.db:encryptable 445 | ehthumbs.db 446 | ehthumbs_vista.db 447 | 448 | # Dump file 449 | *.stackdump 450 | 451 | # Folder config file 452 | [Dd]esktop.ini 453 | 454 | # Recycle Bin used on file shares 455 | $RECYCLE.BIN/ 456 | 457 | # Windows Installer files 458 | *.cab 459 | *.msi 460 | *.msix 461 | *.msm 462 | *.msp 463 | 464 | # Windows shortcuts 465 | *.lnk 466 | 467 | # End of https://www.toptal.com/developers/gitignore/api/python,node,visualstudiocode,jetbrains,macos,windows,linux 468 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_install_hook_types: [pre-commit, prepare-commit-msg] 2 | ci: 3 | autofix_commit_msg: ":rotating_light: auto fix by pre-commit hooks" 4 | autofix_prs: true 5 | autoupdate_branch: master 6 | autoupdate_schedule: monthly 7 | autoupdate_commit_msg: ":arrow_up: auto update by pre-commit hooks" 8 | repos: 9 | - repo: https://github.com/astral-sh/ruff-pre-commit 10 | rev: v0.11.12 11 | hooks: 12 | - id: ruff 13 | args: [--fix, --exit-non-zero-on-fix] 14 | stages: [pre-commit] 15 | 16 | - repo: https://github.com/pycqa/isort 17 | rev: 6.0.1 18 | hooks: 19 | - id: isort 20 | stages: [pre-commit] 21 | 22 | - repo: https://github.com/psf/black 23 | rev: 25.1.0 24 | hooks: 25 | - id: black 26 | stages: [pre-commit] 27 | 28 | - repo: https://github.com/nonebot/nonemoji 29 | rev: v0.1.4 30 | hooks: 31 | - id: nonemoji 32 | stages: [prepare-commit-msg] 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 NoneBot 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | nonebot 4 |

5 | 6 |
7 | 8 | # NB CLI Plugin Docker 9 | 10 | _✨ NoneBot2 命令行工具 Docker 插件 ✨_ 11 | 12 |
13 | 14 |

15 | 16 | license 17 | 18 | 19 | pypi 20 | 21 | python 22 | 23 | pre-commit 24 | 25 |
26 | 27 | QQ Chat Group 28 | 29 | 30 | QQ Channel 31 | 32 | 33 | Telegram Channel 34 | 35 | 36 | Discord Server 37 | 38 |

39 | 40 | ## 准备 41 | 42 | 在使用本插件前请确保 Docker CLI 以及 Docker Compose Plugin 已经安装,且可以从命令行直接使用。 43 | 44 | 详细安装方法请参考 [Docker 文档](https://docs.docker.com/engine/install/) 45 | 46 | 官方 Linux 快速安装一键脚本: 47 | 48 | ```bash 49 | curl -fsSL https://get.docker.com | sudo sh 50 | ``` 51 | 52 | ## 安装插件 53 | 54 | ```bash 55 | nb self install nb-cli-plugin-docker 56 | ``` 57 | 58 | ## 使用插件 59 | 60 | ```bash 61 | nb docker 62 | # 其他别名 63 | # nb deploy 64 | # nb compose 65 | ``` 66 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nonebot/cli-plugin-docker/eca5e0ab6900a0e39da55c71a2e7de899bdfd4aa/nb_cli_plugin_docker/__init__.py -------------------------------------------------------------------------------- /nb_cli_plugin_docker/cli.py: -------------------------------------------------------------------------------- 1 | from typing import cast 2 | from pathlib import Path 3 | 4 | import click 5 | from nb_cli import _ 6 | from nb_cli.config import ConfigManager 7 | from noneprompt import Choice, ListPrompt, CancelledError 8 | from nb_cli.cli import CLI_DEFAULT_STYLE, ClickAliasedGroup, run_sync, run_async 9 | from nb_cli.handlers import get_project_root, get_default_python, get_python_version 10 | 11 | from .utils import safe_copy_dir, safe_write_file 12 | from .handler import ( 13 | compose_ps, 14 | compose_up, 15 | compose_down, 16 | compose_logs, 17 | compose_build, 18 | get_driver_type, 19 | get_build_backend, 20 | generate_dockerfile, 21 | generate_compose_file, 22 | ) 23 | 24 | 25 | @click.group(cls=ClickAliasedGroup, invoke_without_command=True) 26 | @click.pass_context 27 | @run_async 28 | async def docker(ctx: click.Context): 29 | """Manage Bot Deployment with Docker.""" 30 | if ctx.invoked_subcommand is not None: 31 | return 32 | 33 | command = cast(ClickAliasedGroup, ctx.command) 34 | 35 | # auto discover sub commands and scripts 36 | choices: list[Choice[click.Command]] = [] 37 | for sub_cmd_name in await run_sync(command.list_commands)(ctx): 38 | if sub_cmd := await run_sync(command.get_command)(ctx, sub_cmd_name): 39 | choices.append( 40 | Choice( 41 | sub_cmd.help 42 | or _("Run subcommand {sub_cmd.name!r}").format(sub_cmd=sub_cmd), 43 | sub_cmd, 44 | ) 45 | ) 46 | 47 | try: 48 | result = await ListPrompt( 49 | _("What do you want to do?"), choices=choices 50 | ).prompt_async(style=CLI_DEFAULT_STYLE) 51 | except CancelledError: 52 | ctx.exit() 53 | 54 | sub_cmd = result.data 55 | await run_sync(ctx.invoke)(sub_cmd) 56 | 57 | 58 | @docker.command() 59 | @click.option( 60 | "-f", 61 | "--force", 62 | is_flag=True, 63 | default=False, 64 | help="Force to re-generate the Dockerfile.", 65 | ) 66 | @click.pass_context 67 | @run_async 68 | async def generate(ctx: click.Context, force: bool): 69 | """Generate Dockerfile and docker-compose.yml.""" 70 | python_path = await get_default_python() 71 | cwd = get_project_root() 72 | 73 | python_version = await get_python_version(python_path=python_path) 74 | python_version = f"{python_version['major']}.{python_version['minor']}" 75 | 76 | is_asgi = await get_driver_type(python_path=python_path, cwd=cwd) 77 | build_backend = await get_build_backend( 78 | config_manager=ConfigManager(working_dir=cwd, python_path=python_path) 79 | ) 80 | 81 | try: 82 | dockerfile = await generate_dockerfile( 83 | python_version=python_version, 84 | is_asgi=is_asgi, 85 | build_backend=build_backend, 86 | ) 87 | await safe_write_file(cwd / "Dockerfile", dockerfile, force=force) 88 | 89 | compose_file = await generate_compose_file(is_asgi=is_asgi) 90 | await safe_write_file(cwd / "docker-compose.yml", compose_file, force=force) 91 | 92 | await safe_copy_dir( 93 | Path(__file__).parent / "static" / "common", cwd, force=force 94 | ) 95 | 96 | if is_asgi: 97 | await safe_copy_dir( 98 | Path(__file__).parent / "static" / "reverse", cwd, force=force 99 | ) 100 | except CancelledError: 101 | ctx.exit() 102 | 103 | 104 | @docker.command(aliases=["run"], context_settings={"ignore_unknown_options": True}) 105 | @click.option( 106 | "-f", 107 | "--force", 108 | is_flag=True, 109 | default=False, 110 | help="Force to re-generate the Dockerfile.", 111 | ) 112 | @click.argument("compose_args", nargs=-1) 113 | @click.pass_context 114 | @run_async 115 | async def up(ctx: click.Context, force: bool, compose_args: list[str]): 116 | """Deploy the bot.""" 117 | cwd = get_project_root() 118 | 119 | if ( 120 | force 121 | or not Path(cwd, "Dockerfile").exists() 122 | or not Path(cwd, "docker-compose.yml").exists() 123 | ): 124 | await run_sync(ctx.invoke)(generate) 125 | 126 | proc = await compose_up(compose_args, cwd=cwd) 127 | await proc.wait() 128 | 129 | 130 | @docker.command(aliases=["stop"], context_settings={"ignore_unknown_options": True}) 131 | @click.argument("compose_args", nargs=-1) 132 | @run_async 133 | async def down(compose_args: list[str]): 134 | """Undeploy the bot.""" 135 | proc = await compose_down(compose_args) 136 | await proc.wait() 137 | 138 | 139 | @docker.command(context_settings={"ignore_unknown_options": True}) 140 | @click.argument("compose_args", nargs=-1) 141 | @run_async 142 | async def build(compose_args: list[str]): 143 | """Build the bot image.""" 144 | proc = await compose_build(compose_args) 145 | await proc.wait() 146 | 147 | 148 | @docker.command(context_settings={"ignore_unknown_options": True}) 149 | @click.argument("compose_args", nargs=-1) 150 | @run_async 151 | async def logs(compose_args: list[str]): 152 | """View the bot logs.""" 153 | proc = await compose_logs(compose_args) 154 | await proc.wait() 155 | 156 | 157 | @docker.command(context_settings={"ignore_unknown_options": True}) 158 | @click.argument("compose_args", nargs=-1) 159 | @run_async 160 | async def ps(compose_args: list[str]): 161 | """View the bot service status.""" 162 | proc = await compose_ps(compose_args) 163 | await proc.wait() 164 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/exception.py: -------------------------------------------------------------------------------- 1 | class ComposeNotAvailable(Exception): 2 | """docker compose is not available.""" 3 | 4 | 5 | class GetDriverTypeError(Exception): 6 | """get driver type error.""" 7 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/handler.py: -------------------------------------------------------------------------------- 1 | import json 2 | import asyncio 3 | from pathlib import Path 4 | from dataclasses import dataclass 5 | from typing import IO, TYPE_CHECKING, Any, Union, Literal, Optional, cast 6 | 7 | from nb_cli import cache 8 | from jinja2 import Environment, FileSystemLoader 9 | from nb_cli.handlers import templates as cli_templates 10 | from nb_cli.config import GLOBAL_CONFIG, SimpleInfo, ConfigManager 11 | from nb_cli.handlers import ( 12 | get_project_root, 13 | requires_nonebot, 14 | get_default_python, 15 | get_nonebot_config, 16 | ensure_process_terminated, 17 | ) 18 | 19 | from .exception import GetDriverTypeError, ComposeNotAvailable 20 | 21 | templates = Environment( 22 | trim_blocks=True, 23 | lstrip_blocks=True, 24 | autoescape=False, 25 | loader=FileSystemLoader( 26 | [ 27 | Path(__file__).parent / "template", 28 | *cast(FileSystemLoader, cli_templates.loader).searchpath, 29 | ] 30 | ), 31 | enable_async=True, 32 | ) 33 | templates.globals.update(cli_templates.globals) 34 | templates.filters.update(cli_templates.filters) 35 | 36 | 37 | @dataclass 38 | class Compose: 39 | command: tuple[str, ...] 40 | info: str 41 | 42 | 43 | if TYPE_CHECKING: 44 | 45 | async def get_compose_command() -> Compose: ... 46 | 47 | else: 48 | 49 | @cache(ttl=None) 50 | async def get_compose_command() -> Compose: 51 | proc = await asyncio.create_subprocess_exec( 52 | "docker", "compose", "version", stdout=asyncio.subprocess.PIPE 53 | ) 54 | stdout, _ = await proc.communicate() 55 | if proc.returncode == 0: 56 | return Compose(command=("docker", "compose"), info=stdout.decode()) 57 | 58 | proc = await asyncio.create_subprocess_exec( 59 | "docker-compose", "version", stdout=asyncio.subprocess.PIPE 60 | ) 61 | stdout, _ = await proc.communicate() 62 | if proc.returncode == 0: 63 | return Compose(command=("docker-compose",), info=stdout.decode()) 64 | 65 | raise ComposeNotAvailable 66 | 67 | 68 | @ensure_process_terminated 69 | async def call_compose( 70 | compose_args: Optional[list[str]] = None, 71 | cwd: Optional[Path] = None, 72 | stdin: Optional[Union[IO[Any], int]] = None, 73 | stdout: Optional[Union[IO[Any], int]] = None, 74 | stderr: Optional[Union[IO[Any], int]] = None, 75 | ) -> asyncio.subprocess.Process: 76 | if cwd is None: 77 | cwd = get_project_root() 78 | 79 | compose = await get_compose_command() 80 | return await asyncio.create_subprocess_exec( 81 | *compose.command, 82 | *(compose_args or []), 83 | cwd=cwd, 84 | stdin=stdin, 85 | stdout=stdout, 86 | stderr=stderr, 87 | ) 88 | 89 | 90 | async def compose_up( 91 | compose_args: Optional[list[str]] = None, 92 | cwd: Optional[Path] = None, 93 | stdin: Optional[Union[IO[Any], int]] = None, 94 | stdout: Optional[Union[IO[Any], int]] = None, 95 | stderr: Optional[Union[IO[Any], int]] = None, 96 | ) -> asyncio.subprocess.Process: 97 | return await call_compose( 98 | ["up", "-d", "--build", *(compose_args or [])], 99 | cwd=cwd, 100 | stdin=stdin, 101 | stdout=stdout, 102 | stderr=stderr, 103 | ) 104 | 105 | 106 | async def compose_down( 107 | compose_args: Optional[list[str]] = None, 108 | cwd: Optional[Path] = None, 109 | stdin: Optional[Union[IO[Any], int]] = None, 110 | stdout: Optional[Union[IO[Any], int]] = None, 111 | stderr: Optional[Union[IO[Any], int]] = None, 112 | ) -> asyncio.subprocess.Process: 113 | return await call_compose( 114 | ["down", *(compose_args or [])], 115 | cwd=cwd, 116 | stdin=stdin, 117 | stdout=stdout, 118 | stderr=stderr, 119 | ) 120 | 121 | 122 | async def compose_build( 123 | compose_args: Optional[list[str]] = None, 124 | cwd: Optional[Path] = None, 125 | stdin: Optional[Union[IO[Any], int]] = None, 126 | stdout: Optional[Union[IO[Any], int]] = None, 127 | stderr: Optional[Union[IO[Any], int]] = None, 128 | ) -> asyncio.subprocess.Process: 129 | return await call_compose( 130 | ["build", *(compose_args or [])], 131 | cwd=cwd, 132 | stdin=stdin, 133 | stdout=stdout, 134 | stderr=stderr, 135 | ) 136 | 137 | 138 | async def compose_logs( 139 | compose_args: Optional[list[str]] = None, 140 | cwd: Optional[Path] = None, 141 | stdin: Optional[Union[IO[Any], int]] = None, 142 | stdout: Optional[Union[IO[Any], int]] = None, 143 | stderr: Optional[Union[IO[Any], int]] = None, 144 | ) -> asyncio.subprocess.Process: 145 | return await call_compose( 146 | ["logs", *(compose_args or [])], 147 | cwd=cwd, 148 | stdin=stdin, 149 | stdout=stdout, 150 | stderr=stderr, 151 | ) 152 | 153 | 154 | async def compose_ps( 155 | compose_args: Optional[list[str]] = None, 156 | cwd: Optional[Path] = None, 157 | stdin: Optional[Union[IO[Any], int]] = None, 158 | stdout: Optional[Union[IO[Any], int]] = None, 159 | stderr: Optional[Union[IO[Any], int]] = None, 160 | ) -> asyncio.subprocess.Process: 161 | return await call_compose( 162 | ["ps", *(compose_args or [])], 163 | cwd=cwd, 164 | stdin=stdin, 165 | stdout=stdout, 166 | stderr=stderr, 167 | ) 168 | 169 | 170 | @requires_nonebot 171 | async def get_driver_type( 172 | adapters: Optional[list[SimpleInfo]] = None, 173 | builtin_plugins: Optional[list[str]] = None, 174 | python_path: Optional[str] = None, 175 | cwd: Optional[Path] = None, 176 | ) -> bool: 177 | bot_config = get_nonebot_config() 178 | if adapters is None: 179 | adapters = bot_config.adapters 180 | if builtin_plugins is None: 181 | builtin_plugins = bot_config.builtin_plugins 182 | if python_path is None: 183 | python_path = await get_default_python() 184 | if cwd is None: 185 | cwd = get_project_root() 186 | 187 | t = templates.get_template("docker/get_driver_type.py.jinja") 188 | proc = await asyncio.create_subprocess_exec( 189 | python_path, 190 | "-W", 191 | "ignore", 192 | "-c", 193 | await t.render_async(adapters=adapters, builtin_plugins=builtin_plugins), 194 | cwd=cwd, 195 | stdout=asyncio.subprocess.PIPE, 196 | stderr=asyncio.subprocess.PIPE, 197 | ) 198 | stdout, stderr = await proc.communicate() 199 | if proc.returncode != 0: 200 | raise GetDriverTypeError(stdout, stderr) 201 | 202 | try: 203 | return json.loads(stdout.strip()) 204 | except Exception as e: 205 | raise GetDriverTypeError(stdout, stderr) from e 206 | 207 | 208 | async def get_build_backend( 209 | config_manager: Optional[ConfigManager] = None, 210 | ) -> Optional[Literal["poetry", "pdm", "pip"]]: 211 | if config_manager is None: 212 | config_manager = GLOBAL_CONFIG 213 | 214 | if data := config_manager._get_data(): 215 | backend = data.get("build-system", {}).get("build-backend", "") 216 | if "poetry" in backend: 217 | return "poetry" 218 | elif "pdm" in backend: 219 | return "pdm" 220 | if (config_manager.project_root / "requirements.txt").exists(): 221 | return "pip" 222 | 223 | 224 | async def generate_dockerfile( 225 | python_version: str, is_asgi: bool, build_backend: Optional[str] 226 | ): 227 | t = templates.get_template( 228 | "docker/reverse.Dockerfile.jinja" 229 | if is_asgi 230 | else "docker/forward.Dockerfile.jinja" 231 | ) 232 | return await t.render_async( 233 | python_version=python_version, build_backend=build_backend 234 | ) 235 | 236 | 237 | async def generate_compose_file(is_asgi: bool): 238 | t = templates.get_template("docker/docker-compose.yml.jinja") 239 | return await t.render_async(is_asgi=is_asgi) 240 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/plugin.py: -------------------------------------------------------------------------------- 1 | from typing import cast 2 | 3 | from nb_cli.cli import CLIMainGroup, cli 4 | 5 | from .cli import docker 6 | 7 | 8 | def install(): 9 | cli_ = cast(CLIMainGroup, cli) 10 | cli_.add_command(docker) 11 | cli_.add_aliases("docker", ["deploy", "compose"]) 12 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/static/common/.dockerignore: -------------------------------------------------------------------------------- 1 | # ----- Project ----- 2 | 3 | # .env.* 4 | .dockerignore 5 | Dockerfile 6 | docker-compose.yml 7 | README.md 8 | 9 | # Created by https://www.toptal.com/developers/gitignore/api/python,node,visualstudiocode,jetbrains,macos,windows,linux 10 | # Edit at https://www.toptal.com/developers/gitignore?templates=python,node,visualstudiocode,jetbrains,macos,windows,linux 11 | 12 | ### JetBrains ### 13 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 14 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 15 | 16 | # User-specific stuff 17 | .idea/**/workspace.xml 18 | .idea/**/tasks.xml 19 | .idea/**/usage.statistics.xml 20 | .idea/**/dictionaries 21 | .idea/**/shelf 22 | 23 | # AWS User-specific 24 | .idea/**/aws.xml 25 | 26 | # Generated files 27 | .idea/**/contentModel.xml 28 | 29 | # Sensitive or high-churn files 30 | .idea/**/dataSources/ 31 | .idea/**/dataSources.ids 32 | .idea/**/dataSources.local.xml 33 | .idea/**/sqlDataSources.xml 34 | .idea/**/dynamic.xml 35 | .idea/**/uiDesigner.xml 36 | .idea/**/dbnavigator.xml 37 | 38 | # Gradle 39 | .idea/**/gradle.xml 40 | .idea/**/libraries 41 | 42 | # Gradle and Maven with auto-import 43 | # When using Gradle or Maven with auto-import, you should exclude module files, 44 | # since they will be recreated, and may cause churn. Uncomment if using 45 | # auto-import. 46 | # .idea/artifacts 47 | # .idea/compiler.xml 48 | # .idea/jarRepositories.xml 49 | # .idea/modules.xml 50 | # .idea/*.iml 51 | # .idea/modules 52 | # *.iml 53 | # *.ipr 54 | 55 | # CMake 56 | cmake-build-*/ 57 | 58 | # Mongo Explorer plugin 59 | .idea/**/mongoSettings.xml 60 | 61 | # File-based project format 62 | *.iws 63 | 64 | # IntelliJ 65 | out/ 66 | 67 | # mpeltonen/sbt-idea plugin 68 | .idea_modules/ 69 | 70 | # JIRA plugin 71 | atlassian-ide-plugin.xml 72 | 73 | # Cursive Clojure plugin 74 | .idea/replstate.xml 75 | 76 | # Crashlytics plugin (for Android Studio and IntelliJ) 77 | com_crashlytics_export_strings.xml 78 | crashlytics.properties 79 | crashlytics-build.properties 80 | fabric.properties 81 | 82 | # Editor-based Rest Client 83 | .idea/httpRequests 84 | 85 | # Android studio 3.1+ serialized cache file 86 | .idea/caches/build_file_checksums.ser 87 | 88 | ### JetBrains Patch ### 89 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 90 | 91 | # *.iml 92 | # modules.xml 93 | # .idea/misc.xml 94 | # *.ipr 95 | 96 | # Sonarlint plugin 97 | # https://plugins.jetbrains.com/plugin/7973-sonarlint 98 | .idea/**/sonarlint/ 99 | 100 | # SonarQube Plugin 101 | # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin 102 | .idea/**/sonarIssues.xml 103 | 104 | # Markdown Navigator plugin 105 | # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced 106 | .idea/**/markdown-navigator.xml 107 | .idea/**/markdown-navigator-enh.xml 108 | .idea/**/markdown-navigator/ 109 | 110 | # Cache file creation bug 111 | # See https://youtrack.jetbrains.com/issue/JBR-2257 112 | .idea/$CACHE_FILE$ 113 | 114 | # CodeStream plugin 115 | # https://plugins.jetbrains.com/plugin/12206-codestream 116 | .idea/codestream.xml 117 | 118 | ### Linux ### 119 | *~ 120 | 121 | # temporary files which can be created if a process still has a handle open of a deleted file 122 | .fuse_hidden* 123 | 124 | # KDE directory preferences 125 | .directory 126 | 127 | # Linux trash folder which might appear on any partition or disk 128 | .Trash-* 129 | 130 | # .nfs files are created when an open file is removed but is still being accessed 131 | .nfs* 132 | 133 | ### macOS ### 134 | # General 135 | .DS_Store 136 | .AppleDouble 137 | .LSOverride 138 | 139 | # Icon must end with two \r 140 | Icon 141 | 142 | # Thumbnails 143 | ._* 144 | 145 | # Files that might appear in the root of a volume 146 | .DocumentRevisions-V100 147 | .fseventsd 148 | .Spotlight-V100 149 | .TemporaryItems 150 | .Trashes 151 | .VolumeIcon.icns 152 | .com.apple.timemachine.donotpresent 153 | 154 | # Directories potentially created on remote AFP share 155 | .AppleDB 156 | .AppleDesktop 157 | Network Trash Folder 158 | Temporary Items 159 | .apdisk 160 | 161 | ### Node ### 162 | # Logs 163 | logs 164 | *.log 165 | npm-debug.log* 166 | yarn-debug.log* 167 | yarn-error.log* 168 | lerna-debug.log* 169 | .pnpm-debug.log* 170 | 171 | # Diagnostic reports (https://nodejs.org/api/report.html) 172 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 173 | 174 | # Runtime data 175 | pids 176 | *.pid 177 | *.seed 178 | *.pid.lock 179 | 180 | # Directory for instrumented libs generated by jscoverage/JSCover 181 | lib-cov 182 | 183 | # Coverage directory used by tools like istanbul 184 | coverage 185 | *.lcov 186 | 187 | # nyc test coverage 188 | .nyc_output 189 | 190 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 191 | .grunt 192 | 193 | # Bower dependency directory (https://bower.io/) 194 | bower_components 195 | 196 | # node-waf configuration 197 | .lock-wscript 198 | 199 | # Compiled binary addons (https://nodejs.org/api/addons.html) 200 | build/Release 201 | 202 | # Dependency directories 203 | node_modules/ 204 | jspm_packages/ 205 | 206 | # Snowpack dependency directory (https://snowpack.dev/) 207 | web_modules/ 208 | 209 | # TypeScript cache 210 | *.tsbuildinfo 211 | 212 | # Optional npm cache directory 213 | .npm 214 | 215 | # Optional eslint cache 216 | .eslintcache 217 | 218 | # Microbundle cache 219 | .rpt2_cache/ 220 | .rts2_cache_cjs/ 221 | .rts2_cache_es/ 222 | .rts2_cache_umd/ 223 | 224 | # Optional REPL history 225 | .node_repl_history 226 | 227 | # Output of 'npm pack' 228 | *.tgz 229 | 230 | # Yarn Integrity file 231 | .yarn-integrity 232 | 233 | # dotenv environment variables file 234 | # .env 235 | .env.test 236 | .env.production 237 | 238 | # parcel-bundler cache (https://parceljs.org/) 239 | .cache 240 | .parcel-cache 241 | 242 | # Next.js build output 243 | .next 244 | out 245 | 246 | # Nuxt.js build / generate output 247 | .nuxt 248 | dist 249 | 250 | # Gatsby files 251 | .cache/ 252 | # Comment in the public line in if your project uses Gatsby and not Next.js 253 | # https://nextjs.org/blog/next-9-1#public-directory-support 254 | # public 255 | 256 | # vuepress build output 257 | .vuepress/dist 258 | 259 | # Serverless directories 260 | .serverless/ 261 | 262 | # FuseBox cache 263 | .fusebox/ 264 | 265 | # DynamoDB Local files 266 | .dynamodb/ 267 | 268 | # TernJS port file 269 | .tern-port 270 | 271 | # Stores VSCode versions used for testing VSCode extensions 272 | .vscode-test 273 | 274 | # yarn v2 275 | .yarn/cache 276 | .yarn/unplugged 277 | .yarn/build-state.yml 278 | .yarn/install-state.gz 279 | .pnp.* 280 | 281 | ### Node Patch ### 282 | # Serverless Webpack directories 283 | .webpack/ 284 | 285 | # Optional stylelint cache 286 | .stylelintcache 287 | 288 | # SvelteKit build / generate output 289 | .svelte-kit 290 | 291 | ### Python ### 292 | # Byte-compiled / optimized / DLL files 293 | __pycache__/ 294 | *.py[cod] 295 | *$py.class 296 | 297 | # C extensions 298 | *.so 299 | 300 | # Distribution / packaging 301 | .Python 302 | build/ 303 | develop-eggs/ 304 | dist/ 305 | downloads/ 306 | eggs/ 307 | .eggs/ 308 | lib/ 309 | lib64/ 310 | parts/ 311 | sdist/ 312 | var/ 313 | wheels/ 314 | share/python-wheels/ 315 | *.egg-info/ 316 | .installed.cfg 317 | *.egg 318 | MANIFEST 319 | 320 | # PyInstaller 321 | # Usually these files are written by a python script from a template 322 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 323 | *.manifest 324 | *.spec 325 | 326 | # Installer logs 327 | pip-log.txt 328 | pip-delete-this-directory.txt 329 | 330 | # Unit test / coverage reports 331 | htmlcov/ 332 | .tox/ 333 | .nox/ 334 | .coverage 335 | .coverage.* 336 | nosetests.xml 337 | coverage.xml 338 | *.cover 339 | *.py,cover 340 | .hypothesis/ 341 | .pytest_cache/ 342 | cover/ 343 | 344 | # Translations 345 | *.mo 346 | *.pot 347 | 348 | # Django stuff: 349 | local_settings.py 350 | db.sqlite3 351 | db.sqlite3-journal 352 | 353 | # Flask stuff: 354 | instance/ 355 | .webassets-cache 356 | 357 | # Scrapy stuff: 358 | .scrapy 359 | 360 | # Sphinx documentation 361 | docs/_build/ 362 | 363 | # PyBuilder 364 | .pybuilder/ 365 | target/ 366 | 367 | # Jupyter Notebook 368 | .ipynb_checkpoints 369 | 370 | # IPython 371 | profile_default/ 372 | ipython_config.py 373 | 374 | # pyenv 375 | # For a library or package, you might want to ignore these files since the code is 376 | # intended to run in multiple environments; otherwise, check them in: 377 | # .python-version 378 | 379 | # pipenv 380 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 381 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 382 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 383 | # install all needed dependencies. 384 | #Pipfile.lock 385 | 386 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 387 | __pypackages__/ 388 | 389 | # Celery stuff 390 | celerybeat-schedule 391 | celerybeat.pid 392 | 393 | # SageMath parsed files 394 | *.sage.py 395 | 396 | # Environments 397 | .venv 398 | env/ 399 | venv/ 400 | ENV/ 401 | env.bak/ 402 | venv.bak/ 403 | 404 | # Spyder project settings 405 | .spyderproject 406 | .spyproject 407 | 408 | # Rope project settings 409 | .ropeproject 410 | 411 | # mkdocs documentation 412 | /site 413 | 414 | # mypy 415 | .mypy_cache/ 416 | .dmypy.json 417 | dmypy.json 418 | 419 | # Pyre type checker 420 | .pyre/ 421 | 422 | # pytype static type analyzer 423 | .pytype/ 424 | 425 | # Cython debug symbols 426 | cython_debug/ 427 | 428 | ### VisualStudioCode ### 429 | .vscode/* 430 | # !.vscode/settings.json 431 | # !.vscode/tasks.json 432 | # !.vscode/launch.json 433 | # !.vscode/extensions.json 434 | *.code-workspace 435 | 436 | # Local History for Visual Studio Code 437 | .history/ 438 | 439 | ### VisualStudioCode Patch ### 440 | # Ignore all local history of files 441 | .history 442 | .ionide 443 | 444 | # Support for Project snippet scope 445 | !.vscode/*.code-snippets 446 | 447 | ### Windows ### 448 | # Windows thumbnail cache files 449 | Thumbs.db 450 | Thumbs.db:encryptable 451 | ehthumbs.db 452 | ehthumbs_vista.db 453 | 454 | # Dump file 455 | *.stackdump 456 | 457 | # Folder config file 458 | [Dd]esktop.ini 459 | 460 | # Recycle Bin used on file shares 461 | $RECYCLE.BIN/ 462 | 463 | # Windows Installer files 464 | *.cab 465 | *.msi 466 | *.msix 467 | *.msm 468 | *.msp 469 | 470 | # Windows shortcuts 471 | *.lnk 472 | 473 | # End of https://www.toptal.com/developers/gitignore/api/python,node,visualstudiocode,jetbrains,macos,windows,linux 474 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/static/reverse/docker/_main.py: -------------------------------------------------------------------------------- 1 | import nonebot 2 | import bot # noqa: F401 3 | 4 | app = nonebot.get_asgi() 5 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/static/reverse/docker/gunicorn_conf.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import multiprocessing 4 | 5 | host = os.getenv("HOST", "0.0.0.0") 6 | port = os.getenv("PORT", "8080") 7 | bind_env = os.getenv("BIND", None) 8 | use_bind = bind_env or f"{host}:{port}" 9 | 10 | use_loglevel = os.getenv("LOG_LEVEL", "info") 11 | accesslog_var = os.getenv("ACCESS_LOG", "-") 12 | use_accesslog = accesslog_var or None 13 | errorlog_var = os.getenv("ERROR_LOG", "-") 14 | use_errorlog = errorlog_var or None 15 | 16 | cores = multiprocessing.cpu_count() 17 | workers_per_core_str = os.getenv("WORKERS_PER_CORE", "1") 18 | workers_per_core = float(workers_per_core_str) 19 | default_web_concurrency = workers_per_core * cores 20 | max_workers_str = os.getenv("MAX_WORKERS") 21 | use_max_workers = int(max_workers_str) if max_workers_str else None 22 | if web_concurrency_str := os.getenv("WEB_CONCURRENCY", None): 23 | web_concurrency = int(web_concurrency_str) 24 | assert web_concurrency > 0 25 | else: 26 | web_concurrency = max(int(default_web_concurrency), 2) 27 | if use_max_workers: 28 | web_concurrency = min(web_concurrency, use_max_workers) 29 | 30 | graceful_timeout_str = os.getenv("GRACEFUL_TIMEOUT", "120") 31 | timeout_str = os.getenv("TIMEOUT", "120") 32 | keepalive_str = os.getenv("KEEP_ALIVE", "5") 33 | 34 | # Gunicorn config variables 35 | loglevel = use_loglevel 36 | workers = web_concurrency 37 | bind = use_bind 38 | errorlog = use_errorlog 39 | worker_tmp_dir = "/dev/shm" 40 | accesslog = use_accesslog 41 | graceful_timeout = int(graceful_timeout_str) 42 | timeout = int(timeout_str) 43 | keepalive = int(keepalive_str) 44 | keyfile = os.getenv("KEYFILE", None) 45 | certfile = os.getenv("CERTFILE", None) 46 | 47 | logconfig_dict = { 48 | "root": {"level": "INFO", "handlers": ["default"]}, 49 | "handlers": {"default": {"class": "nonebot.log.LoguruHandler"}}, 50 | "loggers": { 51 | "gunicorn.error": { 52 | "level": "INFO", 53 | "handlers": ["default"], 54 | "propagate": True, 55 | "qualname": "gunicorn.error", 56 | }, 57 | "gunicorn.access": { 58 | "level": "INFO", 59 | "handlers": ["default"], 60 | "propagate": True, 61 | "qualname": "gunicorn.access", 62 | }, 63 | }, 64 | } 65 | 66 | # For debugging and testing 67 | log_data = { 68 | "loglevel": loglevel, 69 | "workers": workers, 70 | "bind": bind, 71 | "graceful_timeout": graceful_timeout, 72 | "timeout": timeout, 73 | "keepalive": keepalive, 74 | "errorlog": errorlog, 75 | "accesslog": accesslog, 76 | # Additional, non-gunicorn variables 77 | "workers_per_core": workers_per_core, 78 | "use_max_workers": use_max_workers, 79 | "host": host, 80 | "port": port, 81 | } 82 | print(json.dumps(log_data)) # noqa: T201 83 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/static/reverse/docker/start.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env sh 2 | set -e 3 | 4 | if [ -f /app/app/main.py ]; then 5 | DEFAULT_MODULE_NAME=app.main 6 | elif [ -f /app/main.py ]; then 7 | DEFAULT_MODULE_NAME=main 8 | fi 9 | MODULE_NAME=${MODULE_NAME:-$DEFAULT_MODULE_NAME} 10 | VARIABLE_NAME=${VARIABLE_NAME:-app} 11 | export APP_MODULE=${APP_MODULE:-"$MODULE_NAME:$VARIABLE_NAME"} 12 | 13 | if [ -f /app/gunicorn_conf.py ]; then 14 | DEFAULT_GUNICORN_CONF=/app/gunicorn_conf.py 15 | elif [ -f /app/app/gunicorn_conf.py ]; then 16 | DEFAULT_GUNICORN_CONF=/app/app/gunicorn_conf.py 17 | else 18 | DEFAULT_GUNICORN_CONF=/gunicorn_conf.py 19 | fi 20 | export GUNICORN_CONF=${GUNICORN_CONF:-$DEFAULT_GUNICORN_CONF} 21 | export WORKER_CLASS=${WORKER_CLASS:-"uvicorn.workers.UvicornWorker"} 22 | 23 | # If there's a prestart.sh script in the /app directory or other path specified, run it before starting 24 | PRE_START_PATH=${PRE_START_PATH:-/app/prestart.sh} 25 | echo "Checking for script in $PRE_START_PATH" 26 | if [ -f $PRE_START_PATH ]; then 27 | echo "Running script $PRE_START_PATH" 28 | . "$PRE_START_PATH" 29 | else 30 | echo "There is no script $PRE_START_PATH" 31 | fi 32 | 33 | # Start Gunicorn 34 | exec gunicorn -k "$WORKER_CLASS" -c "$GUNICORN_CONF" "$APP_MODULE" 35 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/template/docker/_helpers.Dockerfile.jinja: -------------------------------------------------------------------------------- 1 | {% macro requirements_stage(python_version, build_backend) %} 2 | FROM python:{{ python_version }} as requirements_stage 3 | 4 | WORKDIR /wheel 5 | 6 | RUN python -m pip install --user pipx 7 | 8 | COPY ./pyproject.toml{% if build_backend == "poetry" %} \ 9 | ./poetry.lock{% elif build_backend == "pdm" %} \ 10 | ./pdm.lock{% elif build_backend == "pip" %} \ 11 | ./requirements.txt{% endif %} \ 12 | /wheel/ 13 | 14 | {% if build_backend == "poetry" %} 15 | RUN python -m pipx run --no-cache poetry export -f requirements.txt --output requirements.txt --without-hashes 16 | {% elif build_backend == "pdm" %} 17 | RUN python -m pipx run --no-cache pdm export -f requirements --output requirements.txt --without-hashes 18 | {% endif %} 19 | 20 | {% if build_backend %} 21 | RUN python -m pip wheel --wheel-dir=/wheel --no-cache-dir --requirement ./requirements.txt 22 | {% endif %} 23 | 24 | RUN python -m pipx run --no-cache nb-cli generate -f /tmp/bot.py 25 | {% endmacro %} 26 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/template/docker/docker-compose.yml.jinja: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | {% if is_asgi %} 4 | x-config-host: &config-host ${HOST:-0.0.0.0} 5 | x-config-port: &config-port ${PORT:-8080} 6 | {% endif %} 7 | 8 | services: 9 | nonebot: 10 | build: . 11 | {% if is_asgi %} 12 | ports: 13 | - *config-port 14 | {% endif %} 15 | env_file: 16 | - .env.prod 17 | environment: 18 | ENVIRONMENT: prod 19 | {% if is_asgi %} 20 | HOST: *config-host 21 | PORT: *config-port 22 | {% endif %} 23 | restart: always 24 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/template/docker/forward.Dockerfile.jinja: -------------------------------------------------------------------------------- 1 | {% from "docker/_helpers.Dockerfile.jinja" import requirements_stage, reverse_config -%} 2 | 3 | {{ requirements_stage(python_version, build_backend) }} 4 | 5 | FROM python:{{ python_version }}-slim 6 | 7 | WORKDIR /app 8 | 9 | ENV TZ Asia/Shanghai 10 | ENV PYTHONPATH=/app 11 | 12 | COPY --from=requirements_stage /tmp/bot.py /app 13 | 14 | {% if build_backend %} 15 | COPY --from=requirements_stage /wheel /wheel 16 | {% endif %} 17 | 18 | RUN pip install --no-cache-dir nonebot2{% if build_backend %} \ 19 | && pip install --no-cache-dir --no-index --force-reinstall --find-links=/wheel -r /wheel/requirements.txt && rm -rf /wheel{% endif %} 20 | 21 | COPY . /app/ 22 | 23 | CMD ["python", "bot.py"] 24 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/template/docker/get_driver_type.py.jinja: -------------------------------------------------------------------------------- 1 | {% from "project/_prepare.py.jinja" import prepare_bot %} 2 | 3 | import json 4 | import nonebot 5 | from nonebot.log import logger 6 | from nonebot.drivers import ASGIMixin 7 | 8 | logger.remove() 9 | 10 | {{ prepare_bot(adapters, builtin_plugins) }} 11 | 12 | driver = nonebot.get_driver() 13 | print(json.dumps(isinstance(driver, ASGIMixin))) 14 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/template/docker/reverse.Dockerfile.jinja: -------------------------------------------------------------------------------- 1 | {% from "docker/_helpers.Dockerfile.jinja" import requirements_stage -%} 2 | 3 | {{ requirements_stage(python_version, build_backend) }} 4 | 5 | FROM python:{{ python_version }}-slim 6 | 7 | WORKDIR /app 8 | 9 | ENV TZ Asia/Shanghai 10 | ENV PYTHONPATH=/app 11 | 12 | COPY ./docker/gunicorn_conf.py ./docker/start.sh / 13 | RUN chmod +x /start.sh 14 | 15 | ENV APP_MODULE _main:app 16 | ENV MAX_WORKERS 1 17 | 18 | COPY --from=requirements_stage /tmp/bot.py /app 19 | COPY ./docker/_main.py /app 20 | {% if build_backend %} 21 | COPY --from=requirements_stage /wheel /wheel 22 | {% endif %} 23 | 24 | RUN pip install --no-cache-dir gunicorn uvicorn[standard] nonebot2{% if build_backend %} \ 25 | && pip install --no-cache-dir --no-index --force-reinstall --find-links=/wheel -r /wheel/requirements.txt && rm -rf /wheel{% endif %} 26 | 27 | COPY . /app/ 28 | 29 | CMD ["/start.sh"] 30 | -------------------------------------------------------------------------------- /nb_cli_plugin_docker/utils.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from typing import Union, Optional 3 | 4 | from noneprompt import ConfirmPrompt 5 | 6 | 7 | async def safe_write_file( 8 | file_path: Path, content: Union[str, bytes], force: bool = False 9 | ) -> Optional[int]: 10 | directory = file_path.parent 11 | if not directory.exists(): 12 | directory.mkdir(exist_ok=True, parents=True) 13 | elif not directory.is_dir(): 14 | raise RuntimeError(f"File {directory} already exists and is not a directory") 15 | 16 | if ( 17 | file_path.exists() 18 | and not force 19 | and not await ConfirmPrompt( 20 | f"File {file_path} already exists, overwrite?", 21 | default_choice=False, 22 | ).prompt_async() 23 | ): 24 | return 25 | 26 | return ( 27 | file_path.write_text(content, encoding="utf-8") 28 | if isinstance(content, str) 29 | else file_path.write_bytes(content) 30 | ) 31 | 32 | 33 | async def safe_copy_dir(source: Path, destination: Path, force: bool = False): 34 | if not source.exists(): 35 | raise RuntimeError(f"Directory {source} does not exist") 36 | if not source.is_dir(): 37 | raise RuntimeError(f"Path {source} is not a directory") 38 | 39 | if not destination.exists(): 40 | destination.mkdir(exist_ok=True, parents=True) 41 | elif not destination.is_dir(): 42 | raise RuntimeError(f"File {destination} already exists and is not a directory") 43 | 44 | for file in source.iterdir(): 45 | if file.is_dir(): 46 | await safe_copy_dir(file, destination / file.name, force=force) 47 | else: 48 | await safe_write_file( 49 | destination / file.name, file.read_bytes(), force=force 50 | ) 51 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "annotated-types" 5 | version = "0.7.0" 6 | description = "Reusable constraint types to use with typing.Annotated" 7 | optional = false 8 | python-versions = ">=3.8" 9 | files = [ 10 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 11 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 12 | ] 13 | 14 | [[package]] 15 | name = "anyio" 16 | version = "4.6.2.post1" 17 | description = "High level compatibility layer for multiple asynchronous event loop implementations" 18 | optional = false 19 | python-versions = ">=3.9" 20 | files = [ 21 | {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, 22 | {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, 23 | ] 24 | 25 | [package.dependencies] 26 | exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} 27 | idna = ">=2.8" 28 | sniffio = ">=1.1" 29 | typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} 30 | 31 | [package.extras] 32 | doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] 33 | test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] 34 | trio = ["trio (>=0.26.1)"] 35 | 36 | [[package]] 37 | name = "arrow" 38 | version = "1.3.0" 39 | description = "Better dates & times for Python" 40 | optional = false 41 | python-versions = ">=3.8" 42 | files = [ 43 | {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, 44 | {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, 45 | ] 46 | 47 | [package.dependencies] 48 | python-dateutil = ">=2.7.0" 49 | types-python-dateutil = ">=2.8.10" 50 | 51 | [package.extras] 52 | doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] 53 | test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] 54 | 55 | [[package]] 56 | name = "binaryornot" 57 | version = "0.4.4" 58 | description = "Ultra-lightweight pure Python package to check if a file is binary or text." 59 | optional = false 60 | python-versions = "*" 61 | files = [ 62 | {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, 63 | {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, 64 | ] 65 | 66 | [package.dependencies] 67 | chardet = ">=3.0.2" 68 | 69 | [[package]] 70 | name = "black" 71 | version = "24.10.0" 72 | description = "The uncompromising code formatter." 73 | optional = false 74 | python-versions = ">=3.9" 75 | files = [ 76 | {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, 77 | {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, 78 | {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, 79 | {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, 80 | {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, 81 | {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, 82 | {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, 83 | {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, 84 | {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, 85 | {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, 86 | {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, 87 | {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, 88 | {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, 89 | {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, 90 | {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, 91 | {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, 92 | {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, 93 | {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, 94 | {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, 95 | {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, 96 | {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, 97 | {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, 98 | ] 99 | 100 | [package.dependencies] 101 | click = ">=8.0.0" 102 | mypy-extensions = ">=0.4.3" 103 | packaging = ">=22.0" 104 | pathspec = ">=0.9.0" 105 | platformdirs = ">=2" 106 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 107 | typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} 108 | 109 | [package.extras] 110 | colorama = ["colorama (>=0.4.3)"] 111 | d = ["aiohttp (>=3.10)"] 112 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 113 | uvloop = ["uvloop (>=0.15.2)"] 114 | 115 | [[package]] 116 | name = "cashews" 117 | version = "7.3.2" 118 | description = "cache tools with async power" 119 | optional = false 120 | python-versions = ">=3.8" 121 | files = [ 122 | {file = "cashews-7.3.2-py3-none-any.whl", hash = "sha256:05005d3383957c9df5433fff9977d88022444184fd7834ad6664d00487dc1b38"}, 123 | {file = "cashews-7.3.2.tar.gz", hash = "sha256:08e2ea1525a9d3a264cfa2448189ec44f0253c357a7d40d54d9039108b7f868c"}, 124 | ] 125 | 126 | [package.extras] 127 | dill = ["dill"] 128 | diskcache = ["diskcache (>=5.0.0)"] 129 | lint = ["mypy (>=1.5.0)", "types-redis"] 130 | redis = ["redis (>=4.3.1,!=5.0.1)"] 131 | speedup = ["bitarray (<3.0.0)", "hiredis", "xxhash (<4.0.0)"] 132 | tests = ["hypothesis (==6.112.2)", "pytest (==8.3.3)", "pytest-asyncio (==0.24.0)", "pytest-cov (==5.0.0)", "pytest-rerunfailures (==14.0)"] 133 | 134 | [[package]] 135 | name = "certifi" 136 | version = "2024.8.30" 137 | description = "Python package for providing Mozilla's CA Bundle." 138 | optional = false 139 | python-versions = ">=3.6" 140 | files = [ 141 | {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, 142 | {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, 143 | ] 144 | 145 | [[package]] 146 | name = "cfgv" 147 | version = "3.4.0" 148 | description = "Validate configuration and produce human readable error messages." 149 | optional = false 150 | python-versions = ">=3.8" 151 | files = [ 152 | {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, 153 | {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, 154 | ] 155 | 156 | [[package]] 157 | name = "chardet" 158 | version = "5.2.0" 159 | description = "Universal encoding detector for Python 3" 160 | optional = false 161 | python-versions = ">=3.7" 162 | files = [ 163 | {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, 164 | {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, 165 | ] 166 | 167 | [[package]] 168 | name = "charset-normalizer" 169 | version = "3.4.0" 170 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 171 | optional = false 172 | python-versions = ">=3.7.0" 173 | files = [ 174 | {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, 175 | {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, 176 | {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, 177 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, 178 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, 179 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, 180 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, 181 | {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, 182 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, 183 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, 184 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, 185 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, 186 | {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, 187 | {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, 188 | {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, 189 | {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, 190 | {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, 191 | {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, 192 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, 193 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, 194 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, 195 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, 196 | {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, 197 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, 198 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, 199 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, 200 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, 201 | {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, 202 | {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, 203 | {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, 204 | {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, 205 | {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, 206 | {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, 207 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, 208 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, 209 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, 210 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, 211 | {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, 212 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, 213 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, 214 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, 215 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, 216 | {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, 217 | {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, 218 | {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, 219 | {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, 220 | {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, 221 | {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, 222 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, 223 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, 224 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, 225 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, 226 | {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, 227 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, 228 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, 229 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, 230 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, 231 | {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, 232 | {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, 233 | {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, 234 | {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, 235 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, 236 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, 237 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, 238 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, 239 | {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, 240 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, 241 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, 242 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, 243 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, 244 | {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, 245 | {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, 246 | {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, 247 | {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, 248 | {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, 249 | {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, 250 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, 251 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, 252 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, 253 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, 254 | {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, 255 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, 256 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, 257 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, 258 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, 259 | {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, 260 | {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, 261 | {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, 262 | {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, 263 | {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, 264 | {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, 265 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, 266 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, 267 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, 268 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, 269 | {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, 270 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, 271 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, 272 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, 273 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, 274 | {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, 275 | {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, 276 | {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, 277 | {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, 278 | {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, 279 | ] 280 | 281 | [[package]] 282 | name = "click" 283 | version = "8.1.7" 284 | description = "Composable command line interface toolkit" 285 | optional = false 286 | python-versions = ">=3.7" 287 | files = [ 288 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 289 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 290 | ] 291 | 292 | [package.dependencies] 293 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 294 | 295 | [[package]] 296 | name = "colorama" 297 | version = "0.4.6" 298 | description = "Cross-platform colored terminal text." 299 | optional = false 300 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 301 | files = [ 302 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 303 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 304 | ] 305 | 306 | [[package]] 307 | name = "cookiecutter" 308 | version = "2.6.0" 309 | description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." 310 | optional = false 311 | python-versions = ">=3.7" 312 | files = [ 313 | {file = "cookiecutter-2.6.0-py3-none-any.whl", hash = "sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d"}, 314 | {file = "cookiecutter-2.6.0.tar.gz", hash = "sha256:db21f8169ea4f4fdc2408d48ca44859349de2647fbe494a9d6c3edfc0542c21c"}, 315 | ] 316 | 317 | [package.dependencies] 318 | arrow = "*" 319 | binaryornot = ">=0.4.4" 320 | click = ">=7.0,<9.0.0" 321 | Jinja2 = ">=2.7,<4.0.0" 322 | python-slugify = ">=4.0.0" 323 | pyyaml = ">=5.3.1" 324 | requests = ">=2.23.0" 325 | rich = "*" 326 | 327 | [[package]] 328 | name = "distlib" 329 | version = "0.3.9" 330 | description = "Distribution utilities" 331 | optional = false 332 | python-versions = "*" 333 | files = [ 334 | {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, 335 | {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, 336 | ] 337 | 338 | [[package]] 339 | name = "exceptiongroup" 340 | version = "1.2.2" 341 | description = "Backport of PEP 654 (exception groups)" 342 | optional = false 343 | python-versions = ">=3.7" 344 | files = [ 345 | {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, 346 | {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, 347 | ] 348 | 349 | [package.extras] 350 | test = ["pytest (>=6)"] 351 | 352 | [[package]] 353 | name = "filelock" 354 | version = "3.16.1" 355 | description = "A platform independent file lock." 356 | optional = false 357 | python-versions = ">=3.8" 358 | files = [ 359 | {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, 360 | {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, 361 | ] 362 | 363 | [package.extras] 364 | docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] 365 | testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] 366 | typing = ["typing-extensions (>=4.12.2)"] 367 | 368 | [[package]] 369 | name = "h11" 370 | version = "0.14.0" 371 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 372 | optional = false 373 | python-versions = ">=3.7" 374 | files = [ 375 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, 376 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, 377 | ] 378 | 379 | [[package]] 380 | name = "httpcore" 381 | version = "1.0.6" 382 | description = "A minimal low-level HTTP client." 383 | optional = false 384 | python-versions = ">=3.8" 385 | files = [ 386 | {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, 387 | {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, 388 | ] 389 | 390 | [package.dependencies] 391 | certifi = "*" 392 | h11 = ">=0.13,<0.15" 393 | 394 | [package.extras] 395 | asyncio = ["anyio (>=4.0,<5.0)"] 396 | http2 = ["h2 (>=3,<5)"] 397 | socks = ["socksio (==1.*)"] 398 | trio = ["trio (>=0.22.0,<1.0)"] 399 | 400 | [[package]] 401 | name = "httpx" 402 | version = "0.27.2" 403 | description = "The next generation HTTP client." 404 | optional = false 405 | python-versions = ">=3.8" 406 | files = [ 407 | {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, 408 | {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, 409 | ] 410 | 411 | [package.dependencies] 412 | anyio = "*" 413 | certifi = "*" 414 | httpcore = "==1.*" 415 | idna = "*" 416 | sniffio = "*" 417 | 418 | [package.extras] 419 | brotli = ["brotli", "brotlicffi"] 420 | cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] 421 | http2 = ["h2 (>=3,<5)"] 422 | socks = ["socksio (==1.*)"] 423 | zstd = ["zstandard (>=0.18.0)"] 424 | 425 | [[package]] 426 | name = "identify" 427 | version = "2.6.1" 428 | description = "File identification library for Python" 429 | optional = false 430 | python-versions = ">=3.8" 431 | files = [ 432 | {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, 433 | {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, 434 | ] 435 | 436 | [package.extras] 437 | license = ["ukkonen"] 438 | 439 | [[package]] 440 | name = "idna" 441 | version = "3.10" 442 | description = "Internationalized Domain Names in Applications (IDNA)" 443 | optional = false 444 | python-versions = ">=3.6" 445 | files = [ 446 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, 447 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, 448 | ] 449 | 450 | [package.extras] 451 | all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] 452 | 453 | [[package]] 454 | name = "importlib-metadata" 455 | version = "8.5.0" 456 | description = "Read metadata from Python packages" 457 | optional = false 458 | python-versions = ">=3.8" 459 | files = [ 460 | {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, 461 | {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, 462 | ] 463 | 464 | [package.dependencies] 465 | zipp = ">=3.20" 466 | 467 | [package.extras] 468 | check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] 469 | cover = ["pytest-cov"] 470 | doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 471 | enabler = ["pytest-enabler (>=2.2)"] 472 | perf = ["ipython"] 473 | test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] 474 | type = ["pytest-mypy"] 475 | 476 | [[package]] 477 | name = "isort" 478 | version = "5.13.2" 479 | description = "A Python utility / library to sort Python imports." 480 | optional = false 481 | python-versions = ">=3.8.0" 482 | files = [ 483 | {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, 484 | {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, 485 | ] 486 | 487 | [package.extras] 488 | colors = ["colorama (>=0.4.6)"] 489 | 490 | [[package]] 491 | name = "jinja2" 492 | version = "3.1.4" 493 | description = "A very fast and expressive template engine." 494 | optional = false 495 | python-versions = ">=3.7" 496 | files = [ 497 | {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, 498 | {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, 499 | ] 500 | 501 | [package.dependencies] 502 | MarkupSafe = ">=2.0" 503 | 504 | [package.extras] 505 | i18n = ["Babel (>=2.7)"] 506 | 507 | [[package]] 508 | name = "markdown-it-py" 509 | version = "3.0.0" 510 | description = "Python port of markdown-it. Markdown parsing, done right!" 511 | optional = false 512 | python-versions = ">=3.8" 513 | files = [ 514 | {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, 515 | {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, 516 | ] 517 | 518 | [package.dependencies] 519 | mdurl = ">=0.1,<1.0" 520 | 521 | [package.extras] 522 | benchmarking = ["psutil", "pytest", "pytest-benchmark"] 523 | code-style = ["pre-commit (>=3.0,<4.0)"] 524 | compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] 525 | linkify = ["linkify-it-py (>=1,<3)"] 526 | plugins = ["mdit-py-plugins"] 527 | profiling = ["gprof2dot"] 528 | rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] 529 | testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] 530 | 531 | [[package]] 532 | name = "markupsafe" 533 | version = "3.0.2" 534 | description = "Safely add untrusted strings to HTML/XML markup." 535 | optional = false 536 | python-versions = ">=3.9" 537 | files = [ 538 | {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, 539 | {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, 540 | {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, 541 | {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, 542 | {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, 543 | {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, 544 | {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, 545 | {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, 546 | {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, 547 | {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, 548 | {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, 549 | {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, 550 | {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, 551 | {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, 552 | {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, 553 | {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, 554 | {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, 555 | {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, 556 | {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, 557 | {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, 558 | {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, 559 | {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, 560 | {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, 561 | {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, 562 | {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, 563 | {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, 564 | {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, 565 | {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, 566 | {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, 567 | {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, 568 | {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, 569 | {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, 570 | {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, 571 | {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, 572 | {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, 573 | {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, 574 | {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, 575 | {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, 576 | {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, 577 | {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, 578 | {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, 579 | {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, 580 | {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, 581 | {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, 582 | {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, 583 | {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, 584 | {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, 585 | {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, 586 | {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, 587 | {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, 588 | {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, 589 | {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, 590 | {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, 591 | {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, 592 | {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, 593 | {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, 594 | {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, 595 | {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, 596 | {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, 597 | {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, 598 | {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, 599 | ] 600 | 601 | [[package]] 602 | name = "mdurl" 603 | version = "0.1.2" 604 | description = "Markdown URL utilities" 605 | optional = false 606 | python-versions = ">=3.7" 607 | files = [ 608 | {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, 609 | {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, 610 | ] 611 | 612 | [[package]] 613 | name = "mypy-extensions" 614 | version = "1.0.0" 615 | description = "Type system extensions for programs checked with the mypy type checker." 616 | optional = false 617 | python-versions = ">=3.5" 618 | files = [ 619 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 620 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 621 | ] 622 | 623 | [[package]] 624 | name = "nb-cli" 625 | version = "1.4.2" 626 | description = "CLI for nonebot2" 627 | optional = false 628 | python-versions = "<4.0,>=3.9" 629 | files = [ 630 | {file = "nb_cli-1.4.2-py3-none-any.whl", hash = "sha256:8348480a988fb8632130e14925977ad117d4a0c76c971f91ad813f91a7592263"}, 631 | {file = "nb_cli-1.4.2.tar.gz", hash = "sha256:1d97b2d51569c7f7c7371744b9ed4b73361bc1853111bde2ddf1e990a1e19fef"}, 632 | ] 633 | 634 | [package.dependencies] 635 | anyio = ">=3.6,<5.0" 636 | cashews = ">=6.0,<8.0" 637 | click = ">=8.1,<9.0" 638 | cookiecutter = ">=2.2,<3.0" 639 | httpx = ">=0.18,<1.0" 640 | importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} 641 | jinja2 = ">=3.0,<4.0" 642 | noneprompt = ">=0.1.9,<1.0.0" 643 | pydantic = ">=1.10.0,<2.5.0 || >2.5.0,<2.5.1 || >2.5.1,<3.0.0" 644 | pyfiglet = ">=1.0.1,<2.0.0" 645 | tomlkit = ">=0.10,<1.0" 646 | typing-extensions = ">=4.4,<5.0" 647 | virtualenv = ">=20.21,<21.0" 648 | watchfiles = ">=0.16,<1.0" 649 | wcwidth = ">=0.2,<1.0" 650 | 651 | [[package]] 652 | name = "nodeenv" 653 | version = "1.9.1" 654 | description = "Node.js virtual environment builder" 655 | optional = false 656 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 657 | files = [ 658 | {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, 659 | {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, 660 | ] 661 | 662 | [[package]] 663 | name = "nonemoji" 664 | version = "0.1.4" 665 | description = "Simple gitmoji cli written in python" 666 | optional = false 667 | python-versions = ">=3.7.3,<4.0.0" 668 | files = [ 669 | {file = "nonemoji-0.1.4-py3-none-any.whl", hash = "sha256:6e2b22d315bd936df7d004cf55b13fac5d55abd36aba6b37b405da39b6f78269"}, 670 | {file = "nonemoji-0.1.4.tar.gz", hash = "sha256:f7480e1f2f27f0a149da23f371bab0a47dd2cf46674f61798658b3daa7836fc5"}, 671 | ] 672 | 673 | [package.dependencies] 674 | noneprompt = ">=0.1.3,<0.2.0" 675 | 676 | [[package]] 677 | name = "noneprompt" 678 | version = "0.1.9" 679 | description = "Prompt toolkit for console interaction" 680 | optional = false 681 | python-versions = ">=3.8,<4.0" 682 | files = [ 683 | {file = "noneprompt-0.1.9-py3-none-any.whl", hash = "sha256:a54f1e6a19a3da2dedf7f365f80420e9ae49326a0ffe60a8a9c7afdee6b6eeb3"}, 684 | {file = "noneprompt-0.1.9.tar.gz", hash = "sha256:338b8bb89a8d22ef35f1dedb3aa7c1b228cf139973bdc43c5ffc3eef64457db9"}, 685 | ] 686 | 687 | [package.dependencies] 688 | prompt-toolkit = ">=3.0.19,<4.0.0" 689 | 690 | [[package]] 691 | name = "packaging" 692 | version = "24.1" 693 | description = "Core utilities for Python packages" 694 | optional = false 695 | python-versions = ">=3.8" 696 | files = [ 697 | {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, 698 | {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, 699 | ] 700 | 701 | [[package]] 702 | name = "pathspec" 703 | version = "0.12.1" 704 | description = "Utility library for gitignore style pattern matching of file paths." 705 | optional = false 706 | python-versions = ">=3.8" 707 | files = [ 708 | {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, 709 | {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, 710 | ] 711 | 712 | [[package]] 713 | name = "platformdirs" 714 | version = "4.3.6" 715 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." 716 | optional = false 717 | python-versions = ">=3.8" 718 | files = [ 719 | {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, 720 | {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, 721 | ] 722 | 723 | [package.extras] 724 | docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] 725 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] 726 | type = ["mypy (>=1.11.2)"] 727 | 728 | [[package]] 729 | name = "pre-commit" 730 | version = "4.0.1" 731 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 732 | optional = false 733 | python-versions = ">=3.9" 734 | files = [ 735 | {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, 736 | {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, 737 | ] 738 | 739 | [package.dependencies] 740 | cfgv = ">=2.0.0" 741 | identify = ">=1.0.0" 742 | nodeenv = ">=0.11.1" 743 | pyyaml = ">=5.1" 744 | virtualenv = ">=20.10.0" 745 | 746 | [[package]] 747 | name = "prompt-toolkit" 748 | version = "3.0.48" 749 | description = "Library for building powerful interactive command lines in Python" 750 | optional = false 751 | python-versions = ">=3.7.0" 752 | files = [ 753 | {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, 754 | {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, 755 | ] 756 | 757 | [package.dependencies] 758 | wcwidth = "*" 759 | 760 | [[package]] 761 | name = "pydantic" 762 | version = "2.9.2" 763 | description = "Data validation using Python type hints" 764 | optional = false 765 | python-versions = ">=3.8" 766 | files = [ 767 | {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, 768 | {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, 769 | ] 770 | 771 | [package.dependencies] 772 | annotated-types = ">=0.6.0" 773 | pydantic-core = "2.23.4" 774 | typing-extensions = [ 775 | {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, 776 | {version = ">=4.6.1", markers = "python_version < \"3.13\""}, 777 | ] 778 | 779 | [package.extras] 780 | email = ["email-validator (>=2.0.0)"] 781 | timezone = ["tzdata"] 782 | 783 | [[package]] 784 | name = "pydantic-core" 785 | version = "2.23.4" 786 | description = "Core functionality for Pydantic validation and serialization" 787 | optional = false 788 | python-versions = ">=3.8" 789 | files = [ 790 | {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, 791 | {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, 792 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, 793 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, 794 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, 795 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, 796 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, 797 | {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, 798 | {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, 799 | {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, 800 | {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, 801 | {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, 802 | {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, 803 | {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, 804 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, 805 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, 806 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, 807 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, 808 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, 809 | {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, 810 | {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, 811 | {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, 812 | {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, 813 | {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, 814 | {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, 815 | {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, 816 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, 817 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, 818 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, 819 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, 820 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, 821 | {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, 822 | {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, 823 | {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, 824 | {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, 825 | {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, 826 | {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, 827 | {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, 828 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, 829 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, 830 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, 831 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, 832 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, 833 | {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, 834 | {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, 835 | {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, 836 | {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, 837 | {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, 838 | {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, 839 | {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, 840 | {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, 841 | {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, 842 | {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, 843 | {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, 844 | {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, 845 | {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, 846 | {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, 847 | {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, 848 | {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, 849 | {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, 850 | {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, 851 | {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, 852 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, 853 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, 854 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, 855 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, 856 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, 857 | {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, 858 | {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, 859 | {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, 860 | {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, 861 | {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, 862 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, 863 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, 864 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, 865 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, 866 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, 867 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, 868 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, 869 | {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, 870 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, 871 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, 872 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, 873 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, 874 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, 875 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, 876 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, 877 | {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, 878 | {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, 879 | ] 880 | 881 | [package.dependencies] 882 | typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" 883 | 884 | [[package]] 885 | name = "pyfiglet" 886 | version = "1.0.2" 887 | description = "Pure-python FIGlet implementation" 888 | optional = false 889 | python-versions = ">=3.9" 890 | files = [ 891 | {file = "pyfiglet-1.0.2-py3-none-any.whl", hash = "sha256:889b351d79c99e50a3f619c8f8e6ffdb27fd8c939fc43ecbd7559bd57d5f93ea"}, 892 | {file = "pyfiglet-1.0.2.tar.gz", hash = "sha256:758788018ab8faaddc0984e1ea05ff330d3c64be663c513cc1f105f6a3066dab"}, 893 | ] 894 | 895 | [[package]] 896 | name = "pygments" 897 | version = "2.18.0" 898 | description = "Pygments is a syntax highlighting package written in Python." 899 | optional = false 900 | python-versions = ">=3.8" 901 | files = [ 902 | {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, 903 | {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, 904 | ] 905 | 906 | [package.extras] 907 | windows-terminal = ["colorama (>=0.4.6)"] 908 | 909 | [[package]] 910 | name = "python-dateutil" 911 | version = "2.9.0.post0" 912 | description = "Extensions to the standard Python datetime module" 913 | optional = false 914 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 915 | files = [ 916 | {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, 917 | {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, 918 | ] 919 | 920 | [package.dependencies] 921 | six = ">=1.5" 922 | 923 | [[package]] 924 | name = "python-slugify" 925 | version = "8.0.4" 926 | description = "A Python slugify application that also handles Unicode" 927 | optional = false 928 | python-versions = ">=3.7" 929 | files = [ 930 | {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, 931 | {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, 932 | ] 933 | 934 | [package.dependencies] 935 | text-unidecode = ">=1.3" 936 | 937 | [package.extras] 938 | unidecode = ["Unidecode (>=1.1.1)"] 939 | 940 | [[package]] 941 | name = "pyyaml" 942 | version = "6.0.2" 943 | description = "YAML parser and emitter for Python" 944 | optional = false 945 | python-versions = ">=3.8" 946 | files = [ 947 | {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, 948 | {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, 949 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, 950 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, 951 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, 952 | {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, 953 | {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, 954 | {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, 955 | {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, 956 | {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, 957 | {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, 958 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, 959 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, 960 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, 961 | {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, 962 | {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, 963 | {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, 964 | {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, 965 | {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, 966 | {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, 967 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, 968 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, 969 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, 970 | {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, 971 | {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, 972 | {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, 973 | {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, 974 | {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, 975 | {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, 976 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, 977 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, 978 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, 979 | {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, 980 | {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, 981 | {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, 982 | {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, 983 | {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, 984 | {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, 985 | {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, 986 | {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, 987 | {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, 988 | {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, 989 | {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, 990 | {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, 991 | {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, 992 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, 993 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, 994 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, 995 | {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, 996 | {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, 997 | {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, 998 | {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, 999 | {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "requests" 1004 | version = "2.32.3" 1005 | description = "Python HTTP for Humans." 1006 | optional = false 1007 | python-versions = ">=3.8" 1008 | files = [ 1009 | {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, 1010 | {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, 1011 | ] 1012 | 1013 | [package.dependencies] 1014 | certifi = ">=2017.4.17" 1015 | charset-normalizer = ">=2,<4" 1016 | idna = ">=2.5,<4" 1017 | urllib3 = ">=1.21.1,<3" 1018 | 1019 | [package.extras] 1020 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 1021 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 1022 | 1023 | [[package]] 1024 | name = "rich" 1025 | version = "13.9.3" 1026 | description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 1027 | optional = false 1028 | python-versions = ">=3.8.0" 1029 | files = [ 1030 | {file = "rich-13.9.3-py3-none-any.whl", hash = "sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283"}, 1031 | {file = "rich-13.9.3.tar.gz", hash = "sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e"}, 1032 | ] 1033 | 1034 | [package.dependencies] 1035 | markdown-it-py = ">=2.2.0" 1036 | pygments = ">=2.13.0,<3.0.0" 1037 | typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} 1038 | 1039 | [package.extras] 1040 | jupyter = ["ipywidgets (>=7.5.1,<9)"] 1041 | 1042 | [[package]] 1043 | name = "ruff" 1044 | version = "0.7.1" 1045 | description = "An extremely fast Python linter and code formatter, written in Rust." 1046 | optional = false 1047 | python-versions = ">=3.7" 1048 | files = [ 1049 | {file = "ruff-0.7.1-py3-none-linux_armv6l.whl", hash = "sha256:cb1bc5ed9403daa7da05475d615739cc0212e861b7306f314379d958592aaa89"}, 1050 | {file = "ruff-0.7.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27c1c52a8d199a257ff1e5582d078eab7145129aa02721815ca8fa4f9612dc35"}, 1051 | {file = "ruff-0.7.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:588a34e1ef2ea55b4ddfec26bbe76bc866e92523d8c6cdec5e8aceefeff02d99"}, 1052 | {file = "ruff-0.7.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94fc32f9cdf72dc75c451e5f072758b118ab8100727168a3df58502b43a599ca"}, 1053 | {file = "ruff-0.7.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:985818742b833bffa543a84d1cc11b5e6871de1b4e0ac3060a59a2bae3969250"}, 1054 | {file = "ruff-0.7.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32f1e8a192e261366c702c5fb2ece9f68d26625f198a25c408861c16dc2dea9c"}, 1055 | {file = "ruff-0.7.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:699085bf05819588551b11751eff33e9ca58b1b86a6843e1b082a7de40da1565"}, 1056 | {file = "ruff-0.7.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:344cc2b0814047dc8c3a8ff2cd1f3d808bb23c6658db830d25147339d9bf9ea7"}, 1057 | {file = "ruff-0.7.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4316bbf69d5a859cc937890c7ac7a6551252b6a01b1d2c97e8fc96e45a7c8b4a"}, 1058 | {file = "ruff-0.7.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79d3af9dca4c56043e738a4d6dd1e9444b6d6c10598ac52d146e331eb155a8ad"}, 1059 | {file = "ruff-0.7.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c5c121b46abde94a505175524e51891f829414e093cd8326d6e741ecfc0a9112"}, 1060 | {file = "ruff-0.7.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8422104078324ea250886954e48f1373a8fe7de59283d747c3a7eca050b4e378"}, 1061 | {file = "ruff-0.7.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:56aad830af8a9db644e80098fe4984a948e2b6fc2e73891538f43bbe478461b8"}, 1062 | {file = "ruff-0.7.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:658304f02f68d3a83c998ad8bf91f9b4f53e93e5412b8f2388359d55869727fd"}, 1063 | {file = "ruff-0.7.1-py3-none-win32.whl", hash = "sha256:b517a2011333eb7ce2d402652ecaa0ac1a30c114fbbd55c6b8ee466a7f600ee9"}, 1064 | {file = "ruff-0.7.1-py3-none-win_amd64.whl", hash = "sha256:f38c41fcde1728736b4eb2b18850f6d1e3eedd9678c914dede554a70d5241307"}, 1065 | {file = "ruff-0.7.1-py3-none-win_arm64.whl", hash = "sha256:19aa200ec824c0f36d0c9114c8ec0087082021732979a359d6f3c390a6ff2a37"}, 1066 | {file = "ruff-0.7.1.tar.gz", hash = "sha256:9d8a41d4aa2dad1575adb98a82870cf5db5f76b2938cf2206c22c940034a36f4"}, 1067 | ] 1068 | 1069 | [[package]] 1070 | name = "six" 1071 | version = "1.16.0" 1072 | description = "Python 2 and 3 compatibility utilities" 1073 | optional = false 1074 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1075 | files = [ 1076 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1077 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1078 | ] 1079 | 1080 | [[package]] 1081 | name = "sniffio" 1082 | version = "1.3.1" 1083 | description = "Sniff out which async library your code is running under" 1084 | optional = false 1085 | python-versions = ">=3.7" 1086 | files = [ 1087 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, 1088 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "text-unidecode" 1093 | version = "1.3" 1094 | description = "The most basic Text::Unidecode port" 1095 | optional = false 1096 | python-versions = "*" 1097 | files = [ 1098 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, 1099 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "tomli" 1104 | version = "2.0.2" 1105 | description = "A lil' TOML parser" 1106 | optional = false 1107 | python-versions = ">=3.8" 1108 | files = [ 1109 | {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, 1110 | {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "tomlkit" 1115 | version = "0.13.2" 1116 | description = "Style preserving TOML library" 1117 | optional = false 1118 | python-versions = ">=3.8" 1119 | files = [ 1120 | {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, 1121 | {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "types-python-dateutil" 1126 | version = "2.9.0.20241003" 1127 | description = "Typing stubs for python-dateutil" 1128 | optional = false 1129 | python-versions = ">=3.8" 1130 | files = [ 1131 | {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, 1132 | {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "typing-extensions" 1137 | version = "4.12.2" 1138 | description = "Backported and Experimental Type Hints for Python 3.8+" 1139 | optional = false 1140 | python-versions = ">=3.8" 1141 | files = [ 1142 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 1143 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 1144 | ] 1145 | 1146 | [[package]] 1147 | name = "urllib3" 1148 | version = "2.2.3" 1149 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1150 | optional = false 1151 | python-versions = ">=3.8" 1152 | files = [ 1153 | {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, 1154 | {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, 1155 | ] 1156 | 1157 | [package.extras] 1158 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 1159 | h2 = ["h2 (>=4,<5)"] 1160 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 1161 | zstd = ["zstandard (>=0.18.0)"] 1162 | 1163 | [[package]] 1164 | name = "virtualenv" 1165 | version = "20.27.0" 1166 | description = "Virtual Python Environment builder" 1167 | optional = false 1168 | python-versions = ">=3.8" 1169 | files = [ 1170 | {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, 1171 | {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, 1172 | ] 1173 | 1174 | [package.dependencies] 1175 | distlib = ">=0.3.7,<1" 1176 | filelock = ">=3.12.2,<4" 1177 | platformdirs = ">=3.9.1,<5" 1178 | 1179 | [package.extras] 1180 | docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] 1181 | test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] 1182 | 1183 | [[package]] 1184 | name = "watchfiles" 1185 | version = "0.24.0" 1186 | description = "Simple, modern and high performance file watching and code reload in python." 1187 | optional = false 1188 | python-versions = ">=3.8" 1189 | files = [ 1190 | {file = "watchfiles-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:083dc77dbdeef09fa44bb0f4d1df571d2e12d8a8f985dccde71ac3ac9ac067a0"}, 1191 | {file = "watchfiles-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e94e98c7cb94cfa6e071d401ea3342767f28eb5a06a58fafdc0d2a4974f4f35c"}, 1192 | {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82ae557a8c037c42a6ef26c494d0631cacca040934b101d001100ed93d43f361"}, 1193 | {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acbfa31e315a8f14fe33e3542cbcafc55703b8f5dcbb7c1eecd30f141df50db3"}, 1194 | {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74fdffce9dfcf2dc296dec8743e5b0332d15df19ae464f0e249aa871fc1c571"}, 1195 | {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:449f43f49c8ddca87c6b3980c9284cab6bd1f5c9d9a2b00012adaaccd5e7decd"}, 1196 | {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4abf4ad269856618f82dee296ac66b0cd1d71450fc3c98532d93798e73399b7a"}, 1197 | {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f895d785eb6164678ff4bb5cc60c5996b3ee6df3edb28dcdeba86a13ea0465e"}, 1198 | {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ae3e208b31be8ce7f4c2c0034f33406dd24fbce3467f77223d10cd86778471c"}, 1199 | {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2efec17819b0046dde35d13fb8ac7a3ad877af41ae4640f4109d9154ed30a188"}, 1200 | {file = "watchfiles-0.24.0-cp310-none-win32.whl", hash = "sha256:6bdcfa3cd6fdbdd1a068a52820f46a815401cbc2cb187dd006cb076675e7b735"}, 1201 | {file = "watchfiles-0.24.0-cp310-none-win_amd64.whl", hash = "sha256:54ca90a9ae6597ae6dc00e7ed0a040ef723f84ec517d3e7ce13e63e4bc82fa04"}, 1202 | {file = "watchfiles-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bdcd5538e27f188dd3c804b4a8d5f52a7fc7f87e7fd6b374b8e36a4ca03db428"}, 1203 | {file = "watchfiles-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2dadf8a8014fde6addfd3c379e6ed1a981c8f0a48292d662e27cabfe4239c83c"}, 1204 | {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6509ed3f467b79d95fc62a98229f79b1a60d1b93f101e1c61d10c95a46a84f43"}, 1205 | {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8360f7314a070c30e4c976b183d1d8d1585a4a50c5cb603f431cebcbb4f66327"}, 1206 | {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:316449aefacf40147a9efaf3bd7c9bdd35aaba9ac5d708bd1eb5763c9a02bef5"}, 1207 | {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73bde715f940bea845a95247ea3e5eb17769ba1010efdc938ffcb967c634fa61"}, 1208 | {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3770e260b18e7f4e576edca4c0a639f704088602e0bc921c5c2e721e3acb8d15"}, 1209 | {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0fd7248cf533c259e59dc593a60973a73e881162b1a2f73360547132742823"}, 1210 | {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7a2e3b7f5703ffbd500dabdefcbc9eafeff4b9444bbdd5d83d79eedf8428fab"}, 1211 | {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d831ee0a50946d24a53821819b2327d5751b0c938b12c0653ea5be7dea9c82ec"}, 1212 | {file = "watchfiles-0.24.0-cp311-none-win32.whl", hash = "sha256:49d617df841a63b4445790a254013aea2120357ccacbed00253f9c2b5dc24e2d"}, 1213 | {file = "watchfiles-0.24.0-cp311-none-win_amd64.whl", hash = "sha256:d3dcb774e3568477275cc76554b5a565024b8ba3a0322f77c246bc7111c5bb9c"}, 1214 | {file = "watchfiles-0.24.0-cp311-none-win_arm64.whl", hash = "sha256:9301c689051a4857d5b10777da23fafb8e8e921bcf3abe6448a058d27fb67633"}, 1215 | {file = "watchfiles-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a"}, 1216 | {file = "watchfiles-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370"}, 1217 | {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6"}, 1218 | {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b"}, 1219 | {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e"}, 1220 | {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea"}, 1221 | {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f"}, 1222 | {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234"}, 1223 | {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef"}, 1224 | {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968"}, 1225 | {file = "watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444"}, 1226 | {file = "watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896"}, 1227 | {file = "watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418"}, 1228 | {file = "watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48"}, 1229 | {file = "watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90"}, 1230 | {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94"}, 1231 | {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e"}, 1232 | {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827"}, 1233 | {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df"}, 1234 | {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab"}, 1235 | {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f"}, 1236 | {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b"}, 1237 | {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18"}, 1238 | {file = "watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07"}, 1239 | {file = "watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366"}, 1240 | {file = "watchfiles-0.24.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ee82c98bed9d97cd2f53bdb035e619309a098ea53ce525833e26b93f673bc318"}, 1241 | {file = "watchfiles-0.24.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd92bbaa2ecdb7864b7600dcdb6f2f1db6e0346ed425fbd01085be04c63f0b05"}, 1242 | {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f83df90191d67af5a831da3a33dd7628b02a95450e168785586ed51e6d28943c"}, 1243 | {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fca9433a45f18b7c779d2bae7beeec4f740d28b788b117a48368d95a3233ed83"}, 1244 | {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b995bfa6bf01a9e09b884077a6d37070464b529d8682d7691c2d3b540d357a0c"}, 1245 | {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9aba6e01ff6f2e8285e5aa4154e2970068fe0fc0998c4380d0e6278222269b"}, 1246 | {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5171ef898299c657685306d8e1478a45e9303ddcd8ac5fed5bd52ad4ae0b69b"}, 1247 | {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4933a508d2f78099162da473841c652ad0de892719043d3f07cc83b33dfd9d91"}, 1248 | {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95cf3b95ea665ab03f5a54765fa41abf0529dbaf372c3b83d91ad2cfa695779b"}, 1249 | {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01def80eb62bd5db99a798d5e1f5f940ca0a05986dcfae21d833af7a46f7ee22"}, 1250 | {file = "watchfiles-0.24.0-cp38-none-win32.whl", hash = "sha256:4d28cea3c976499475f5b7a2fec6b3a36208656963c1a856d328aeae056fc5c1"}, 1251 | {file = "watchfiles-0.24.0-cp38-none-win_amd64.whl", hash = "sha256:21ab23fdc1208086d99ad3f69c231ba265628014d4aed31d4e8746bd59e88cd1"}, 1252 | {file = "watchfiles-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b665caeeda58625c3946ad7308fbd88a086ee51ccb706307e5b1fa91556ac886"}, 1253 | {file = "watchfiles-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c51749f3e4e269231510da426ce4a44beb98db2dce9097225c338f815b05d4f"}, 1254 | {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b2509f08761f29a0fdad35f7e1638b8ab1adfa2666d41b794090361fb8b855"}, 1255 | {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a60e2bf9dc6afe7f743e7c9b149d1fdd6dbf35153c78fe3a14ae1a9aee3d98b"}, 1256 | {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7d9b87c4c55e3ea8881dfcbf6d61ea6775fffed1fedffaa60bd047d3c08c430"}, 1257 | {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78470906a6be5199524641f538bd2c56bb809cd4bf29a566a75051610bc982c3"}, 1258 | {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07cdef0c84c03375f4e24642ef8d8178e533596b229d32d2bbd69e5128ede02a"}, 1259 | {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d337193bbf3e45171c8025e291530fb7548a93c45253897cd764a6a71c937ed9"}, 1260 | {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ec39698c45b11d9694a1b635a70946a5bad066b593af863460a8e600f0dff1ca"}, 1261 | {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e28d91ef48eab0afb939fa446d8ebe77e2f7593f5f463fd2bb2b14132f95b6e"}, 1262 | {file = "watchfiles-0.24.0-cp39-none-win32.whl", hash = "sha256:7138eff8baa883aeaa074359daabb8b6c1e73ffe69d5accdc907d62e50b1c0da"}, 1263 | {file = "watchfiles-0.24.0-cp39-none-win_amd64.whl", hash = "sha256:b3ef2c69c655db63deb96b3c3e587084612f9b1fa983df5e0c3379d41307467f"}, 1264 | {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f"}, 1265 | {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b"}, 1266 | {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4"}, 1267 | {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01550ccf1d0aed6ea375ef259706af76ad009ef5b0203a3a4cce0f6024f9b68a"}, 1268 | {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:96619302d4374de5e2345b2b622dc481257a99431277662c30f606f3e22f42be"}, 1269 | {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:85d5f0c7771dcc7a26c7a27145059b6bb0ce06e4e751ed76cdf123d7039b60b5"}, 1270 | {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951088d12d339690a92cef2ec5d3cfd957692834c72ffd570ea76a6790222777"}, 1271 | {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fb58bcaa343fedc6a9e91f90195b20ccb3135447dc9e4e2570c3a39565853e"}, 1272 | {file = "watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1"}, 1273 | ] 1274 | 1275 | [package.dependencies] 1276 | anyio = ">=3.0.0" 1277 | 1278 | [[package]] 1279 | name = "wcwidth" 1280 | version = "0.2.13" 1281 | description = "Measures the displayed width of unicode strings in a terminal" 1282 | optional = false 1283 | python-versions = "*" 1284 | files = [ 1285 | {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, 1286 | {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "zipp" 1291 | version = "3.20.2" 1292 | description = "Backport of pathlib-compatible object wrapper for zip files" 1293 | optional = false 1294 | python-versions = ">=3.8" 1295 | files = [ 1296 | {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, 1297 | {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, 1298 | ] 1299 | 1300 | [package.extras] 1301 | check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] 1302 | cover = ["pytest-cov"] 1303 | doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 1304 | enabler = ["pytest-enabler (>=2.2)"] 1305 | test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] 1306 | type = ["pytest-mypy"] 1307 | 1308 | [metadata] 1309 | lock-version = "2.0" 1310 | python-versions = "^3.9" 1311 | content-hash = "a2100faf57add20a0440c99de5ff1a843258e6ee9ae537a18eb484fef2b308b3" 1312 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "nb-cli-plugin-docker" 3 | version = "0.4.1" 4 | description = "docker support for nb-cli" 5 | authors = ["yanyongyu "] 6 | license = "MIT" 7 | readme = "README.md" 8 | homepage = "https://github.com/nonebot/cli-plugin-docker" 9 | repository = "https://github.com/nonebot/cli-plugin-docker" 10 | documentation = "https://github.com/nonebot/cli-plugin-docker#readme" 11 | keywords = ["nonebot", "cli", "docker"] 12 | classifiers = [ 13 | "Development Status :: 5 - Production/Stable", 14 | "Framework :: Robot Framework", 15 | "Framework :: Robot Framework :: Library", 16 | "License :: OSI Approved :: MIT License", 17 | "Operating System :: OS Independent", 18 | "Programming Language :: Python :: 3", 19 | ] 20 | 21 | [tool.poetry.dependencies] 22 | python = "^3.9" 23 | nb-cli = "^1.1.0" 24 | noneprompt = "^0.1.7" 25 | 26 | [tool.poetry.group.dev.dependencies] 27 | ruff = "^0.7.0" 28 | isort = "^5.10.1" 29 | black = "^24.0.0" 30 | nonemoji = "^0.1.2" 31 | pre-commit = "^4.0.0" 32 | 33 | [tool.poetry.plugins.nb] 34 | docker = "nb_cli_plugin_docker.plugin:install" 35 | 36 | [tool.black] 37 | line-length = 88 38 | include = '\.pyi?$' 39 | extend-exclude = ''' 40 | ''' 41 | 42 | [tool.isort] 43 | profile = "black" 44 | line_length = 88 45 | length_sort = true 46 | skip_gitignore = true 47 | force_sort_within_sections = true 48 | extra_standard_library = ["typing_extensions"] 49 | 50 | [tool.ruff] 51 | line-length = 88 52 | target-version = "py39" 53 | 54 | [tool.ruff.lint] 55 | select = [ 56 | "F", # Pyflakes 57 | "W", # pycodestyle warnings 58 | "E", # pycodestyle errors 59 | "UP", # pyupgrade 60 | "ASYNC", # flake8-async 61 | "C4", # flake8-comprehensions 62 | "T10", # flake8-debugger 63 | "T20", # flake8-print 64 | "PYI", # flake8-pyi 65 | "PT", # flake8-pytest-style 66 | "Q", # flake8-quotes 67 | "RUF", # Ruff-specific rules 68 | ] 69 | ignore = [ 70 | "E402", # module-import-not-at-top-of-file 71 | "UP037", # quoted-annotation 72 | "RUF001", # ambiguous-unicode-character-string 73 | "RUF002", # ambiguous-unicode-character-docstring 74 | "RUF003", # ambiguous-unicode-character-comment 75 | ] 76 | 77 | [tool.ruff.lint.flake8-pytest-style] 78 | fixture-parentheses = false 79 | mark-parentheses = false 80 | 81 | [tool.pyright] 82 | pythonVersion = "3.9" 83 | pythonPlatform = "All" 84 | defineConstant = { PYDANTIC_V2 = true } 85 | 86 | ignore = ["nb_cli_plugin_docker/static/"] 87 | 88 | typeCheckingMode = "standard" 89 | reportShadowedImports = false 90 | disableBytesTypePromotions = true 91 | 92 | [build-system] 93 | requires = ["poetry_core>=1.0.0"] 94 | build-backend = "poetry.core.masonry.api" 95 | --------------------------------------------------------------------------------