├── .editorconfig ├── .github ├── FUNDING.yml ├── renovate.json5 └── workflows │ ├── lint-and-fmt.yml │ ├── release.yml │ └── unit-test.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode ├── extensions.json └── settings.json ├── LICENSE ├── README.md ├── justfile ├── pyproject.toml ├── src └── moelib │ ├── __init__.py │ ├── __main__.py │ └── py.typed ├── tests ├── __init__.py └── test_moelib.py └── uv.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig 2 | # https://editorconfig.org/ 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true 13 | 14 | [*.{py,sh,ipynb}] 15 | indent_size = 4 16 | 17 | [*{.md,rst}] 18 | indent_size = 3 19 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | patreon: SigureMo 2 | custom: 3 | [ 4 | "https://afdian.net/@siguremo", 5 | "https://img.nyakku.moe/sponsor/alipay.png", 6 | "https://img.nyakku.moe/sponsor/wechat.png", 7 | ] 8 | -------------------------------------------------------------------------------- /.github/renovate.json5: -------------------------------------------------------------------------------- 1 | // https://docs.renovatebot.com/configuration-options/ 2 | { 3 | extends: ["github>SigureMo/renovate-config"], 4 | } 5 | -------------------------------------------------------------------------------- /.github/workflows/lint-and-fmt.yml: -------------------------------------------------------------------------------- 1 | name: Lint and Format 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | merge_group: 8 | workflow_dispatch: 9 | 10 | jobs: 11 | lint-and-fmt: 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | # Only run linter and formatter on minimum supported Python version 16 | python-version: ['3.9'] 17 | architecture: ['x64'] 18 | name: lint and fmt - Python ${{ matrix.python-version }} on ${{ matrix.architecture }} 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | 23 | - name: Install prettier 24 | run: | 25 | npm install -g prettier 26 | 27 | - name: Install uv 28 | uses: astral-sh/setup-uv@v5 29 | 30 | - name: Install python 31 | uses: actions/setup-python@v5 32 | with: 33 | python-version: ${{ matrix.python-version }} 34 | architecture: ${{ matrix.architecture }} 35 | 36 | - name: Install just 37 | uses: extractions/setup-just@v3 38 | env: 39 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 40 | 41 | - name: Install dependencies 42 | run: | 43 | just ci-install 44 | 45 | - name: lint 46 | run: | 47 | just ci-lint 48 | 49 | - name: format check 50 | run: | 51 | just ci-fmt-check 52 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: ['v*'] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | release-build: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | 16 | - name: Install uv 17 | uses: astral-sh/setup-uv@v5 18 | 19 | - name: Install python 20 | uses: actions/setup-python@v5 21 | with: 22 | python-version: '3.x' 23 | 24 | - name: Install just 25 | uses: extractions/setup-just@v3 26 | env: 27 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 28 | 29 | - name: build release distributions 30 | run: | 31 | just ci-install 32 | just build 33 | 34 | - name: upload dists 35 | uses: actions/upload-artifact@v4 36 | with: 37 | name: release-dists 38 | path: dist/ 39 | 40 | publish-pypi: 41 | runs-on: ubuntu-latest 42 | name: Publish to PyPI 43 | if: "startsWith(github.ref, 'refs/tags/')" 44 | needs: 45 | - release-build 46 | permissions: 47 | id-token: write 48 | 49 | steps: 50 | - name: Retrieve release distributions 51 | uses: actions/download-artifact@v4 52 | with: 53 | name: release-dists 54 | path: dist/ 55 | 56 | - name: Publish release distributions to PyPI 57 | uses: pypa/gh-action-pypi-publish@release/v1 58 | 59 | publish-release: 60 | runs-on: ubuntu-latest 61 | name: Publish to GitHub 62 | if: "startsWith(github.ref, 'refs/tags/')" 63 | needs: 64 | - release-build 65 | permissions: 66 | contents: write 67 | steps: 68 | - uses: actions/download-artifact@v4 69 | with: 70 | name: release-dists 71 | path: dist/ 72 | - name: Get tag name 73 | run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV 74 | - name: Publish to GitHub 75 | uses: softprops/action-gh-release@v2 76 | with: 77 | draft: true 78 | files: dist/* 79 | tag_name: ${{ env.RELEASE_VERSION }} 80 | -------------------------------------------------------------------------------- /.github/workflows/unit-test.yml: -------------------------------------------------------------------------------- 1 | name: Unit Test 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | merge_group: 8 | workflow_dispatch: 9 | 10 | jobs: 11 | unit-test: 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | python-version: ['3.9', '3.10', '3.11', '3.12', '3.13'] 16 | architecture: ['x64'] 17 | name: unittest - Python ${{ matrix.python-version }} on ${{ matrix.architecture }} 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v4 21 | 22 | - name: Install uv 23 | uses: astral-sh/setup-uv@v5 24 | 25 | - name: Install python 26 | uses: actions/setup-python@v5 27 | with: 28 | python-version: ${{ matrix.python-version }} 29 | architecture: ${{ matrix.architecture }} 30 | 31 | - name: Install just 32 | uses: extractions/setup-just@v3 33 | env: 34 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 35 | 36 | - name: Install dependencies 37 | run: | 38 | just ci-install 39 | 40 | - name: unit test 41 | run: | 42 | just ci-test 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | .hypothesis/ 50 | .pytest_cache/ 51 | 52 | # Translations 53 | *.mo 54 | *.pot 55 | 56 | # Django stuff: 57 | *.log 58 | local_settings.py 59 | db.sqlite3 60 | 61 | # Flask stuff: 62 | instance/ 63 | .webassets-cache 64 | 65 | # Scrapy stuff: 66 | .scrapy 67 | 68 | # Sphinx documentation 69 | docs/_build/ 70 | 71 | # PyBuilder 72 | target/ 73 | 74 | # Jupyter Notebook 75 | .ipynb_checkpoints 76 | 77 | # IPython 78 | profile_default/ 79 | ipython_config.py 80 | 81 | # pyenv 82 | .python-version 83 | 84 | # celery beat schedule file 85 | celerybeat-schedule 86 | 87 | # SageMath parsed files 88 | *.sage.py 89 | 90 | # Environments 91 | .env 92 | .venv 93 | env/ 94 | venv/ 95 | ENV/ 96 | env.bak/ 97 | venv.bak/ 98 | 99 | # Spyder project settings 100 | .spyderproject 101 | .spyproject 102 | 103 | # Rope project settings 104 | .ropeproject 105 | 106 | # mkdocs documentation 107 | /site 108 | 109 | # mypy 110 | .mypy_cache/ 111 | .dmypy.json 112 | dmypy.json 113 | 114 | # Pyre type checker 115 | .pyre/ 116 | 117 | # macOS 118 | .DS_Store 119 | 120 | # test files 121 | *.test.py 122 | 123 | # logs 124 | log 125 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.html 2 | dist/ 3 | node_modules/ 4 | *.min.js 5 | pnpm-lock.yaml 6 | .venv/ 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "tabWidth": 2, 4 | "singleQuote": true, 5 | "trailingComma": "es5", 6 | "semi": false, 7 | "arrowParens": "always", 8 | "overrides": [ 9 | { 10 | "files": "*.md", 11 | "options": { 12 | "tabWidth": 3 13 | } 14 | }, 15 | { 16 | "files": "*.json5", 17 | "options": { 18 | "singleQuote": false 19 | } 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-python.python", 4 | "ms-python.vscode-pylance", 5 | "charliermarsh.ruff", 6 | "esbenp.prettier-vscode", 7 | "EditorConfig.EditorConfig", 8 | "aaron-bond.better-comments", 9 | "usernamehw.errorlens", 10 | "GitHub.copilot", 11 | "seatonjiang.gitmoji-vscode", 12 | "skellock.just", 13 | "yzhang.markdown-all-in-one" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", 3 | "python.analysis.inlayHints.functionReturnTypes": true, 4 | "python.analysis.inlayHints.variableTypes": true, 5 | "[python]": { 6 | "editor.defaultFormatter": "charliermarsh.ruff" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2025-present, Nyakku Shigure 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 13 | all 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 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python lib starter 2 | 3 | Just a template for quickly creating a python library. 4 | 5 |

6 | PyPI - Python Version 7 | pypi 8 | PyPI - Downloads 9 | LICENSE 10 |
11 | uv 12 | ruff 13 | Gitmoji 14 |

15 | 16 | Before the work starts, replace the `moelib` with the name of your library. 17 | -------------------------------------------------------------------------------- /justfile: -------------------------------------------------------------------------------- 1 | VERSION := `uv run python -c "import sys; from moelib import __version__ as version; sys.stdout.write(version)"` 2 | 3 | install: 4 | uv sync --all-extras --dev 5 | 6 | test: 7 | uv run pytest 8 | just clean 9 | 10 | fmt: 11 | uv run ruff format . 12 | 13 | lint: 14 | uv run pyright src/moelib tests 15 | uv run ruff check . 16 | 17 | fmt-docs: 18 | prettier --write '**/*.md' 19 | 20 | build: 21 | uv build 22 | 23 | release: 24 | @echo 'Tagging v{{VERSION}}...' 25 | git tag "v{{VERSION}}" 26 | @echo 'Push to GitHub to trigger publish process...' 27 | git push --tags 28 | 29 | publish: 30 | uv build 31 | uv publish 32 | git push --tags 33 | just clean-builds 34 | 35 | clean: 36 | find . -name "*.pyc" -print0 | xargs -0 rm -f 37 | rm -rf .pytest_cache/ 38 | rm -rf .mypy_cache/ 39 | find . -maxdepth 3 -type d -empty -print0 | xargs -0 -r rm -r 40 | 41 | clean-builds: 42 | rm -rf build/ 43 | rm -rf dist/ 44 | rm -rf *.egg-info/ 45 | 46 | ci-install: 47 | just install 48 | 49 | ci-fmt-check: 50 | uv run ruff format --check --diff . 51 | prettier --check '**/*.md' 52 | 53 | ci-lint: 54 | just lint 55 | 56 | ci-test: 57 | uv run pytest --reruns 3 --reruns-delay 1 58 | just clean 59 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "moelib" 3 | version = "0.1.0" 4 | description = "" 5 | readme = "README.md" 6 | requires-python = ">=3.9" 7 | dependencies = [] 8 | authors = [{ name = "Nyakku Shigure", email = "sigure.qaq@gmail.com" }] 9 | keywords = [] 10 | license = { text = "MIT" } 11 | classifiers = [ 12 | "Operating System :: OS Independent", 13 | "License :: OSI Approved :: MIT License", 14 | "Typing :: Typed", 15 | "Programming Language :: Python", 16 | "Programming Language :: Python :: 3", 17 | "Programming Language :: Python :: 3.9", 18 | "Programming Language :: Python :: 3.10", 19 | "Programming Language :: Python :: 3.11", 20 | "Programming Language :: Python :: 3.12", 21 | "Programming Language :: Python :: 3.13", 22 | "Programming Language :: Python :: Implementation :: CPython", 23 | ] 24 | 25 | [project.urls] 26 | Homepage = "https://github.com/ShigureLab/moelib" 27 | Documentation = "https://github.com/ShigureLab/moelib" 28 | Repository = "https://github.com/ShigureLab/moelib" 29 | Issues = "https://github.com/ShigureLab/moelib/issues" 30 | 31 | [project.scripts] 32 | moelib = "moelib.__main__:main" 33 | 34 | [dependency-groups] 35 | dev = [ 36 | "pyright>=1.1.391", 37 | "ruff>=0.9.3", 38 | "pytest>=8.3.4", 39 | "pytest-rerunfailures>=15.0", 40 | ] 41 | 42 | [tool.pyright] 43 | include = ["src/moelib", "tests"] 44 | pythonVersion = "3.9" 45 | typeCheckingMode = "strict" 46 | 47 | [tool.ruff] 48 | line-length = 120 49 | target-version = "py39" 50 | 51 | [tool.ruff.lint] 52 | select = [ 53 | # Pyflakes 54 | "F", 55 | # Pycodestyle 56 | "E", 57 | "W", 58 | # Isort 59 | "I", 60 | # Comprehensions 61 | "C4", 62 | # Debugger 63 | "T100", 64 | # Pyupgrade 65 | "UP", 66 | # Flake8-pyi 67 | "PYI", 68 | # Bugbear 69 | "B", 70 | # Pylint 71 | "PLE", 72 | # Flake8-simplify 73 | "SIM101", 74 | # Flake8-use-pathlib 75 | "PTH", 76 | # Pygrep-hooks 77 | "PGH004", 78 | # Flake8-type-checking 79 | "TC", 80 | # Flake8-raise 81 | "RSE", 82 | # Refurb 83 | "FURB", 84 | # Flake8-future-annotations 85 | "FA", 86 | # Yesqa 87 | "RUF100", 88 | ] 89 | ignore = [ 90 | "E501", # line too long, duplicate with ruff fmt 91 | "F401", # imported but unused, duplicate with pyright 92 | "F841", # local variable is assigned to but never used, duplicate with pyright 93 | ] 94 | 95 | [tool.ruff.lint.isort] 96 | required-imports = ["from __future__ import annotations"] 97 | known-first-party = ["moelib"] 98 | combine-as-imports = true 99 | 100 | [build-system] 101 | requires = ["hatchling"] 102 | build-backend = "hatchling.build" 103 | -------------------------------------------------------------------------------- /src/moelib/__init__.py: -------------------------------------------------------------------------------- 1 | # Meta information for the project. 2 | from __future__ import annotations 3 | 4 | __version__ = "0.1.0" 5 | __author__ = "Nyakku Shigure" 6 | __year__ = "2025" 7 | __project_info__ = { 8 | "name": __name__, 9 | "version": __version__, 10 | "copyright": f"{__year__}, {__author__}", 11 | "author": __author__, 12 | } 13 | -------------------------------------------------------------------------------- /src/moelib/__main__.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import argparse 4 | 5 | from moelib import __version__ 6 | 7 | 8 | def main() -> None: 9 | parser = argparse.ArgumentParser(prog="moelib", description="A moe moe project") 10 | parser.add_argument("-v", "--version", action="version", version=__version__) 11 | args = parser.parse_args() # type: ignore 12 | 13 | 14 | if __name__ == "__main__": 15 | main() 16 | -------------------------------------------------------------------------------- /src/moelib/py.typed: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShigureLab/python-lib-starter/d7a50b3c124e3c40e9d4223d15ab5baf93e4a541/src/moelib/py.typed -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShigureLab/python-lib-starter/d7a50b3c124e3c40e9d4223d15ab5baf93e4a541/tests/__init__.py -------------------------------------------------------------------------------- /tests/test_moelib.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from moelib import __version__ 4 | 5 | 6 | def test_version(): 7 | assert __version__ == "0.1.0" 8 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | requires-python = ">=3.9" 3 | 4 | [[package]] 5 | name = "colorama" 6 | version = "0.4.6" 7 | source = { registry = "https://pypi.org/simple" } 8 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } 9 | wheels = [ 10 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, 11 | ] 12 | 13 | [[package]] 14 | name = "exceptiongroup" 15 | version = "1.2.2" 16 | source = { registry = "https://pypi.org/simple" } 17 | sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } 18 | wheels = [ 19 | { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, 20 | ] 21 | 22 | [[package]] 23 | name = "iniconfig" 24 | version = "2.0.0" 25 | source = { registry = "https://pypi.org/simple" } 26 | sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } 27 | wheels = [ 28 | { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, 29 | ] 30 | 31 | [[package]] 32 | name = "moelib" 33 | version = "0.1.0" 34 | source = { editable = "." } 35 | 36 | [package.dev-dependencies] 37 | dev = [ 38 | { name = "pyright" }, 39 | { name = "pytest" }, 40 | { name = "pytest-rerunfailures" }, 41 | { name = "ruff" }, 42 | ] 43 | 44 | [package.metadata] 45 | 46 | [package.metadata.requires-dev] 47 | dev = [ 48 | { name = "pyright", specifier = ">=1.1.391" }, 49 | { name = "pytest", specifier = ">=8.3.4" }, 50 | { name = "pytest-rerunfailures", specifier = ">=15.0" }, 51 | { name = "ruff", specifier = ">=0.9.3" }, 52 | ] 53 | 54 | [[package]] 55 | name = "nodeenv" 56 | version = "1.9.1" 57 | source = { registry = "https://pypi.org/simple" } 58 | sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } 59 | wheels = [ 60 | { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, 61 | ] 62 | 63 | [[package]] 64 | name = "packaging" 65 | version = "24.1" 66 | source = { registry = "https://pypi.org/simple" } 67 | sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } 68 | wheels = [ 69 | { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, 70 | ] 71 | 72 | [[package]] 73 | name = "pluggy" 74 | version = "1.5.0" 75 | source = { registry = "https://pypi.org/simple" } 76 | sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } 77 | wheels = [ 78 | { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, 79 | ] 80 | 81 | [[package]] 82 | name = "pyright" 83 | version = "1.1.392.post0" 84 | source = { registry = "https://pypi.org/simple" } 85 | dependencies = [ 86 | { name = "nodeenv" }, 87 | { name = "typing-extensions" }, 88 | ] 89 | sdist = { url = "https://files.pythonhosted.org/packages/66/df/3c6f6b08fba7ccf49b114dfc4bb33e25c299883fd763f93fad47ef8bc58d/pyright-1.1.392.post0.tar.gz", hash = "sha256:3b7f88de74a28dcfa90c7d90c782b6569a48c2be5f9d4add38472bdaac247ebd", size = 3789911 } 90 | wheels = [ 91 | { url = "https://files.pythonhosted.org/packages/e7/b1/a18de17f40e4f61ca58856b9ef9b0febf74ff88978c3f7776f910071f567/pyright-1.1.392.post0-py3-none-any.whl", hash = "sha256:252f84458a46fa2f0fd4e2f91fc74f50b9ca52c757062e93f6c250c0d8329eb2", size = 5595487 }, 92 | ] 93 | 94 | [[package]] 95 | name = "pytest" 96 | version = "8.3.4" 97 | source = { registry = "https://pypi.org/simple" } 98 | dependencies = [ 99 | { name = "colorama", marker = "sys_platform == 'win32'" }, 100 | { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, 101 | { name = "iniconfig" }, 102 | { name = "packaging" }, 103 | { name = "pluggy" }, 104 | { name = "tomli", marker = "python_full_version < '3.11'" }, 105 | ] 106 | sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } 107 | wheels = [ 108 | { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, 109 | ] 110 | 111 | [[package]] 112 | name = "pytest-rerunfailures" 113 | version = "15.0" 114 | source = { registry = "https://pypi.org/simple" } 115 | dependencies = [ 116 | { name = "packaging" }, 117 | { name = "pytest" }, 118 | ] 119 | sdist = { url = "https://files.pythonhosted.org/packages/26/47/ec4e12f45f4b9fac027a41ccaabb353ed4f23695aae860258ba11a84ed9b/pytest-rerunfailures-15.0.tar.gz", hash = "sha256:2d9ac7baf59f4c13ac730b47f6fa80e755d1ba0581da45ce30b72fb3542b4474", size = 21816 } 120 | wheels = [ 121 | { url = "https://files.pythonhosted.org/packages/89/37/54e5ffc7c0cebee7cf30a3ac5915faa7e7abf8bdfdf3228c277f7c192489/pytest_rerunfailures-15.0-py3-none-any.whl", hash = "sha256:dd150c4795c229ef44320adc9a0c0532c51b78bb7a6843a8c53556b9a611df1a", size = 13017 }, 122 | ] 123 | 124 | [[package]] 125 | name = "ruff" 126 | version = "0.9.3" 127 | source = { registry = "https://pypi.org/simple" } 128 | sdist = { url = "https://files.pythonhosted.org/packages/1e/7f/60fda2eec81f23f8aa7cbbfdf6ec2ca11eb11c273827933fb2541c2ce9d8/ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a", size = 3586740 } 129 | wheels = [ 130 | { url = "https://files.pythonhosted.org/packages/f9/77/4fb790596d5d52c87fd55b7160c557c400e90f6116a56d82d76e95d9374a/ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624", size = 11656815 }, 131 | { url = "https://files.pythonhosted.org/packages/a2/a8/3338ecb97573eafe74505f28431df3842c1933c5f8eae615427c1de32858/ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c", size = 11594821 }, 132 | { url = "https://files.pythonhosted.org/packages/8e/89/320223c3421962762531a6b2dd58579b858ca9916fb2674874df5e97d628/ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4", size = 11040475 }, 133 | { url = "https://files.pythonhosted.org/packages/b2/bd/1d775eac5e51409535804a3a888a9623e87a8f4b53e2491580858a083692/ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439", size = 11856207 }, 134 | { url = "https://files.pythonhosted.org/packages/7f/c6/3e14e09be29587393d188454064a4aa85174910d16644051a80444e4fd88/ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5", size = 11420460 }, 135 | { url = "https://files.pythonhosted.org/packages/ef/42/b7ca38ffd568ae9b128a2fa76353e9a9a3c80ef19746408d4ce99217ecc1/ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4", size = 12605472 }, 136 | { url = "https://files.pythonhosted.org/packages/a6/a1/3167023f23e3530fde899497ccfe239e4523854cb874458ac082992d206c/ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1", size = 13243123 }, 137 | { url = "https://files.pythonhosted.org/packages/d0/b4/3c600758e320f5bf7de16858502e849f4216cb0151f819fa0d1154874802/ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5", size = 12744650 }, 138 | { url = "https://files.pythonhosted.org/packages/be/38/266fbcbb3d0088862c9bafa8b1b99486691d2945a90b9a7316336a0d9a1b/ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4", size = 14458585 }, 139 | { url = "https://files.pythonhosted.org/packages/63/a6/47fd0e96990ee9b7a4abda62de26d291bd3f7647218d05b7d6d38af47c30/ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6", size = 12419624 }, 140 | { url = "https://files.pythonhosted.org/packages/84/5d/de0b7652e09f7dda49e1a3825a164a65f4998175b6486603c7601279baad/ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730", size = 11843238 }, 141 | { url = "https://files.pythonhosted.org/packages/9e/be/3f341ceb1c62b565ec1fb6fd2139cc40b60ae6eff4b6fb8f94b1bb37c7a9/ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2", size = 11484012 }, 142 | { url = "https://files.pythonhosted.org/packages/a3/c8/ff8acbd33addc7e797e702cf00bfde352ab469723720c5607b964491d5cf/ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519", size = 12038494 }, 143 | { url = "https://files.pythonhosted.org/packages/73/b1/8d9a2c0efbbabe848b55f877bc10c5001a37ab10aca13c711431673414e5/ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b", size = 12473639 }, 144 | { url = "https://files.pythonhosted.org/packages/cb/44/a673647105b1ba6da9824a928634fe23186ab19f9d526d7bdf278cd27bc3/ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c", size = 9834353 }, 145 | { url = "https://files.pythonhosted.org/packages/c3/01/65cadb59bf8d4fbe33d1a750103e6883d9ef302f60c28b73b773092fbde5/ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4", size = 10821444 }, 146 | { url = "https://files.pythonhosted.org/packages/69/cb/b3fe58a136a27d981911cba2f18e4b29f15010623b79f0f2510fd0d31fd3/ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b", size = 10038168 }, 147 | ] 148 | 149 | [[package]] 150 | name = "tomli" 151 | version = "2.0.2" 152 | source = { registry = "https://pypi.org/simple" } 153 | sdist = { url = "https://files.pythonhosted.org/packages/35/b9/de2a5c0144d7d75a57ff355c0c24054f965b2dc3036456ae03a51ea6264b/tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed", size = 16096 } 154 | wheels = [ 155 | { url = "https://files.pythonhosted.org/packages/cf/db/ce8eda256fa131af12e0a76d481711abe4681b6923c27efb9a255c9e4594/tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38", size = 13237 }, 156 | ] 157 | 158 | [[package]] 159 | name = "typing-extensions" 160 | version = "4.12.2" 161 | source = { registry = "https://pypi.org/simple" } 162 | sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } 163 | wheels = [ 164 | { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, 165 | ] 166 | --------------------------------------------------------------------------------