pax_global_header00006660000000000000000000000064144202636470014522gustar00rootroot0000000000000052 comment=fab291b973239e23c9bdc8a22d9714de43e6d0c9 whey-0.0.24/000077500000000000000000000000001442026364700125615ustar00rootroot00000000000000whey-0.0.24/.bumpversion.cfg000066400000000000000000000011361442026364700156720ustar00rootroot00000000000000[bumpversion] current_version = 0.0.24 commit = True tag = True [bumpversion:file:repo_helper.yml] [bumpversion:file:README.rst] [bumpversion:file:doc-source/index.rst] [bumpversion:file:whey/__init__.py] search = : str = "{current_version}" replace = : str = "{new_version}" [bumpversion:file:pyproject.toml] search = version = "{current_version}" replace = version = "{new_version}" [bumpversion:file:setup.cfg] search = version = {current_version} replace = version = {new_version} [bumpversion:file:.github/workflows/conda_ci.yml] search = ={current_version}=py_1 replace = ={new_version}=py_1 whey-0.0.24/.deepsource.toml000066400000000000000000000004451442026364700156750ustar00rootroot00000000000000version = 1 test_patterns = ["tests/**/test_*.py"] exclude_patterns = [ "doc-source/conf.py", ] [[analyzers]] name = "python" enabled = true [analyzers.meta] runtime_version = "3.x.x" [[analyzers]] name = "test-coverage" enabled = true [[analyzers]] name = "secrets" enabled = true whey-0.0.24/.dependabot/000077500000000000000000000000001442026364700147445ustar00rootroot00000000000000whey-0.0.24/.dependabot/config.yml000066400000000000000000000003101442026364700167260ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- version: 1 update_configs: - package_manager: python directory: / update_schedule: weekly default_reviewers: - domdfcoding whey-0.0.24/.github/000077500000000000000000000000001442026364700141215ustar00rootroot00000000000000whey-0.0.24/.github/ISSUE_TEMPLATE/000077500000000000000000000000001442026364700163045ustar00rootroot00000000000000whey-0.0.24/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000022251442026364700207770ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve labels: bug assignees: domdfcoding --- ## Description ## Steps to Reproduce 1. 2. 3. ## Actual result: ## Expected result: ## Reproduces how often: ## Version * Operating System: * Python: * whey: ## Installation source ## Other Additional Information: whey-0.0.24/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000012101442026364700220230ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project labels: "enhancement" assignees: domdfcoding --- ## Description ## Version * Operating System: * Python: * whey: ## Other Additional Information: whey-0.0.24/.github/auto_assign.yml000066400000000000000000000003471442026364700171640ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- addReviewers: true addAssignees: true reviewers: - domdfcoding numberOfReviewers: 0 # more settings at https://github.com/marketplace/actions/auto-assign-action whey-0.0.24/.github/dependabot.yml000066400000000000000000000002771442026364700167570ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- version: 2 updates: - package-ecosystem: pip directory: / schedule: interval: weekly reviewers: - domdfcoding whey-0.0.24/.github/milestones.py000077500000000000000000000012401442026364700166550ustar00rootroot00000000000000#!/usr/bin/env python # stdlib import os import sys # 3rd party from github3 import GitHub from github3.repos import Repository from packaging.version import InvalidVersion, Version latest_tag = os.environ["GITHUB_REF_NAME"] try: current_version = Version(latest_tag) except InvalidVersion: sys.exit() gh: GitHub = GitHub(token=os.environ["GITHUB_TOKEN"]) repo: Repository = gh.repository(*os.environ["GITHUB_REPOSITORY"].split('/', 1)) for milestone in repo.milestones(state="open"): try: milestone_version = Version(milestone.title) except InvalidVersion: continue if milestone_version == current_version: sys.exit(not milestone.update(state="closed")) whey-0.0.24/.github/stale.yml000066400000000000000000000040211442026364700157510ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. # Configuration for probot-stale - https://github.com/probot/stale --- # Number of days of inactivity before an Issue or Pull Request becomes stale daysUntilStale: 180 # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. daysUntilClose: false # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) onlyLabels: [] # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - pinned - security - "[Status] Maybe Later" # Set to true to ignore issues in a project (defaults to false) exemptProjects: false # Set to true to ignore issues in a milestone (defaults to false) exemptMilestones: false # Set to true to ignore issues with an assignee (defaults to false) exemptAssignees: false # Label to use when marking as stale staleLabel: stale # Comment to post when marking as stale. Set to `false` to disable markComment: false # This issue has been automatically marked as stale because it has not had # recent activity. It will be closed if no further activity occurs. Thank you # for your contributions. # Comment to post when removing the stale label. # unmarkComment: > # Your comment here. # Comment to post when closing a stale Issue or Pull Request. # closeComment: > # Your comment here. # Limit the number of actions per hour, from 1-30. Default is 30 limitPerRun: 30 # Limit to only `issues` or `pulls` # only: issues # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': # pulls: # daysUntilStale: 30 # markComment: > # This pull request has been automatically marked as stale because it has not had # recent activity. It will be closed if no further activity occurs. Thank you # for your contributions. # issues: # exemptLabels: # - confirmed whey-0.0.24/.github/workflows/000077500000000000000000000000001442026364700161565ustar00rootroot00000000000000whey-0.0.24/.github/workflows/bootstrap.yml000066400000000000000000000011441442026364700207160ustar00rootroot00000000000000--- name: Bootstrapping Check on: push: branches: ["master"] permissions: contents: read jobs: check: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Setup Python 🐍 uses: "actions/setup-python@v4" with: python-version: "3.10" - name: Install dependencies 🔧 run: | python -VV python -m site python -m pip install --upgrade "pip>=21.3" setuptools wheel - name: Build from source run: | python -m pip wheel . --no-binary :all: whey-0.0.24/.github/workflows/conda_ci.yml000066400000000000000000000036451442026364700204500ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Conda Tests on: push: branches: ["master"] permissions: contents: read jobs: tests: name: "Conda" runs-on: ubuntu-22.04 defaults: run: shell: bash -l {0} steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Setup Python 🐍 uses: "actions/setup-python@v4" with: python-version: "3.8" - name: Setup Conda uses: conda-incubator/setup-miniconda@v2 with: activate-environment: env conda-build-version: 3.23.3 python-version: "3.8" miniforge-variant: Mambaforge - name: Install dependencies 🔧 run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade "whey-conda" "setuptools!=61.*,>=40.6.0" "wheel>=0.34.2" # $CONDA is an environment variable pointing to the root of the miniconda directory $CONDA/bin/conda update -n base conda $CONDA/bin/conda config --add channels conda-forge $CONDA/bin/conda config --add channels domdfcoding - name: "Build and index channel" run: | python -m whey --builder whey_conda --out-dir conda-bld/noarch $CONDA/bin/conda index ./conda-bld || exit 1 - name: "Search for package" run: | $CONDA/bin/conda search -c file://$(pwd)/conda-bld whey $CONDA/bin/conda search -c file://$(pwd)/conda-bld --override-channels whey - name: "Install package" run: | $CONDA/bin/conda install -c file://$(pwd)/conda-bld whey=0.0.24=py_1 -y || exit 1 - name: "Run Tests" run: | rm -rf whey $CONDA/bin/conda install pytest coincidence || exit 1 pip install -r tests/requirements.txt pytest tests/ whey-0.0.24/.github/workflows/docs_test_action.yml000066400000000000000000000015501442026364700222260ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: "Docs Check" on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: contents: read jobs: docs: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Check for changed files uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!tests/**' - name: Install and Build 🔧 uses: sphinx-toolbox/sphinx-action@sphinx-3.3.1 if: steps.changes.outputs.code == 'true' with: pre-build-command: python -m pip install tox docs-folder: "doc-source/" build-command: "tox -e docs -- -W " whey-0.0.24/.github/workflows/flake8.yml000066400000000000000000000023361442026364700200570ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Flake8 on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: contents: read jobs: Run: name: "Flake8" runs-on: "ubuntu-20.04" steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Check for changed files uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 if: steps.changes.outputs.code == 'true' uses: "actions/setup-python@v4" with: python-version: "3.8" - name: Install dependencies 🔧 if: steps.changes.outputs.code == 'true' run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install tox~=3.0 - name: "Run Flake8" if: steps.changes.outputs.code == 'true' run: "python -m tox -e lint -s false -- --format github" whey-0.0.24/.github/workflows/mypy.yml000066400000000000000000000024501442026364700177000ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: mypy on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: contents: read jobs: Run: name: "mypy / ${{ matrix.os }}" runs-on: ${{ matrix.os }} strategy: matrix: os: ['ubuntu-20.04', 'windows-2019'] fail-fast: false steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Check for changed files uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 if: steps.changes.outputs.code == 'true' uses: "actions/setup-python@v4" with: python-version: "3.8" - name: Install dependencies 🔧 run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 virtualenv!=20.16.0 - name: "Run mypy" if: steps.changes.outputs.code == 'true' run: "python -m tox -e mypy -s false" whey-0.0.24/.github/workflows/octocheese.yml000066400000000000000000000006071442026364700210250ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: "GitHub Releases" on: schedule: - cron: 0 12 * * * jobs: Run: runs-on: ubuntu-latest steps: - uses: domdfcoding/octocheese@master with: pypi_name: "whey" env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} if: startsWith(github.ref, 'refs/tags/') != true whey-0.0.24/.github/workflows/python_ci.yml000066400000000000000000000056661442026364700207120ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Windows on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: actions: write issues: write contents: read jobs: tests: name: "windows-2019 / Python ${{ matrix.config.python-version }}" runs-on: "windows-2019" continue-on-error: ${{ matrix.config.experimental }} env: USING_COVERAGE: '3.6,3.7,3.8,3.9,3.10,3.11,3.12.0-alpha.7,pypy-3.6,pypy-3.7,pypy-3.8,pypy-3.9' strategy: fail-fast: False matrix: config: - {python-version: "3.6", testenvs: "py36,build", experimental: False} - {python-version: "3.7", testenvs: "py37,build", experimental: False} - {python-version: "3.8", testenvs: "py38,build", experimental: False} - {python-version: "3.9", testenvs: "py39,build", experimental: False} - {python-version: "3.10", testenvs: "py310,build", experimental: False} - {python-version: "3.11", testenvs: "py311,build", experimental: False} - {python-version: "3.12.0-alpha.7", testenvs: "py312-dev,build", experimental: True} - {python-version: "pypy-3.6", testenvs: "pypy36,build", experimental: False} - {python-version: "pypy-3.7", testenvs: "pypy37,build", experimental: True} - {python-version: "pypy-3.8", testenvs: "pypy38,build", experimental: True} - {python-version: "pypy-3.9", testenvs: "pypy39", experimental: True} steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Check for changed files if: startsWith(github.ref, 'refs/tags/') != true uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 id: setup-python if: ${{ steps.changes.outputs.code == 'true' || steps.changes.outcome == 'skipped' }} uses: "actions/setup-python@v4" with: python-version: "${{ matrix.config.python-version }}" - name: Install dependencies 🔧 if: steps.setup-python.outcome == 'success' run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 virtualenv!=20.16.0 - name: "Run Tests for Python ${{ matrix.config.python-version }}" if: steps.setup-python.outcome == 'success' run: python -m tox -e "${{ matrix.config.testenvs }}" -s false - name: "Upload Coverage 🚀" uses: actions/upload-artifact@v3 if: ${{ always() && steps.setup-python.outcome == 'success' }} with: name: "coverage-${{ matrix.config.python-version }}" path: .coverage whey-0.0.24/.github/workflows/python_ci_linux.yml000066400000000000000000000172771442026364700221320ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Linux on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' tags: - '*' pull_request: permissions: actions: write issues: write contents: read jobs: tests: name: "ubuntu-20.04 / Python ${{ matrix.config.python-version }}" runs-on: "ubuntu-20.04" continue-on-error: ${{ matrix.config.experimental }} env: USING_COVERAGE: '3.6,3.7,3.8,3.9,3.10,3.11,3.12.0-alpha.7,pypy-3.6,pypy-3.7,pypy-3.8,pypy-3.9' strategy: fail-fast: False matrix: config: - {python-version: "3.6", testenvs: "py36,build", experimental: False} - {python-version: "3.7", testenvs: "py37,build", experimental: False} - {python-version: "3.8", testenvs: "py38,build", experimental: False} - {python-version: "3.9", testenvs: "py39,build", experimental: False} - {python-version: "3.10", testenvs: "py310,build", experimental: False} - {python-version: "3.11", testenvs: "py311,build", experimental: False} - {python-version: "3.12.0-alpha.7", testenvs: "py312-dev,build", experimental: True} - {python-version: "pypy-3.6", testenvs: "pypy36,build", experimental: False} - {python-version: "pypy-3.7", testenvs: "pypy37,build", experimental: True} - {python-version: "pypy-3.8", testenvs: "pypy38,build", experimental: True} - {python-version: "pypy-3.9", testenvs: "pypy39", experimental: True} steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Check for changed files if: startsWith(github.ref, 'refs/tags/') != true uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 id: setup-python if: ${{ steps.changes.outputs.code == 'true' || steps.changes.outcome == 'skipped' }} uses: "actions/setup-python@v4" with: python-version: "${{ matrix.config.python-version }}" - name: Install dependencies 🔧 if: steps.setup-python.outcome == 'success' run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 virtualenv!=20.16.0 python -m pip install --upgrade coverage_pyver_pragma - name: "Run Tests for Python ${{ matrix.config.python-version }}" if: steps.setup-python.outcome == 'success' run: python -m tox -e "${{ matrix.config.testenvs }}" -s false - name: "Upload Coverage 🚀" uses: actions/upload-artifact@v3 if: ${{ always() && steps.setup-python.outcome == 'success' }} with: name: "coverage-${{ matrix.config.python-version }}" path: .coverage Coverage: needs: tests runs-on: "ubuntu-20.04" steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Setup Python 🐍 uses: "actions/setup-python@v4" with: python-version: 3.8 - name: Install dependencies 🔧 run: | python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade "coveralls>=3.0.0" coverage_pyver_pragma - name: "Download Coverage 🪂" uses: actions/download-artifact@v3 with: path: coverage - name: Display structure of downloaded files id: show run: ls -R working-directory: coverage continue-on-error: true - name: Combine Coverage 👷 if: ${{ steps.show.outcome != 'failure' }} run: | shopt -s globstar python -m coverage combine coverage/**/.coverage - name: "Upload Combined Coverage Artefact 🚀" if: ${{ steps.show.outcome != 'failure' }} uses: actions/upload-artifact@v3 with: name: "combined-coverage" path: .coverage - name: "Upload Combined Coverage to Coveralls" if: ${{ steps.show.outcome != 'failure' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | coveralls --service=github Deploy: needs: tests runs-on: "ubuntu-20.04" steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" if: startsWith(github.ref, 'refs/tags/') - name: Setup Python 🐍 uses: "actions/setup-python@v4" if: startsWith(github.ref, 'refs/tags/') with: python-version: 3.8 - name: Install dependencies 🔧 if: startsWith(github.ref, 'refs/tags/') run: | python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 - name: Build distributions 📦 if: startsWith(github.ref, 'refs/tags/') run: | tox -e build - name: Upload distribution to PyPI 🚀 if: startsWith(github.ref, 'refs/tags/') uses: pypa/gh-action-pypi-publish@v1.4.2 with: user: __token__ password: ${{ secrets.PYPI_TOKEN }} skip_existing: true - name: Close milestone 🚪 if: startsWith(github.ref, 'refs/tags/') run: | python -m pip install --upgrade github3.py packaging python .github/milestones.py env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} Conda: needs: deploy runs-on: ubuntu-22.04 if: startsWith(github.ref, 'refs/tags/') || (startsWith(github.event.head_commit.message, 'Bump version') != true) steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Setup Python 🐍 uses: "actions/setup-python@v4" with: python-version: 3.8 - name: Setup Conda uses: conda-incubator/setup-miniconda@v2 with: activate-environment: env conda-build-version: 3.23.3 python-version: "3.8" miniforge-variant: Mambaforge - name: Install dependencies 🔧 run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade "mkrecipe" "setuptools!=61.*,>=40.6.0" "wheel>=0.34.2" # $CONDA is an environment variable pointing to the root of the miniconda directory $CONDA/bin/conda config --set always_yes yes --set changeps1 no $CONDA/bin/conda update -n base conda $CONDA/bin/conda info -a $CONDA/bin/conda config --add channels conda-forge $CONDA/bin/conda config --add channels domdfcoding $CONDA/bin/conda config --remove channels defaults - name: Build Conda Package 📦 run: | python -m mkrecipe --type wheel || exit 1 $CONDA/bin/conda build conda -c conda-forge -c domdfcoding --output-folder conda/dist - name: Deploy Conda Package 🚀 if: startsWith(github.ref, 'refs/tags/') run: | $CONDA/bin/conda config --set always_yes yes --set changeps1 no $CONDA/bin/conda install anaconda-client $CONDA/bin/conda info -a for f in conda/dist/noarch/whey-*.tar.bz2; do [ -e "$f" ] || continue echo "$f" conda install "$f" || exit 1 echo "Deploying to Anaconda.org..." $CONDA/bin/anaconda -t "$ANACONDA_TOKEN" upload "$f" || exit 1 echo "Successfully deployed to Anaconda.org." done env: ANACONDA_TOKEN: ${{ secrets.ANACONDA_TOKEN }} whey-0.0.24/.github/workflows/python_ci_macos.yml000066400000000000000000000055231442026364700220640ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: macOS on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: actions: write issues: write contents: read jobs: tests: name: "macos-latest / Python ${{ matrix.config.python-version }}" runs-on: "macos-latest" continue-on-error: ${{ matrix.config.experimental }} env: USING_COVERAGE: '3.6,3.7,3.8,3.9,3.10,3.11,3.12.0-alpha.7,pypy-3.7,pypy-3.8,pypy-3.9' strategy: fail-fast: False matrix: config: - {python-version: "3.6", testenvs: "py36,build", experimental: False} - {python-version: "3.7", testenvs: "py37,build", experimental: False} - {python-version: "3.8", testenvs: "py38,build", experimental: False} - {python-version: "3.9", testenvs: "py39,build", experimental: False} - {python-version: "3.10", testenvs: "py310,build", experimental: False} - {python-version: "3.11", testenvs: "py311,build", experimental: False} - {python-version: "3.12.0-alpha.7", testenvs: "py312-dev,build", experimental: True} - {python-version: "pypy-3.7", testenvs: "pypy37,build", experimental: True} - {python-version: "pypy-3.8", testenvs: "pypy38,build", experimental: True} - {python-version: "pypy-3.9", testenvs: "pypy39", experimental: True} steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Check for changed files if: startsWith(github.ref, 'refs/tags/') != true uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 id: setup-python if: ${{ steps.changes.outputs.code == 'true' || steps.changes.outcome == 'skipped' }} uses: "actions/setup-python@v4" with: python-version: "${{ matrix.config.python-version }}" - name: Install dependencies 🔧 if: steps.setup-python.outcome == 'success' run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 virtualenv!=20.16.0 - name: "Run Tests for Python ${{ matrix.config.python-version }}" if: steps.setup-python.outcome == 'success' run: python -m tox -e "${{ matrix.config.testenvs }}" -s false - name: "Upload Coverage 🚀" uses: actions/upload-artifact@v3 if: ${{ always() && steps.setup-python.outcome == 'success' }} with: name: "coverage-${{ matrix.config.python-version }}" path: .coverage whey-0.0.24/.github/workflows/smoke_test.yml000066400000000000000000000131551442026364700210630ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Smoke Test on: push: # branches: ["master"] permissions: contents: read jobs: tests: name: " ${{ matrix.config.repo }}" runs-on: ubuntu-latest strategy: fail-fast: False matrix: config: - repo: "sphinx-toolbox/default_values" name: "default_values" modname: "sphinxcontrib/default_values" - repo: "sphinx-toolbox/dict2css" name: "dict2css" modname: "dict2css" - repo: "sphinx-toolbox/extras_require" name: "extras_require" modname: "sphinxcontrib/extras_require" - repo: "sphinx-toolbox/seed_intersphinx_mapping" name: "seed_intersphinx_mapping" modname: "seed_intersphinx_mapping" - repo: "sphinx-toolbox/sphinx-debuginfo" name: "sphinx-debuginfo" modname: "sphinx_debuginfo" - repo: "sphinx-toolbox/sphinx-highlights" name: "sphinx-highlights" modname: "sphinx_highlights" - repo: "sphinx-toolbox/sphinx-toolbox" name: "sphinx-toolbox" modname: "sphinx_toolbox" - repo: "sphinx-toolbox/toctree_plus" name: "toctree_plus" modname: "sphinxcontrib/toctree_plus" - repo: "repo-helper/mkrecipe" name: "mkrecipe" modname: "mkrecipe" # - repo: "domdfcoding/consolekit" # name: "consolekit" # modname: "consolekit" # extra-install-args: "--extra-index-url https://domdfcoding.github.io/wheelhouse/" - repo: "domdfcoding/mathematical" name: "mathematical" modname: "mathematical" - repo: "python-coincidence/coincidence" name: "coincidence" modname: "coincidence" - repo: "python-formate/formate" name: "formate" modname: "formate" - repo: "python-formate/astatine" name: "astatine" modname: "astatine" - repo: "python-formate/flake8-dunder-all" name: "flake8-dunder-all" modname: "flake8_dunder_all" - repo: "python-formate/flake8-encodings" name: "flake8-encodings" modname: "flake8_encodings" - repo: "python-formate/flake8-github-actions" name: "flake8-github-actions" modname: "flake8_github_actions" - repo: "python-formate/flake8-helper" name: "flake8-helper" modname: "flake8_helper" - repo: "python-formate/flake8-slots" name: "flake8-slots" modname: "flake8_slots" - repo: "python-formate/flake8-sphinx-links" name: "flake8-sphinx-links" modname: "flake8_sphinx_links" - repo: "python-formate/flake8_strftime" name: "flake8_strftime" modname: "flake8_strftime" - repo: "python-formate/formate" name: "formate" modname: "formate" - repo: "python-formate/snippet-fmt" name: "snippet-fmt" modname: "snippet_fmt" steps: - name: Checkout 🛎️ uses: "actions/checkout@v3" - name: Setup Python 🐍 uses: "actions/setup-python@v4" with: python-version: "3.8" - name: Install dependencies 🔧 run: | python -VV python -m site python -m pip install --upgrade "pip>=21.3" setuptools wheel virtualenv python -m pip install "check-wheel-contents>=0.1.0" "twine>=3.2.0" python -m pip install .[editable] - name: Clone run: | git clone https://github.com/${{ matrix.config.repo }} /tmp/${{ matrix.config.name }} - name: Build run: | python3 -m virtualenv venv python3 -m pip install /tmp/${{ matrix.config.name }} --prefix venv -I --no-build-isolation venv/bin/python -m pip install -r /tmp/${{ matrix.config.name }}/tests/requirements.txt ${{ matrix.config.extra-install-args }} || exit 1 venv/bin/python -m pip show ${{ matrix.config.name }} || exit 1 venv/bin/python -c "import importlib; file = importlib.import_module('${{ matrix.config.modname }}'.replace('/', '.')).__file__; assert file != '/tmp/${{ matrix.config.name }}/${{ matrix.config.modname }}/__init__.py', file" venv/bin/python -m pytest /tmp/${{ matrix.config.name }}/tests || exit 1 - name: "Check wheel" run: | python3 -m whey python3 -m twine check dist/*.tar.gz dist/*.whl python3 -m check_wheel_contents dist/ working-directory: /tmp/${{ matrix.config.name }} - name: Build Editable run: | python3 -m virtualenv venv-editable venv-editable/bin/python -m pip install -r /tmp/${{ matrix.config.name }}/tests/requirements.txt ${{ matrix.config.extra-install-args }} || exit 1 python3 -m pip install --editable /tmp/${{ matrix.config.name }} --prefix venv-editable -I --no-build-isolation venv-editable/bin/python -c "import importlib; file = importlib.import_module('${{ matrix.config.modname }}'.replace('/', '.')).__file__; assert file == '/tmp/${{ matrix.config.name }}/${{ matrix.config.modname }}/__init__.py', file" venv-editable/bin/python -m pip show ${{ matrix.config.name }} || exit 1 venv-editable/bin/python -m pytest /tmp/${{ matrix.config.name }}/tests || exit 1 whey-0.0.24/.gitignore000066400000000000000000000020161442026364700145500ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. __pycache__/ *.py[cod] *$py.class *.so .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg *.egg* *.manifest *.spec pip-log.txt pip-delete-this-directory.txt htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ cover/ *.mo *.pot *.log local_settings.py db.sqlite3 instance/ .webassets-cache .scrapy docs/_build/ doc/build target/ .ipynb_checkpoints .python-version celerybeat-schedule celerybeat.pid *.sage.py .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ .spyderproject .spyproject .ropeproject /site .mypy_cache/ .dmypy.json dmypy.json *.iml *.ipr cmake-build-*/ .idea/**/mongoSettings.xml *.iws out/ atlassian-ide-plugin.xml com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties .idea build **/__pycache__ **/conda __pypackages__/ profile_default/ ipython_config.py Pipfile.lock .pyre/ whey-0.0.24/.imgbotconfig000066400000000000000000000001151442026364700152260ustar00rootroot00000000000000{ "schedule": "weekly", "ignoredFiles": [ "**/*.svg" ] } whey-0.0.24/.pre-commit-config.yaml000066400000000000000000000042321442026364700170430ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- exclude: ^$ ci: autoupdate_schedule: quarterly repos: - repo: https://github.com/repo-helper/pyproject-parser rev: v0.7.0 hooks: - id: reformat-pyproject - repo: https://github.com/pre-commit/pre-commit-hooks rev: v3.4.0 hooks: - id: check-added-large-files - id: check-ast - id: fix-byte-order-marker - id: check-byte-order-marker - id: check-case-conflict - id: check-executables-have-shebangs - id: check-json - id: check-toml - id: check-yaml - id: check-merge-conflict - id: check-symlinks - id: check-vcs-permalinks - id: detect-private-key - id: trailing-whitespace - id: mixed-line-ending - id: end-of-file-fixer - repo: https://github.com/domdfcoding/pre-commit-hooks rev: v0.4.0 hooks: - id: requirements-txt-sorter args: - --allow-git - id: check-docstring-first exclude: ^(doc-source/conf|__pkginfo__|setup|tests/.*)\.py$ - id: bind-requirements - repo: https://github.com/domdfcoding/flake8-dunder-all rev: v0.2.2 hooks: - id: ensure-dunder-all files: ^whey/.*\.py$ - repo: https://github.com/domdfcoding/flake2lint rev: v0.4.2 hooks: - id: flake2lint - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: - id: python-no-eval - id: rst-backticks - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/asottile/pyupgrade rev: v2.12.0 hooks: - id: pyupgrade args: - --py36-plus - --keep-runtime-typing - repo: https://github.com/Lucas-C/pre-commit-hooks rev: v1.5.1 hooks: - id: remove-crlf - id: forbid-crlf - repo: https://github.com/python-formate/snippet-fmt rev: v0.1.4 hooks: - id: snippet-fmt - repo: https://github.com/python-formate/formate rev: v0.4.10 hooks: - id: formate exclude: ^(doc-source/conf|__pkginfo__|setup)\.(_)?py$ - repo: https://github.com/domdfcoding/dep_checker rev: v0.7.1 hooks: - id: dep_checker args: - whey # Custom hooks can be added below this comment whey-0.0.24/.pylintrc000066400000000000000000000346201442026364700144330ustar00rootroot00000000000000[MASTER] # Specify a configuration file. #rcfile= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. ignore-patterns= # Pickle collected data for later comparisons. persistent=yes # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Use multiple processes to speed up Pylint. jobs=1 # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist= # Allow optimization of some AST trees. This will activate a peephole AST # optimizer, which will apply various small optimizations. For instance, it can # be used to obtain the result of joining multiple strings with the addition # operator. Joining a lot of strings can lead to a maximum recursion error in # Pylint and this flag can prevent that. It has one side effect, the resulting # AST will be different than the one from reality. This option is deprecated # and it will be removed in Pylint 2.0. optimize-ast=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. #enable= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=all enable=assert-on-tuple,astroid-error,bad-except-order,bad-inline-option,bad-option-value,bad-reversed-sequence,bare-except,binary-op-exception,boolean-datetime,catching-non-exception,cell-var-from-loop,confusing-with-statement,consider-merging-isinstance,consider-using-enumerate,consider-using-ternary,continue-in-finally,deprecated-pragma,django-not-available,duplicate-except,duplicate-key,eval-used,exec-used,expression-not-assigned,fatal,file-ignored,fixme,global-at-module-level,global-statement,global-variable-not-assigned,global-variable-undefined,http-response-with-content-type-json,http-response-with-json-dumps,invalid-all-object,invalid-characters-in-docstring,len-as-condition,literal-comparison,locally-disabled,locally-enabled,lost-exception,lowercase-l-suffix,misplaced-bare-raise,missing-kwoa,mixed-line-endings,model-has-unicode,model-missing-unicode,model-no-explicit-unicode,model-unicode-not-callable,multiple-imports,new-db-field-with-default,non-ascii-bytes-literals,nonexistent-operator,not-in-loop,notimplemented-raised,overlapping-except,parse-error,pointless-statement,pointless-string-statement,raising-bad-type,raising-non-exception,raw-checker-failed,redefine-in-handler,redefined-argument-from-local,redefined-builtin,redundant-content-type-for-json-response,reimported,relative-import,return-outside-function,simplifiable-if-statement,singleton-comparison,syntax-error,trailing-comma-tuple,trailing-newlines,unbalanced-tuple-unpacking,undefined-all-variable,undefined-loop-variable,unexpected-line-ending-format,unidiomatic-typecheck,unnecessary-lambda,unnecessary-pass,unnecessary-semicolon,unneeded-not,unpacking-non-sequence,unreachable,unrecognized-inline-option,used-before-assignment,useless-else-on-loop,using-constant-test,wildcard-import,yield-outside-function,useless-return [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html. You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". This option is deprecated # and it will be removed in Pylint 2.0. files-output=no # Tells whether to display a full report or only the messages reports=no # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= [BASIC] # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Include a hint for the correct naming format with invalid-name include-naming-hint=no # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty # Regular expression matching correct function names function-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for function names function-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct variable names variable-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for variable names variable-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct constant names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Naming hint for constant names const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Regular expression matching correct attribute names attr-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for attribute names attr-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct argument names argument-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for argument names argument-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Naming hint for class attribute names class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Naming hint for inline iteration names inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ # Regular expression matching correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Naming hint for class names class-name-hint=[A-Z_][a-zA-Z0-9]+$ # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Naming hint for module names module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression matching correct method names method-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for method names method-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 [ELIF] # Maximum number of nested blocks for function / method body max-nested-blocks=5 [FORMAT] # Maximum number of characters on a single line. max-line-length=159 # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma,dict-separator # Maximum number of lines in a module max-module-lines=1000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [TYPECHECK] # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager [VARIABLES] # Tells whether we should check for unused import in __init__ files. init-import=no # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=(_+[a-zA-Z0-9]*?$)|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,future.builtins [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict,_fields,_replace,_source,_make [DESIGN] # Maximum number of arguments for function / method max-args=5 # Argument names that match this expression will be ignored. Default to name # with leading underscore ignored-argument-names=_.* # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branches=12 # Maximum number of statements in function / method body max-statements=60 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # Maximum number of boolean expressions in a if statement max-bool-expr=5 [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,TERMIOS,Bastion,rexec # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=Exception whey-0.0.24/.readthedocs.yml000066400000000000000000000006021442026364700156450ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. # Read the Docs configuration file --- version: 2 sphinx: builder: html configuration: doc-source/conf.py formats: - pdf - htmlzip python: version: 3.8 install: - requirements: requirements.txt - requirements: doc-source/requirements.txt - method: pip path: . extra_requirements: - all whey-0.0.24/.style.yapf000066400000000000000000000272001442026364700146610ustar00rootroot00000000000000[style] # Align closing bracket with visual indentation. align_closing_bracket_with_visual_indent=True # Allow dictionary keys to exist on multiple lines. For example: # # x = { # ('this is the first element of a tuple', # 'this is the second element of a tuple'): # value, # } allow_multiline_dictionary_keys=True # Allow lambdas to be formatted on more than one line. allow_multiline_lambdas=False # Allow splitting before a default / named assignment in an argument list. allow_split_before_default_or_named_assigns=True # Allow splits before the dictionary value. allow_split_before_dict_value=True # Let spacing indicate operator precedence. For example: # # a = 1 * 2 + 3 / 4 # b = 1 / 2 - 3 * 4 # c = (1 + 2) * (3 - 4) # d = (1 - 2) / (3 + 4) # e = 1 * 2 - 3 # f = 1 + 2 + 3 + 4 # # will be formatted as follows to indicate precedence: # # a = 1*2 + 3/4 # b = 1/2 - 3*4 # c = (1+2) * (3-4) # d = (1-2) / (3+4) # e = 1*2 - 3 # f = 1 + 2 + 3 + 4 # arithmetic_precedence_indication=False # Number of blank lines surrounding top-level function and class # definitions. blank_lines_around_top_level_definition=2 # Insert a blank line before a class-level docstring. blank_line_before_class_docstring=False # Insert a blank line before a module docstring. blank_line_before_module_docstring=False # Insert a blank line before a 'def' or 'class' immediately nested # within another 'def' or 'class'. For example: # # class Foo: # # <------ this blank line # def method(): # ... blank_line_before_nested_class_or_def=True # Do not split consecutive brackets. Only relevant when # dedent_closing_brackets is set. For example: # # call_func_that_takes_a_dict( # { # 'key1': 'value1', # 'key2': 'value2', # } # ) # # would reformat to: # # call_func_that_takes_a_dict({ # 'key1': 'value1', # 'key2': 'value2', # }) coalesce_brackets=True # The column limit. column_limit=115 # The style for continuation alignment. Possible values are: # # - SPACE: Use spaces for continuation alignment. This is default behavior. # - FIXED: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns # (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs or # CONTINUATION_INDENT_WIDTH spaces) for continuation alignment. # - VALIGN-RIGHT: Vertically align continuation lines to multiple of # INDENT_WIDTH columns. Slightly right (one tab or a few spaces) if # cannot vertically align continuation lines with indent characters. continuation_align_style=VALIGN-RIGHT # Indent width used for line continuations. continuation_indent_width=8 # Put closing brackets on a separate line, dedented, if the bracketed # expression can't fit in a single line. Applies to all kinds of brackets, # including function definitions and calls. For example: # # config = { # 'key1': 'value1', # 'key2': 'value2', # } # <--- this bracket is dedented and on a separate line # # time_series = self.remote_client.query_entity_counters( # entity='dev3246.region1', # key='dns.query_latency_tcp', # transform=Transformation.AVERAGE(window=timedelta(seconds=60)), # start_ts=now()-timedelta(days=3), # end_ts=now(), # ) # <--- this bracket is dedented and on a separate line dedent_closing_brackets=False # Disable the heuristic which places each list element on a separate line # if the list is comma-terminated. disable_ending_comma_heuristic=False # Place each dictionary entry onto its own line. each_dict_entry_on_separate_line=False # Require multiline dictionary even if it would normally fit on one line. # For example: # # config = { # 'key1': 'value1' # } force_multiline_dict=False # The regex for an i18n comment. The presence of this comment stops # reformatting of that line, because the comments are required to be # next to the string they translate. ;i18n_comment= # The i18n function call names. The presence of this function stops # reformattting on that line, because the string it has cannot be moved # away from the i18n comment. ;i18n_function_call= # Indent blank lines. indent_blank_lines=False # Put closing brackets on a separate line, indented, if the bracketed # expression can't fit in a single line. Applies to all kinds of brackets, # including function definitions and calls. For example: # # config = { # 'key1': 'value1', # 'key2': 'value2', # } # <--- this bracket is indented and on a separate line # # time_series = self.remote_client.query_entity_counters( # entity='dev3246.region1', # key='dns.query_latency_tcp', # transform=Transformation.AVERAGE(window=timedelta(seconds=60)), # start_ts=now()-timedelta(days=3), # end_ts=now(), # ) # <--- this bracket is indented and on a separate line indent_closing_brackets=True # Indent the dictionary value if it cannot fit on the same line as the # dictionary key. For example: # # config = { # 'key1': # 'value1', # 'key2': value1 + # value2, # } indent_dictionary_value=True # The number of columns to use for indentation. indent_width=4 # Join short lines into one line. E.g., single line 'if' statements. join_multiple_lines=False # Do not include spaces around selected binary operators. For example: # # 1 + 2 * 3 - 4 / 5 # # will be formatted as follows when configured with "*,/": # # 1 + 2*3 - 4/5 ;no_spaces_around_selected_binary_operators= # Use spaces around default or named assigns. spaces_around_default_or_named_assign=False # Adds a space after the opening '{' and before the ending '}' dict delimiters. # # {1: 2} # # will be formatted as: # # { 1: 2 } spaces_around_dict_delimiters=False # Adds a space after the opening '[' and before the ending ']' list delimiters. # # [1, 2] # # will be formatted as: # # [ 1, 2 ] spaces_around_list_delimiters=False # Use spaces around the power operator. spaces_around_power_operator=False # Use spaces around the subscript / slice operator. For example: # # my_list[1 : 10 : 2] spaces_around_subscript_colon=False # Adds a space after the opening '(' and before the ending ')' tuple delimiters. # # (1, 2, 3) # # will be formatted as: # # ( 1, 2, 3 ) spaces_around_tuple_delimiters=False # The number of spaces required before a trailing comment. # This can be a single value (representing the number of spaces # before each trailing comment) or list of values (representing # alignment column values; trailing comments within a block will # be aligned to the first column value that is greater than the maximum # line length within the block). For example: # # With spaces_before_comment=5: # # 1 + 1 # Adding values # # will be formatted as: # # 1 + 1 # Adding values <-- 5 spaces between the end of the statement and comment # # With spaces_before_comment=15, 20: # # 1 + 1 # Adding values # two + two # More adding # # longer_statement # This is a longer statement # short # This is a shorter statement # # a_very_long_statement_that_extends_beyond_the_final_column # Comment # short # This is a shorter statement # # will be formatted as: # # 1 + 1 # Adding values <-- end of line comments in block aligned to col 15 # two + two # More adding # # longer_statement # This is a longer statement <-- end of line comments in block aligned to col 20 # short # This is a shorter statement # # a_very_long_statement_that_extends_beyond_the_final_column # Comment <-- the end of line comments are aligned based on the line length # short # This is a shorter statement # spaces_before_comment=2 # Insert a space between the ending comma and closing bracket of a list, # etc. space_between_ending_comma_and_closing_bracket=True # Use spaces inside brackets, braces, and parentheses. For example: # # method_call( 1 ) # my_dict[ 3 ][ 1 ][ get_index( *args, **kwargs ) ] # my_set = { 1, 2, 3 } space_inside_brackets=False # Split before arguments split_all_comma_separated_values=False # Split before arguments, but do not split all subexpressions recursively # (unless needed). split_all_top_level_comma_separated_values=True # Split before arguments if the argument list is terminated by a # comma. split_arguments_when_comma_terminated=False # Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@' # rather than after. split_before_arithmetic_operator=True # Set to True to prefer splitting before '&', '|' or '^' rather than # after. split_before_bitwise_operator=True # Split before the closing bracket if a list or dict literal doesn't fit on # a single line. split_before_closing_bracket=True # Split before a dictionary or set generator (comp_for). For example, note # the split before the 'for': # # foo = { # variable: 'Hello world, have a nice day!' # for variable in bar if variable != 42 # } split_before_dict_set_generator=True # Split before the '.' if we need to split a longer expression: # # foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d)) # # would reformat to something like: # # foo = ('This is a really long string: {}, {}, {}, {}' # .format(a, b, c, d)) split_before_dot=False # Split after the opening paren which surrounds an expression if it doesn't # fit on a single line. split_before_expression_after_opening_paren=True # If an argument / parameter list is going to be split, then split before # the first argument. split_before_first_argument=False # Set to True to prefer splitting before 'and' or 'or' rather than # after. split_before_logical_operator=True # Split named assignments onto individual lines. split_before_named_assigns=True # Set to True to split list comprehensions and generators that have # non-trivial expressions and multiple clauses before each of these # clauses. For example: # # result = [ # a_long_var + 100 for a_long_var in xrange(1000) # if a_long_var % 10] # # would reformat to something like: # # result = [ # a_long_var + 100 # for a_long_var in xrange(1000) # if a_long_var % 10] split_complex_comprehension=True # The penalty for splitting right after the opening bracket. split_penalty_after_opening_bracket=100 # The penalty for splitting the line after a unary operator. split_penalty_after_unary_operator=10000 # The penalty of splitting the line around the '+', '-', '*', '/', '//', # ``%``, and '@' operators. split_penalty_arithmetic_operator=300 # The penalty for splitting right before an if expression. split_penalty_before_if_expr=0 # The penalty of splitting the line around the '&', '|', and '^' # operators. split_penalty_bitwise_operator=300 # The penalty for splitting a list comprehension or generator # expression. split_penalty_comprehension=80 # The penalty for characters over the column limit. split_penalty_excess_character=7000 # The penalty incurred by adding a line split to the unwrapped line. The # more line splits added the higher the penalty. split_penalty_for_added_line_split=30 # The penalty of splitting a list of "import as" names. For example: # # from a_very_long_or_indented_module_name_yada_yad import (long_argument_1, # long_argument_2, # long_argument_3) # # would reformat to something like: # # from a_very_long_or_indented_module_name_yada_yad import ( # long_argument_1, long_argument_2, long_argument_3) split_penalty_import_names=0 # The penalty of splitting the line around the 'and' and 'or' # operators. split_penalty_logical_operator=300 # Use the Tab character for indentation. use_tabs=True whey-0.0.24/CONTRIBUTING.rst000066400000000000000000000024751442026364700152320ustar00rootroot00000000000000============== Contributing ============== .. This file based on https://github.com/PyGithub/PyGithub/blob/master/CONTRIBUTING.md ``whey`` uses `tox `_ to automate testing and packaging, and `pre-commit `_ to maintain code quality. Install ``pre-commit`` with ``pip`` and install the git hook: .. code-block:: bash $ python -m pip install pre-commit $ pre-commit install Coding style -------------- `formate `_ is used for code formatting. It can be run manually via ``pre-commit``: .. code-block:: bash $ pre-commit run formate -a Or, to run the complete autoformatting suite: .. code-block:: bash $ pre-commit run -a Automated tests ------------------- Tests are run with ``tox`` and ``pytest``. To run tests for a specific Python version, such as Python 3.6: .. code-block:: bash $ tox -e py36 To run tests for all Python versions, simply run: .. code-block:: bash $ tox Type Annotations ------------------- Type annotations are checked using ``mypy``. Run ``mypy`` using ``tox``: .. code-block:: bash $ tox -e mypy Build documentation locally ------------------------------ The documentation is powered by Sphinx. A local copy of the documentation can be built with ``tox``: .. code-block:: bash $ tox -e docs whey-0.0.24/LICENSE000066400000000000000000000020501442026364700135630ustar00rootroot00000000000000Copyright (c) 2021 Dominic Davis-Foster Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. whey-0.0.24/MANIFEST.in000066400000000000000000000002101442026364700143100ustar00rootroot00000000000000include __pkginfo__.py include LICENSE include requirements.txt prune **/__pycache__ recursive-include whey *.pyi include whey/py.typed whey-0.0.24/README.rst000066400000000000000000000135371442026364700142610ustar00rootroot00000000000000##### whey ##### .. start short_desc **A simple Python wheel builder for simple projects.** .. end short_desc ``whey``: * supports `PEP 621 `_ metadata. * can be used as a `PEP 517 `_ build backend. * creates `PEP 427 `_ `wheels `_. * handles type hint files (`py.typed `_ and ``*.pyi`` stubs). * is distributed under the `MIT License `_. * `is the liquid remaining after milk has been curdled and strained `_. It is a byproduct of the manufacture of cheese and has several commercial uses. See `the documentation`_ for configuration_ and usage_ information. .. _the documentation: https://whey.readthedocs.io/en/latest/ .. _configuration: https://whey.readthedocs.io/en/latest/configuration.html .. _usage: https://whey.readthedocs.io/en/latest/configuration.html .. start shields .. list-table:: :stub-columns: 1 :widths: 10 90 * - Docs - |docs| |docs_check| * - Tests - |actions_linux| |actions_windows| |actions_macos| |coveralls| * - PyPI - |pypi-version| |supported-versions| |supported-implementations| |wheel| * - Anaconda - |conda-version| |conda-platform| * - Activity - |commits-latest| |commits-since| |maintained| |pypi-downloads| * - QA - |codefactor| |actions_flake8| |actions_mypy| * - Other - |license| |language| |requires| .. |docs| image:: https://img.shields.io/readthedocs/whey/latest?logo=read-the-docs :target: https://whey.readthedocs.io/en/latest :alt: Documentation Build Status .. |docs_check| image:: https://github.com/repo-helper/whey/workflows/Docs%20Check/badge.svg :target: https://github.com/repo-helper/whey/actions?query=workflow%3A%22Docs+Check%22 :alt: Docs Check Status .. |actions_linux| image:: https://github.com/repo-helper/whey/workflows/Linux/badge.svg :target: https://github.com/repo-helper/whey/actions?query=workflow%3A%22Linux%22 :alt: Linux Test Status .. |actions_windows| image:: https://github.com/repo-helper/whey/workflows/Windows/badge.svg :target: https://github.com/repo-helper/whey/actions?query=workflow%3A%22Windows%22 :alt: Windows Test Status .. |actions_macos| image:: https://github.com/repo-helper/whey/workflows/macOS/badge.svg :target: https://github.com/repo-helper/whey/actions?query=workflow%3A%22macOS%22 :alt: macOS Test Status .. |actions_flake8| image:: https://github.com/repo-helper/whey/workflows/Flake8/badge.svg :target: https://github.com/repo-helper/whey/actions?query=workflow%3A%22Flake8%22 :alt: Flake8 Status .. |actions_mypy| image:: https://github.com/repo-helper/whey/workflows/mypy/badge.svg :target: https://github.com/repo-helper/whey/actions?query=workflow%3A%22mypy%22 :alt: mypy status .. |requires| image:: https://dependency-dash.repo-helper.uk/github/repo-helper/whey/badge.svg :target: https://dependency-dash.repo-helper.uk/github/repo-helper/whey/ :alt: Requirements Status .. |coveralls| image:: https://img.shields.io/coveralls/github/repo-helper/whey/master?logo=coveralls :target: https://coveralls.io/github/repo-helper/whey?branch=master :alt: Coverage .. |codefactor| image:: https://img.shields.io/codefactor/grade/github/repo-helper/whey?logo=codefactor :target: https://www.codefactor.io/repository/github/repo-helper/whey :alt: CodeFactor Grade .. |pypi-version| image:: https://img.shields.io/pypi/v/whey :target: https://pypi.org/project/whey/ :alt: PyPI - Package Version .. |supported-versions| image:: https://img.shields.io/pypi/pyversions/whey?logo=python&logoColor=white :target: https://pypi.org/project/whey/ :alt: PyPI - Supported Python Versions .. |supported-implementations| image:: https://img.shields.io/pypi/implementation/whey :target: https://pypi.org/project/whey/ :alt: PyPI - Supported Implementations .. |wheel| image:: https://img.shields.io/pypi/wheel/whey :target: https://pypi.org/project/whey/ :alt: PyPI - Wheel .. |conda-version| image:: https://img.shields.io/conda/v/conda-forge/whey?logo=anaconda :target: https://anaconda.org/conda-forge/whey :alt: Conda - Package Version .. |conda-platform| image:: https://img.shields.io/conda/pn/conda-forge/whey?label=conda%7Cplatform :target: https://anaconda.org/conda-forge/whey :alt: Conda - Platform .. |license| image:: https://img.shields.io/github/license/repo-helper/whey :target: https://github.com/repo-helper/whey/blob/master/LICENSE :alt: License .. |language| image:: https://img.shields.io/github/languages/top/repo-helper/whey :alt: GitHub top language .. |commits-since| image:: https://img.shields.io/github/commits-since/repo-helper/whey/v0.0.24 :target: https://github.com/repo-helper/whey/pulse :alt: GitHub commits since tagged version .. |commits-latest| image:: https://img.shields.io/github/last-commit/repo-helper/whey :target: https://github.com/repo-helper/whey/commit/master :alt: GitHub last commit .. |maintained| image:: https://img.shields.io/maintenance/yes/2023 :alt: Maintenance .. |pypi-downloads| image:: https://img.shields.io/pypi/dm/whey :target: https://pypi.org/project/whey/ :alt: PyPI - Downloads .. end shields Installation -------------- .. start installation ``whey`` can be installed from PyPI or Anaconda. To install with ``pip``: .. code-block:: bash $ python -m pip install whey To install with ``conda``: .. code-block:: bash $ conda install -c conda-forge whey .. end installation ``whey`` also has an optional README validation feature, which checks the README will render correctly on PyPI. This requires that the ``readme`` extra is installed: .. code-block:: bash $ python -m pip install whey[readme] and in ``pyproject.toml``: .. code-block:: TOML [build-system] requires = [ "whey[readme]",] build-backend = "whey" whey-0.0.24/__pkginfo__.py000066400000000000000000000004561442026364700153710ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. __all__ = ["extras_require"] extras_require = { "readme": ["docutils==0.16", "pyproject-parser[readme]>=0.6.0"], "editable": ["editables>=0.2"], "all": ["docutils==0.16", "editables>=0.2", "pyproject-parser[readme]>=0.6.0"] } whey-0.0.24/demo.py000066400000000000000000000002221442026364700140530ustar00rootroot00000000000000# stdlib from pprint import pprint # this package from whey.config import load_toml config = load_toml("example_pyproject.toml") pprint(config) whey-0.0.24/doc-source/000077500000000000000000000000001442026364700146245ustar00rootroot00000000000000whey-0.0.24/doc-source/404.rst000066400000000000000000000003271442026364700156670ustar00rootroot00000000000000:orphan: =============== 404 =============== We looked everywhere but we couldn't find that page! .. image:: not-found.png :align: center Try using the links in the sidebar to find what you are looking for. whey-0.0.24/doc-source/Little_Miss_Muffet_-_Sir_John_Everett_Millais.png000066400000000000000000004364531442026364700262660ustar00rootroot00000000000000PNG  IHDRJp<gAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk>IDATx,WnYv9浟?̪B`ltGPIIu .tKF(EHڠBsc]d (YoA (F弒\6X@vY!,B*B1)Ӻ[]z"KXB"R(yhUS)], U *q9m4c.nCL:Cd1jJHjёcM23U,Q9cS ׵K)b.`?^7oc電aj>ˀ08Zy,̥ 1$Q @]̱1'.Rʬ}tHԨʨ0)k8%\!0O7S ڬZ;} a(P3{aeʻ 5픶!6,赜VSH>XwS0 βaGϻ1^,o J~t$p\0wFkfNaxk\x&SЗmDRJW>yzԡA܏CSX8:P"P>nȑTHzѮ|]7eԵC2DMƎ4);|]^p*i^U"TzĘ| twPj!qʼ'yܠ`*/Z- ,`\ ӬYsͭ*@jo u"WYƘAЏ.K 6 c۹_4n:}~ۥ2Y61*7w;LCbԶHn*@61-=$.Rx1ka95-ڌbO9h2+ht]W߼L r^{RryW jӏBj-4n:v;uoF~o!_x~wpާ_~޻W/+թ:?o*3?>~_ͳx'Ɵ}}/N/Qpt:7owCs9LF&9gnX8YCwq֫#,*WmJqb[{ju?~C]KVS.E+rlg7;޾@UU\ @z>y{S.AP c*daJ9%03Jb*"A"FJ96މpY@1<~{s};9Bi*}*Coo cW)j4֍_TtVka@$0Mk8)C r ETڔFC<:%6N50 C733Ô+i [7FrRf5B?L+kH^!!t=88]'?_ǩ\ ?y?{M3kΚ0,eնpJ9Yܟя|,Dz 3_Mcc$u.n1r"X±3Xr|_7cn8RJ)d vM!(08歳omuЇXt5s(zYeK4䵱d0%ͱR jjDpC* E)mbɊ*Z8 Ji\,90Ƙc|7sZH "Yst1F*0Ѯ䜄ERCmnOIy 9U֮Y85,Ҫu5(SjʉP뫋0mŤM凟\,fcmo\j?ݱvwdRS.Fj\]噹w&)F>yrr _I|d]~n|{{SBtK>wV-~dfK.gF-YX9]8n}u1Ƈ;x}|LQ }i5$fRzJiH2ÔXxJcbR+MN1PJA\xC`F0 ONWUof+i,\uRݶX4 aJIUV)FɂSfgF>f "1Rzk5^{ơsVUUURQXUQa9RfVϔb! 12R.vCd9Fkc@i6"=N (:m> ?X2lVNaAҺ: ~sY1X76AϮV$,Y8],S?vW/n17oV9?ǻxw(m?z;~ewꦶڂrAm1^"2xNr,LHଭr.C*HXm[t1˺8tZ)ZŜgM9QnDdR7M1U Ôa TՕ3 K"E!:#?']ͻÔb cd׍JisLL딳z쭭svc*R*oQi[iEF|^J-Ŕ>֎~hju1\$%nPnIoHUZJʫ\)HETL5U91hc*g !:NOEn!.)F+2 ǜRJcB* '~ ,;П6n>mdNєP9\,[%0kۡ>\.׳{ӴZ >7/~:ZO.v7>>S:)YQ0Ǿu.mY'~G TuGġBcj s) NȨyemj>Sqsg9qZx"ʌq !|L%fEh) 5 'mԲn Uq;FvVR%2~IӤ6JU޽{"e9k4P@i{g̈ǘ !4![p B$E?|t˿{!+˜J,l;?1r9G`ug1>ÔiC9&N9VWVkW[K(jf?%X}:b]cʂ+b4 [cAhXjCJUaE)UҬuղyz gf]U"P`)EbZ+L %ժ (STpN ]7)h*ҳ9GkT>&[5M 9 0ߕRp$HYSΏLkj lZbaVU5Lc⼚ 1Rb1_%)DF \b:Yұ R!uIBDx*th}shRֹZM)jcRaM1EvfwƇvQyh yvn}:o^_o^oCZnᦛz^8ǠO߽~l>yT<c|p^8[{pebT|{z3jvcYwwGoUT?U˹8s6B\뱟X0 O/Nыݞ*L!. 8K+`:[Nu)1j>\/46F_P{G(cH4"b2 *ϜZƠ zMsÔvBtƑ)d3yNJIa)ruڎ\ŤH$DD+E%8VB#Ęr)~ ƛ}0~zPw%)&ZӢqcHY -jGR$:q~Jq4LӲTƔ)!L߽Z7 \RU;_NRʼ23/9ͪ,0X*Ŵ.f\hu:{MEc,|,B'34g^7oR}x 0z[|1__\*Sa7_e=ŻE[ͼ'<(!??8BQpQ#/h_|F/< t! JNcޘ22 @`H<\[_@, 4!4V"Պ 3[mYVJċY"M|p5VO[9v)1*"{1sǬ-r'aʚĐsrjNi@0J,u!Y+TR7^1O_|t8!vd )&a2FcJ3jo{Q4ZNZg"dR~) `eUjU%>yS-ϥLpqf}u>dO/"|qwmUsRrc̘}VǙ)ON矞q7M~>Nvz7﮿7o~nGkuwh}ymEشqn/rݾwNK/Zbb6Kc1 TKS,Λ'Fn F r.̚)Fkr{fF裫sj%$Ji•33gjqc.K)̽J1VȪ8&A P1%o͐rJ#cbbFovɼmocXvf]8Mcʅv~ cP0RJ9U,j3ݦŗoy{)e$4A9i׏ֻ=||uuU6n7$'Ѫ;vgA"^+c5S!ٜE UXdS8SxjCחrb͜hOt^Mi)Z>̢秏7뫏|q?on$O?`=đ7}zӇ#˓EL1Ya@R$g廽3.RCdSZzt" J(P+i]1cdFL\np1:(.GPc>Znv6oru&QzJ9 ) #eDg)ә7RfM])駎 J.VQ(y;e!7ǻ~~;_j7LV)CRIub.Y&jKz_D *Ȑ2@$|̩O 琋;kC`PZ+aw8xMM?'cV(3#KĜRZ+1Njr׏8La^9T[HZ)rNwnLQke+c#E.%ota8guVWgyirӏCVRPW)#3j0 ~>a)a,SJKw(H4d7n~MB(FP򡟦X#Ms{q&ڪVeaﻮj j$Unw8"jN?Y4BT_u}̝X߿"]X_M޼/z}BZ5O'Wqc~vW<:go7@`. i7(D\wlouXڶ\PՊXH)tLY :7sq*h;6u $XQC7ݡGFR3AxV5cLE$ )ƔMFRRa`.Yjs;ooTm!G5RoqvV,r!'ɥ2~!ԅX;5*aVM7\S~uU<"UvH.!l(Dk)8 {kt:kjǔ(fBʹEՒBg+W)9:mik1 +(CakFhEVQh]"yw!jq:y~~A~9xP뗇n,LZYcF{b G2 f.,(؇0k@CI@ "28 ]׎TA)1*BwfJ.%P("Cq@0\j[D Ca3)"B"E4eV "0€0 uKWY0:c3ڄ4i+cr΀8 CH :m7nCH1j5( 5l /ۦu FȈim3y'.m @(c@ 3•1t":WgQ7va CHhSUNkDZr@ȘnLc(PZ( iԶ~h|ҺfoLvՙdɅҡY:mVe!'m/Y:;O:'˙ qXoYg_,LvAЄSKO,y[sk?PAitee$#@d&tLEik5]ͫ>8՜O]ysXPvwsc`=κn CD9264petIIHK!c VS̩q42UCRK+ڙaZ&i] |8[ݡp)g@c tZMu}[$ \Vaɱc\e탳rqq1%f`C~Ls\V+uz|A x,="xǘ! C퐡=1Rj!\k23ww암yU%SaF>Xd֧WU{+N]̿~ʖ|sӭS~4ifUgÏ/r(oo6Zt ՛ob5С܅D3qɧoFH?{ 0a ;kӺ^ 8sֻ>~q"Doi*+2F9]JcJ(Dc*1瘋 4LJCJFS*bu0WF+eBNSΈ+0r﻾iB>2*(sz1t7~|{dQ˹ת !):t=H)M1l*@̥ԕ+C^ jfׯ8!"FE@ki} F8k0j( m[[33J!V K.\X jȩuӶ68(:o޲m ࢶW7߼xȸq?T`l3 B9}0i:VO>?gG|oWW//OOϿliwE)1!FVZm7S'JdяQ{sq컘"'Ex_oj+5qXD5<#rc2)os@)E#\Sj{:}(0bKlaCDe2Bc4H)YZWRA"\ J̒rV;sdYɃH Д9vUj` ZRS>C*p1D4NsR)撅s4 !ODTHh $lq 0)QVTk=j51$m,3_,0zV4L0g|˞:kER֪ƻ!~*p썦Ec{Sݴ}4}wr%B03[_g֍Σoi\88e `rc!D~Je=ԕv»2!7UuRzQEP(}@Iͻid ,3]f99E12"Z/z6]7 !$)3售f &E!%.i Hؒ2IJbEsbTJ($m|)Qr1!\l!T VZklB& SL}`cT(崪|QDPD^ke c*jmHU4r)nϮٯ/W0I !qbT2zmBRsWiC( tFmteU"'1=1U"gmޘ7)NhBFՅ0)Ukǔ6AS(PRʆ?}ͨ?k'Tm~=noouϮM{ϾzS_;;]%%n)#Ĝ eЄj1o.<}vssn  So{9SeVbH9ߌEQʄTƦrCH)o7!b4D(kfiY5u.4}b.R¥wc!~9ŋjM pm9/j?z'!A ZWZ;\MsbR EZDQUΜcĒYD+kN.f˛gg41V YP~Һ^}WkjX`A+1sJ$t{Nl_,gu,k:mӫSN(iơh.Z?,㮛V/Зb^;?}JR@m{tmO77 ͟K>|>q_*f}fx cC>t h]iuy ڏtdm Ζ˅3޾{5%a?X8FT \F Sl%QX$P"P!Īs&ܻ1nHa$. ) +"|*bDQച rr~emo 0 q,QRI1}ۃkJ+ WfumMeI\R9_$?_z{_Heնb "miT$3gUj"q wƶu3cӨ㸝mH7O>{уO\8 ')Cf@3M̐b>4&eb.-)Ǣ34gY4*u|/R|+T/oV|_z~m~n5}MB܆~5NCW!GF\)׷wyfEp9g$E͌yz\f) Zɢͅіt9JᲩatVƻe]5VW֞?X,fF*:eİnܡHVZ$~p +RyH 6sȠ"IyuOieȒ5!RUՇp:ɏ>7XUv,ڹצ1VĘU!Đjԇkdkb|'|޾xsFkPi?؏!UvcHBgX,QC/u. d()>Ki,O>n&RT킳rX`7B.Ww4qUm18y괵...ǀq8;_=]_6 @) ;m6)O2v zƹEE`zb9b!Z|.$qTƾ}yl=ɟCE<2Nw?]j=:1a.bt.Inv87#n9F)g.EȐ͐HZ9cjg!؍R:PB΂jLrJBu?1(B3CsrzJby;Dj̙b,I"t@"2 * 8ϛj I-jX- ;ray QHdGky?ʲ=YQ989abagTFk :4e y]33k0}Yߏ@@J?L PXNSjB!13_,gSZ+B~[mZg[k$Nq~iV`xwcj\mvS |괛 r9df^6nD4͡'9zէ/p ʪ\fvoO0}x Uv_ݳk+cݾ޿_߅/Ƽbɼ|۶9&>a.̛̭uǘ?w.$zC•&H!D)N)F "œ>LaRN ֿ|c"BR(9Eeu*%JXcr4Q.|"Fa΅ƘR[Uq>rY}<)!R*R׾ar8*q7>tVՂE_{t[JAM8vۏ!0PzH}U. d68\5ށ}#Bl&v;Y4Fe6$œR55&b*A)YR1(𶟺XD#b&"E(R)),ۡ;;ȸ1ecn*sOVx}>ݏN~?gtu4LGn3폭/w.'g?Wr1}7{!StMAkv71Ӧ"a-jgQ=TJ*=VR<(ׇ kMY2VcXΚ1 X.sRZM!M1蔲Z5ά8̢H-Za,Xx6 jKJ;jkYm):]ԵV'YJy9۶Qn}㔷X;\1($ot?"b;?=]%1!DFV}t ff& @z?w[Ti, K.wƧ%Fos"!1yNDn,(<>c)#nCN0"V pE=:V8r1yc>N8zȘ/KJmzNO!xgֵ%*%q"?~O͏g+}d{ڞ?Ogz^|w_)ݮ˛f̍CZ{n)]B3,@S59' MB LD &Z(p!vXsYDi ("~r*,0C8 3t &@@ij}S̹| aq̥۔RS,JYcSRr ehhTB.YH)={WR.!0Ml¹rƠ(" ,UR28UO#!)%hQJ+[w&W2ÔZ`.\`cf^FSJϫ8Q$QIJkU[YcMa9imŢeZڥ5 RU B.l)B)Ccy\~ݿ'Kdz={ݜ>7/Ǜ]''WgMwd鬷r>mD]CPJ3Ν_|8Vfi'Rwy`~¼|a Wj5oT򬪖uS*@*r0 uy8R@ibU1XRV%J&r 9fΥ%5&c:|%,[ncL)!y_/RXRB @e!CWλsu?LAK4zS@jj% [e&BRyFXzr!E 7qLPs[¥a WȜp3:1!DJ*T !4V ֤H)²2CH1"rҲl qa;WkOccSeOg"#+ ˢP]{f\ujA_ϛ:=ݏsyzyJ?xV1I.mD!fߗauX̹tc ޲Z!0bBW^RD)Ǡfښ!RymSc@2$1涪cbhe-̛scT"KQ1!fF@Dm#DVj}jȲg&Ar 'KËB+c<XO 'cfA L93qHqHMm5aҪm1~PFm师P*gRJGVJ ]c.phyN_uurNN[ew?ԝ]x෿xyqX\\gr/~ͳ0eem탑<<[@t=һ)FrxnBN'aH獝%P/ZAĻ'EOOfWs{ݿTpFDB )O9p>k.j9)R}E$FaY @-QIRqZv Vcɕ&t̬Qձd"][{8vYx ﷛a !r{n鐒1MBN KB7^@.s:묮~<s"$(yFYWcBLh48iCe;kknW Z;;҆B@\ҷ [HQSa Zqex?h`EJ.6^c8 "כ1d4C`EX_{w|V+O>Μ¡osmB.۟='.~/><7o m*3<!z}{S9Yϗvw\/gV?wxcTtZXgZVF?_<>/5))7oI1P l>^w~b.%.S,4YkcJJ1)WFkH"$Hֹ 3{g ! HmeTH)p ʼEB.CDJkK l3D\.JaCv>0oAk֜`QWNOq,޽. !&(Hj׍}87*g kaQQx*gI.`}uUۅxُ|=nۗwO~i ~7׻plg{\\?}r^j@[=RzaI+mz}[R~pRœye^U9EBi1)߻X sSUsOmo=rш%ɐU  $dYUׇ9c SsqYRCDBM߃"S0GcL#E0$i5zzv?.*TP !Ŕc̑Q s]y0dޏc( sr#1)\CBrΎ!3Shٺ&fvZi-ڽxu7V,n}b@2B 9$@iJ+X\Tp;>m , ZwUSR޸1!FgYe7oo0墴Rǐ뻛}WO~' o]=޾!E߿`]پ:WjGc]͛ݤҊI96xzQUPUJq;&)yLLOk; !{1cϗ|4)]dc\7VRi*\. ph0ˆ%擦)6cLS^[TŨ6*g,)^+/RB¢ BF}rZM0 VE P)g݄C(v& hC붞6"fw{j) h=Lhs{E[FBRuN+[D@ʱqLH dBmJaᅳ ÄHCImHY!jmm4EdD8Nq7mG&l_.}= G!U>y>ruXg?3ն?1/?_Dwcg1Z;u;vhuet}%u9INU ?}j_\!|~fy{nA= TeqDa4P$ uSA)@ǼSd0N%s)\U8N"RFkES)1R9)8UN+Ke dEmHHR ϼ#d)C?SqBɑn7L+O"2 JQnFUSs Ȕ`LNu& G]oergWk&aoM|wcb]rtNCO0=)6Zn< gBHm}2kb [o窔vNSRVu̼ʺa@kelLR~rXHJٔt>y7}=LSbxro!]7mQ@)&[Z(F b\VJ]RJ!n#һq; 5͜a}w]?kٛqʜ)'R2HbQ" ZΉtP=B@U*yZStc{!C@ap,,V[p)%Z)FU% BE0X:t<wHDSΆH@Dk眶h.I{a Bڻ0K{@lu/r]e=ki FFKc9 gkVfOTElwZF@sm^JjnUP$i~ݴ1>Tސ4()+"  '>y|n?oH7:o6_u~/Ïe˧ˏOfk4UmXs6oq8Nш. SjuATv9^o;mJmwz?%eX1[wS8DJgB(2b,OApmLqg Eg^ϭB )m3r Y,Rjb@Ί T>3&X0Ţ2sbn )TyZkEN3 7Qth0XdIpA(EsIIؐ{!%T]Ռ9DBL4?w WݸJLf{/ym|rE@ "$$F14;ӼZUx ITk=#9qXSY7ߦ:҅$@Y!P`sP?ABxtV=veSYe5tTKvȩ`3:47ۭUjTnXNf48yMBݲn41CLq۪.Z`]ʒ'vZ!톐 kHe)^MdJp<ŤڍYvShS f·oϽUePMȌ҈7>Tr*e&1 yDR)rHT̹|" "U2l_zu'O[<{ug3j'P 3jC %Yd 1sĊH[7`iX)8W6!앪P֞jL0"a\cQFЩwZf^,Znz^ .>0}ɽi׷U[2Zc,u]uB)3c9%fV0f]+޽u^?HW_3^-ƺoowJt}G$h VVbMϨPF%9~ruc(VլV;4A(KeA㪭rJ1$WSC2V{svۧ5\HA@2V#"$hĜ ꤶe*($10x3Ŵy{;Oܶ&U  RDXJ&olnSZ BpZW٪f'7_}w8qZ5HQ 5"L1NSrFaDQJUpf8c.w$2!c^<Վ IKCSq6l3 oZ;!*8E#oo!]Z8M -Lq|(1YFiG?8ou**7>q%@Sd^~:?l_\oW>>}nlRL.r&uLJ $g;º2$a)\cW'Ry juӘrqs1$sn9\"!l|E Edb{DM.w/s,v]gz|yz:.sL{2K~_v:[[ZymB'2 )< 0"&e,LtA!p;[!1BF0J8Fkkc0d! b(L!!)o%$Ĕ hɼ>]4 bfe9j$& H | 1R",%34Φ[H9mg_xC"*5¦h[Վ캱093F[ i XZw V!ykXhZbR$@$IXp8GDi4F0B” =vq~brZXWPբrk.gM]1n]a?>UaɚxR1˧P(}ry_}ʕ@9[ _fN}>=[o7|V)R/?{f~wryk oeB4kXY*DvUC1e)SpFp1)+]_DaZ!#*D(LK9+kVS073D>k&d)zE|U)ҵ5÷Dk,B*42qѶߖ ,VXސ*A!J^+ӏf3tA,sXbe"h-qxTkq(g*b5Z@Ky;;y㼥cVm?$ Ŝ@ʼnhowhfa\xr1rIVxјƂAJ/>;㇪.gFxM{Sx<)ɃgWލLn^y?L)lz1+\rRC"E H)d1O;PARŒ\T~ݪaJic/O~ɏ>ؿK,i_j\*&-Xg7ϟO?=w~__47/O|<=l@py11$O~PB\T~\oO)㘸;kCNeȹ 'g!'KʅRhݱG"J(B.+Ҥ!PcfF!"  2Ʃ> T5jE߮ro r%BEE  rb*,,0"X*5saQBNd B2}!&KTpdB, PQ`^Z|{$)j9y b \+Tض8  Z)Asn ݛbE$GCd5 8ECӐ`QLq9g;n(y^ݾ[[rOFR+pߚwv{?C5>8W(WսFqJj}`n7Ę&4 Sƀ*gYhiJ9#B@ b&cƘ6'u(1H9N )es,K 8GҔcoPfy(CY>ĠS.">baoԬB \22 idAPqV}[> D "pɥH7Nc s%lb©ZR2(DĘFDQJDƘ\ѥp6KvF+hp\[n$`Iy8k\/x8#(UmkxQ}VQR*bN sZt̝NL_SJ\Ϛn?0_g}hS}[As'E=\H gq}7o4muއf6۝tP$%bjb˶Ȳ*A)'?OTrUܔj˖T"%b $H#@\6ӾZcþ^c=;x=fg}Cv:kvn7N']xpT,.0 t0~쵗,ۧדR4S1Glp\A2;f Zrћ딙鲋Ô ͱkf(P)u(QM=Qorc"ȵK1@B޻8ITw*"! H` SѢ6sUm̹T `r*u!0bʥ> tW"pH`@@bPk&D0#$ Uf*z1eb``"`Jh*jj6J)e,#!O]ב)Vd`ޱQ"]si)еk%05s mpCrWOcÐx1k=l):_̶ɼut"nau|t.ZNCy*|ּ~w5{G*0Ar W!"ț1;d\çwf[s40c] [GDni(o=![~YKI;Y4^]Kbh 8bP̩r&FuARwEu?d\o462c+8R)US\U0F"Bf7!f:\ Q`DD$bh']hT*"sr xgf6 ^Rlm$WDqFm,4 #tX4!2\UHD@Njah#ZSϷî萵1!1[.'Ru rqL&eB%0;[t'jAkQ8E!{O^t9?IQa,8jjٵ&vW?~^j>{6f)=}c1vrni|h^ņ}!<_G mJ]Pf^iO.6w.8*Uw*.ePl bTtwZ18LuKU3D={~3%dvDх1U`$Sb!蝙VQbBf0j) H5G L]k!B$"\j LS33Skch7f虉"EfE?.xAǨ79iQ* ޵z7S)G& Mj$`8TaAx7L]ڏ3|rg"8^?wbh;~tׅa;e?|n8i-q4K$k//Ϟ2ݼ/o>QsjJtdcJc;Ah[Gz|L\n] ٤>YӒAeeËIEw ;C<ƹ4D̖mDӢIUC@p4:vȀV1Q"'"%W8󈐐J5&dB nRl}-=R|Qmf&OԆPJaQlLEJ=4Jr21SdlSGIj9\[8ZDլD{vHWq[PnD%10Y9v]EdƳsy#*36K #u<0/VKf՘jhfsEJdDZNU6,qSC m!Mi>so|52eޭN;D6}tqe\V}{?o#_~x}4[5 ݴTáw4xlqy㟹i)>+\ fIsλ>k5ZoC\&3,R=b4r {®@0 Y!͛&B-*{jRL!Glf`#Bꚨ&L=Q`i<9 Csj=EcG޹;;*x9g*Db\5U13Ǟ 0Œ1{5>^lRU00; bY f e5gNL,P]LUvd!`혫(n,Onƛ^ٕGwz͏W_?8֛R ׂ̜UH#$ӊDH .:O5g2b6RQ(f6RD4Ա!T`0Ch 35FCUU m.穪 j$&Z{]֭XUk6*"Rq=2b\\;Gx;/lvi*FU訪V dhKɥVq.>/vZYG,lo^َE!ni_j?*Y-+.۶ >\&4bgx;Lj~TK*wZ<͐x3zKe*5W!@9rr ڥZUEE`a뛶f\I&4bWU=VƑ''*̵߿+Ea lĎvU}nF&mp! ph? 0Zm@rιkNZUOa͒^,x\Je"3h{T!~Ї<PхKT0o}1Mfa^{Vut7|8YtXJ͟~߻gO>xl'O프BG~n\WW.`q^_̎I/ض닫16xv4Lf'q`tm&?c7 )NuεޫiUe4@MLF۔>Te*5! \1K,D,͎41!,Z#KDE?UAbh=Ӕ$p.HVD966RDUsEcvaEsv1 aU/.Trr &qۨ)yM">r*@x&!iݢ RUfL9o`cXLZ=T*N4McVCާ*a4Cʥ*дu.\U 6F!LU.ԚDPkA#BR Ǟ_4ND"2`fhFD,8HR3)WG8R$lՃ"zb$fSyKfji|౔IeujªC.Z lٞ4͘j)U;*EM`Ly޵}^lwE!ZB5Jb LPjEBSMtRfB\ZBp`f#X<;R6@4D/jV:!zF1WG4k"! )A{'4&p"V sSahrDYl,&JV+'nuqXj\3tM* ̜jgGZ4M]l,ſH޲wPX,5U]5ۍypܝ璉Pkd3Vժ XĪِ! 16)dTjDIA!yF@*,j@s58Y ,U5DQeR͌"21VYI-ٰmTSN/ LLS^v̓J-q5]uQ y䓮uC&:I5ȌHH T@f1HXrN9Z$gcJCyC IwCoFcYTU^E+o"&)8̎"΂;cC/O@Z*Ugv.O !H-Y\f6w'׷NI<Enu{+ߵ9צ l\yZ-}An6ˋ7`$8b/ YDqwSTxƳ`q.@'fT,:FDHR#34CD6R* ީ1EEyG֩T5L(;G9 YU%T3ϼ%6jyq3%繪,dJMUᶘkz"fS3OUD,9<Ϛ %ٽl]x_C'&sp0-KIEڰ p|mC iTleώ\%<^121>\My|F~R5GzW^l|s%Ղs)3#Jfxc)FXU sdyL K)3:"]lU  1Xc\5"`fb/#12 p*1M,b"?j^Z1Ȉ̼lc]ZD&)#C=َ7UgOjy8E4znb6nU̬5m;VAtIee65=u}j:"݌r;"tYj8GfzdW].tl}+ 39&)0U\jpBl!]l:|L]GW>RIB43C}l3mfL%[P/] ޸Zg^fonƊݪY/nv3Q7{9][']˳R&CA1ZpEѳ(n!*Z ArTDs1j""jͳ6:B-587V!v}9!T+8 )!*) n!{1Oby7}p;Uj)HP"-:/ttvz؝f\0U=Y'C.Ȯ YtQpR8Ը8*aebD&h\Rp[˜!KFR"$/\k.xeWdշ^M 3U3UYu!OiQMUsݐQnj|v,z>=Yo/. pq ~ƍCEgy`Gհ!LU;^]mn2D򷏻<%tr6g]bơ}InR.{$ڥ2vwE685OD(R jY&QM  VUH蔊gWK1@A@6\v&He<0Rc0E0W=좥q]bOSt18ra ;ۯ'cqv2_btGGs~o?JO_Wp׾z+~,rG^m&3Pqt-1J mL.m|5ɓݸ(*eR#2Te6SH϶(NJrOm̵ϺME`_*;Σl|'ϯa9]oE4׻2MHCy*⩳wM*la5T=G/.,vXIz>:jOW\p]JQT>>]~j~r97]gȇnmEٳu>.0h5$4;r@G 3c'" Pz&PkЇxR8΢7"hC`Ow]t: ѱ S%UR@gj*} t=7?ϼ߻v}*s`$٭au~yVzvf' ?'t|_ohVw&5/}z^:Z\sp ߌylk%2YCQDHN|Oy=ԙ։H]ty*P D9fw&:C!rm z=|F!aelb7SyұN 6jpm\e0碟歿uUeyzUjy/׻W_:^ߔw6s)"J6*"#Q19!W1%@Ϥc.ȤfXD&즜ɐDGb$@cmլVw ☈@ jZFGc2Ѣs֒3zq(O=4Up?LLm }./^] WvcΐG9ćAJ9b繂2ǜjkfgb <@U1d3`CםCʥns \u,:VKJAQt3 )MR3 *9@h$9"h&}mG> :m/ow~W̹n|bȰݹaXL|s~n ~\*RR̜sx__O) Rd.Uƹ.zOn5*aʵ*hMznR >(0 5Stu?즚_TjeR!ɬ ̬SDfĚ٬[6 ERD{z3},U\f]klU/v"Ёk l#B E[kg C"w>ܭ_:?f߈"G7~fLhbIE^vn7Q:1dŔg4C.c>jiJcڕZUkQ5a%U1jo8BBS$p=>W&`T,zFƩϖ͔})-EԠ*/)0Meq4[onRv,"9w3}l_nFvv?;ݬwN,C.鞞 ש2Q8΍&j2juPzC,}`f\@xncH03 B.f5G왒֢yC,T,bLMTA%:_ 'C~_Oǿڏ|[bۋ ;f2ipq1_ߡ__mٳ6wÇf耖=ZrZs?co{鷿;YߑY D$ZMsLA`uˤ 2geU 0HebC"uOI +&פE()aJq1FNh5bR6n&R'b[prt:.6nRR2:&L ml( i]ko.(%@LjjJL PD :b@D"GcE2Qa]90@5#"8"B֢hD=:$@hK~>W?__ٟʝ['R%UC+?\3R0 ,Um罇*hti\27Զ`HTTi[d뼍M oBTBTԺE^ODKdXC .=Nι%#OFb_N~}K}PiO2u.}3&M@/ƷsH(8jf(Dw(bpA̢ 8FwdMsLD;@΋HUպT8z,4!bY VbJDT' S-xW_z~/}3m4ō"5M^<~}y+8E?sko|l<}?UxwLW?,m7>6mWCGFmh,Ct#/>i*y8wmۆͤ 1UQOĐRw &UyI0eEjH\8|.fkDHRI$0̆a")3TEżi8z7axDMX*Rr.]vd3r!ӔώWk&?Oo?(g0&݊df{Ք~^1VD \I,TuFUATk13$D|\e_j1TT ,r)Tjf؁LyJ&jehSv_>O~ۿ~+_'wbuԷ> {[GwWn?Q?: =7i1L7?cԧǢɇiHԶme߈d05]*j1Dr!#>8 f̈4 hH(2WM.8o.0e]z;eVxw},ZTccO8;nP>!N"w"Tc W wH+!8s{3E*VA"YZTCDfkm(@Uyrnpbf޹ }q{݋wߎv۩TIs.8R 2M @XUE&\ВqtHΐR 2 v#y@UF2SFbD$S:ۛ!_jJ@jDbxj}ųy Iw.Md.ǜDmJ.ɳ]7ɏz^x=Lϧoǝ`ׇj; h  G\Uad*n vHY*ZV0GLj& q V3=nR$Z&}8T%Ḃb4@,RVh#b@jC3" 6 {pٳG?a'ǏwڧsgwOO·? Əvzo_[!o;OgmAq7n~qj\+w[q3잿KW~/y|7iwd @t0șGU3phdLca¹AkjljVDƼh"dxdTYw5s -YHC4M t;J{>f2}xaO~r~?O>$T%*D7Θ͕[/fzW msMJKFlE)'7UU S-9Ϙ*ZpNa|𰵞 p,e} (q1Kn7r7JV5[8l&u.Cc!jC)j[QQy:Now5hcí.̈wj?#?3o~?·|Ne}նq՗[_r ?<4L(ffYĔKժJG1D9STXU$43S\,p 214O8U*}jHqc]QuXJv-fJ}]74k^ `Wj\ĴqAk7#-#Mk'v\ oYm?Lϧj'~ f#ʪbh DDTĊTC(=;1M;::' ,Nڋ|+Ͼ/ 9:=Z CǺۥh̼i.5@ s`d35BۥZ"RH9nÝ*![]bTOɡ~g^3ZbTCNUf>i=Ud imԪGT@05@<QРyf5o4 Jo|TiMo6Ø˓/m4oV˳gYzʣZ!QU!fRPt6+Z;RE$!@lzxTˢ33Ozf]OeLT$"Og11rdgR;q7}K)>x 6!< 8m8Vvs&m)@n'*}|Gf欰xDR:. D!8Sk Wx0F:lfg2!tUPTU sjmdBUVi7MGG{O}g5My\/~뭷z/m|hN9xV#N#BvfPiYC"~}i`9U5s}N$%:ގbS*Rrl7gmǟ?g~ky}ܣ:n /krwW9!}U٬qf_d,a U&0dDDs̞֬<љfHv&Vjh5qC97LH@(^05E(\EwΓ,jv(00=s\[fNIDZShQ(87fXUQ?:t\)bVX&7?/]|>ok]g:齓~uZJYܝw'صy닇sCk*V}BG_{7xYYװ扽[v7٪>ugy{hO]jo/TK~ϛTw4Ud)clB:UQ"nR1W1|pjR.!D}l"@\s-vphM`*EZ"stqal՘h2-fS52 ֓>OXSZJ2oY`Rfs)1~}JS"vWc:Dob#dBhCUBQHs]Us0G25dTU35D4 ^B¼iJ%Ƈ6(`wpSL> Ai4i޾wg_vJ~?qR`H+{';wtT̓_FR*&/wg?wpula!z&1*4IH \ҼmԡTO'q E w3YUcB;<[u~YEǩdG:HU*G-MfXYl"t̪zc&ŋƔ X+)YPo󔋺*;`6FQ>O *AQL$`U͡f2R@+ D ԊTZZd13"2U6J*R aJhq?|-XΪ]w]ӝݪf}2ݼKգqWwO'C/=~ż])Q!UuR٫V4/jg*vPٲT"׆0zx1yjEg}뜩 wx1Es$ 2R:"(Eݪ d&) sD\1{gjg)~ Zf!?Z(;`Tf|?*̃  RU#Uux`IƙY'*S8Rl:»b` +"&mNm *DDfCjU#¢5z_T]Ŕxh*E#zg6 !xO>ۢTH9?Zv[*^}xaI6^i7?iԲo{mV+ٙ ~{ZyKm*Gr[Poz6G-[j\wj g_rlZԌ!uѧR*#0t*e!„8 4ڴmEޛ3Uq뤔m·)2?p"]n 19Q0oC.wm;}ݗZWM 2픺6 { b̬* ZRBŒUS>n9ko0#Fv`/'BBDh6"OshBu9R}rXYI0)E} Rֲh#NtuU%"DLzЍrJNͤ*!ay\"4u3 a'^9?~+UEl @9.o>v]zs?9;5mǾ_ܺ^1&\d|!%tL"Aj֪޵9:%&^Zw؜m`F@B?DAd_ zhAFa{vsƈ 0E箆)(Pk51j@us1>Rb1@Y5HY"u50w+竻3a)g}@[旎S){@Ϊ~ɏ|\ȕ*Q)XQP4VbJEcTQGĄ MtƊf&E!|r&Tfv"TEɍbU>d1`@Ml\QDFE:y|?SߚO~z@[Hhór`nMԝt-ҝ&yqpO9 @FV0Ib]=hC;]ɓ,;= g`s 1`׹VFLNj۔Rshބww;]`눪8Ds v1ِS0fI)O3_oҿYMßحEL92v4^?]|vٻݿ{OBs634X1$fBɘod"_=K]ZZhzOӔs1:ě珏n/z_].]gLh* < rsS>+'ȶ}&y$W T<b Ue,18!e';F@0(*3"1 A 0*20a53{G$6P#Eઉвk"J.]N.HYo>qO}{~WaIwܟt%?_o_lFrlZv@5L$e|e_ksݑ؍k3v<[^<]{F UsrTvh}vN?iJo|?kc.E }yhj @pQG}H9WQ(!#0ULUb.;WkYԒ~|_~qrO ˋ׿͋ͱ秫OV^__}}w|;0%Pّ٪LW:j H͵kiW|uz4w%~;-qw䱺;/)gADE;T 2X%y?;[.%%OăXjt~5Wgfy&sDFTYYY*Vq*N$Jiɐjp}k}a 7 nB-KDJMEk`Msgo{||{ϳe&Ϲ9mLbfnv6C ,V}J!S.,p_&* )U}[t ڦ eyx=6"iJΗq-H*$ؖ,*hCXjV[Vh3yUu)/nf1Q_cx4QKyS@Y [aS)H 0On-#@b4gW;saW )4˜YIy>~호Ӭ`J{ '?ɷ?FrRM_&.orScFam5l~@auoO~xk7x;Wǫ_x3.u@! }G?݋]3;q_]lן=[n7oܓ@7n|z uX yxvryڭk{?o?zC}pEbM}skp]Łm^W4fԳ"!9i)qܙSĽLM S`s D]*ڮMѐ͖UhCHØMܠbz9+FȹlS@ s[UA o_;vodfBH0\51!& {RT!H/|DgS5eĆ4;P,oL̀ܭX2zC<5F5FWUM}}Q]U痠iVmݢ;?W۽&9E$+boALozթ:z_#[N/)6Wn<|O.r9_=|d}&PѴf>_w\~<<\V5^/li??n^f\R:9`*%&-A`TYc ]Bu%KUb|/rHp7&""iIDXdẂdm%;!wM̂^$LjErrFSA,P̛J. x90~jjuu41\|B(|2%ޕқmTL<S7ACfZGڧ[-Lcb4f7 &H@ԜD$àʄ 8 aC.YIuY+E5k}'v~gv{y'G{~g&{w]*kח~g% ;3YO'ѭ~WWX*'2hنY]o/6z~+m['?d_~n;ë]Z $XD $XrDCNA*&WRݘ5736VU=w)32c^9:LLXTa,HhH a$DJbĊy!)v/wζXֹ ;b|;З9충0P :DfM 888¤ LUKg1UC{DD as.1B!deٌ 2UHC`jnqڢ/a`ۋndc#ҷ l&鳿!*@G7Jq G7dqH,DV4%İ/ݷ rHD^~{x?{w~?~ɲ]uWCo8ܭPýA'/vq;ӓgËM2jo)F*!HXK먙ClfIU 'ՐKa "{#_W K#EE:,Bj!ײl#Yqz:Z(| I!&5nYC\DQ0cjYm^] \W[<7Bx|rjȈF7h%L 0Od(fNAHOO$TO @cM8!Фv̦Z3Ѡz1dr7$|H5s7o-$톳̮ۤ+]q9y8χö'hd}[459l؍Mwtxm0nb M%t5j`e%g]y(0!# OItp@twfVCJ^gsg!w"L:yΝWB ,eUwEwetF'++V]ڪgYhzκw]&E e%¬VdXl6D9 jkG h1ڈ,7))#N}4GWypp3I FprK,7YL@bNc.H+NʴuUӘM y)CIƢBW/¬זu`\QgE%ua}/Z~[J]_ͫxx(01ݧW;8GW\-MGΖ_ůvsps~[ ^Qf˧||RE8_|޼~vɦ/Ub"s ,AhB&]U T{M3aT8UF)ς0n <ꊤHT-~m"ےCjf6)墋*f V _pZj]{x!-fu%ndLف 0Bqy{ݷG]#MqkvH;7(lh(͡a.H8WAy3fB6SW- ,] !*9ɗx͙X-r.U结鋫1e*n;/>W~λu:yӪVqN;7 # JDD#!O>vhå{bى}鳏ϻ^[3YdEJON:*4l΁ZBH$Dtݡ6%w+yK1]*JcMCq5y2+;&V]݄)'ձXh>:Մ`0QD汔ZOO.f|ƦEOԧ$9osBW?QhZaJA6DD(fDXRb(YK(\afY]#XRc!#8TLmfY3:2bag,;UMMhktvh#;.?ӳ'ϯ}͒S|}94m#G_  l#7.nrX_r/ b*oX|>2yҐkWE_q簮9F>G~ c.HԚ)!p_L =[51@jbtUB2hj>:TLbj@KY%H2[ {nL+'> Ҋ Z$߈hNT1"Q02XrC|i@T(gn>l!"dbS *$n D0?#$@VDo߿jn;3ErBP ;/#n^*ݝX 1S'Dhc03_6pVݹ]U\\Z;^A2R ^?<-J˚B>x0Gin}[_x{ >sq=b$l1cNjDDi|@"pӫ|5PvXE_h+r>|3PJ8C6Tͭ%i˹+:as')71"M9|nfM90srإ\ @VC?TBPa aT۩fuIOӍC4Ij[Bt9&3'E&%3@"ʫkWAt/6Pl&dj'Cdjnh,e j6+u+"ļ&,j.yL`C7j-i0&@s &STS:r# 0jĄ`B|4 (^Jqs^J~ccC R ۶O_=x',oX~BWx)#[q4.]'K'O#1ݏor`޿| os,m܌O7?}Gw,HȢ\e'1̚PH6#mVU܍`7OlS[fAbUM'̄8XXFm1R4 %bK6h9_˜;@@fH2~7G `]muI- DDUUܐiKRYpU{5tVm!!X9ZD ,C0v껬1Ds(nFH0yĐ a,6IKfޛLa5 #EK}(C'TnZ_ fK̏7C+-jmؚ*fvZ._yskO[53zK%4 |NvD,ONf|ɿ7oub{~|z`y6Ha7Nu$ZMb~E7tHB?P8݉ qy#4]jy0HK "ث&.5fnB3jWŜE;(R <Q2 g!Al(88nPGu%+@q :,2j"H`cRELd}){3wﵕ HxWL9]-'srp@@f 0:!LL6UA̭f3"ޕRlr64ΪϙH3EUG~MZo޸uhwqQs|ʡ2fW+c,b^͛tO.?Wdz#~G ]j dH"Uutc'ϾHk38?^yАe7B)\#a׏ĸJw{fĤf#5+WT;_F{`'O'NlrmEG2dT[חgWnmӧ"+ȥ7z6jNd U "@E8"K9%s+WEFi&HM9 @t>|(*L51$WpDz2C"E/nMV ":BgU6^SbUs&\t~ёN^ ?GO/bgsn|v\/ԫiW(\ P@ws{?RAX74gv=]o?;JVnM%C./C8<騞"0*u7Zo>;=^'C5  %9ZM(dP!6!\ c j9ehY]fM{5@c)4͔|P]**!T9, N#qq\C:9Gy|!hF42+H]ռ 1WCJ-ܰ*1R2s6Bj)hac*2b٨^\5e/ܻݰ!'g^{?74UUW-zH#^]l'>Pߺspc4zˋn}>K,.J5Ҷ@a~O[?zN|}D}?bb}uq5t pzfm>mGߥZ:2bV) \E QKFف ܝ(![TV xq$"C Gz7#75Qic G.V7BRFd.T#Xl`BjDU 0+Gp@ry!,\ ikA$Ϛf|1^%;XbEdzz{v=^&<]a8nU`.P#TTZ5OvyLgFJ^ƀX gS &1kjn2OZn::hjV>ds=Kc1??~zrM34~|k3 fm7lp@~;MP5ټW Y|p~~UVS-xڝ}|U*Cblwܽ=@0k N\m:C^ooPӘdjnLE ;  "8`,8,4"NYwC>h[5M^yVWUUSJXT\<#Q A7,%#P$kIf@49CXJr1y]-lR9 FaYUPO7χCqc EH*bX,0dNH0Ձzbd2 1x}o1g˄X2vӓ>8X.kHYOO۷n߰q U8 Faq|kow; {EuXn_{Ӈq"׈ *n7T-E-wnT^Wevϰ'=<Xʲɱu <?( ~ho7.^}Pb+,Y15DH8xU|C((" SB/jjĦsQ!҄H\׍U.:0g3DpVžxv۫:g&|1IEݛX!BEv9Q15YQU{!B tD5A~ƫ=X[FgB"&X,墳* b1cH0!0)qIGdu%@:^[VeFua|{77o}|ةHB\ s<9Xzȏ.wKLd5- ]L~0cQB+"Sey.2gDZRQojHy(2Pw)z̔Ͳ8&!";ͪ0<3BCa;d61<1VM},biutU@\JA&e1OPΉ̌i*C@ yq'{úZd> YjֶMaG%mL͆ #AǒWm|:嶭i5E̊wn r9\nywn}Mmݭ(T@M8jA=< jŻ'gϭЍxK{z`Io^3܍&l9?{?xGwtk)I ؈ `p)0(HIJǮ̯R^̀gCW&{P @D#d*AA # !UIKVKi2[,}6p V&p`J)`Rkch%Cr=ęmH4 +#R ڕ27m1_VսNnM.ű!"8^d̢nP=퇏.6u]UB1"{ٶ " f(܄ fɊ T@݊)Ϫj<6m/grjn8zvrN>g hy[nj7ٳ_3jygWP e8NC軺I9oJ6OS W40ݡ!guz jtTۦ) E99:A2@;6HB)ySߜWmG{0#EaB02!%x2yr~>|~>Χ/~W/oyo/}~?=9X A곮MSW/R̖u?qrV"K-ϙZ:`VZ.I=Vqʲ[9Չ9bXrIfI ydvfw(VJY6v^ŏ.4k9j݊_;`ﭿ?/B[^9:Ul0dv 27䮀=oWћpjٶ^-3"ƓAS:ᛮ'O>_^|w|>|OR6!>܎|,:^-C<:0SB`JXQjXّ }B]W/ve}@B'nHWڲGyv,f@ ܫ#.[͒9F`.a0]Dٕ"4⎄ F5u&S\SPwLG}KlV)hgƿr(HXwiZ+J 0ֵjdpFf&sȹ|֘㬎U Mb”KbR,'Ջݮ~{`ܯ{rW_>f=|卷z8~+FnT[\˛H)DD"B>\=zq\!ns5Cnw?ϧɿ,{w+7 qwަI;G5-I Dy?Lӑl6M} -2HXJyٞ&$DP̀HC)öWD79cR.6FS+npU!) :R?LQ2 '$9 B ڦ\BQrLC6nL^^:EDEaU,V cOrTrMî ۜERq5_6jt<8CPͲ0BVƄHs|=0rൣߺɷ=ypΝ~ɍkWJTz*w  ̝ݕ4@GWʞ60fri.S`/ =7?ÿG^@Ϟ?^_Uu~׿? DjQ-;& M(5b!OꊃM4t˩CWQ+E=z) /:n)13sFɟ YvnS&nkB3#UܽaLfeU7G-"jFAӨJ̈̋^E˶Ų:oILy 2 n^Jx{6's}X̏ŵn>x{o]Wn\{[_#1(SI A%<=# ̧XFLż47sH sCUե6~ӪjRMJδѐC1@ff@= !v,ҙ aWtepi XO4\;GĀY 2 9 Qo+mveb: C 1 )&;4us5/k%́xLiVES%"$](ΪzHjsgw0Yܿi.b W$P [vOB;cR o~IX~靯o}\^7?֯w:;_ "YVU\2B 00",ۜq*kGf!"Z aŬ,D*Ft9\PGj#berXІ8w)̈́A*}X-FUŊ:])RUۜA[U-Gup,%يɟ耦fQ<mjӝy#CU ͈wwn^->H Xʪ'qtRGrT_n 0ˋ{dc8nhG΋~$ێ/>z? k_Q}Ԇő,cu@Qts@Ggs:`tdKpjT"Xq򴎁(#M$rI^y?}w/.ƒz]p5͛n3i}.S\ " dBt@dn8! RY#dZQm~9ٕ$yJإmw'+̅h RLuè:Cr/8YfsL .lZ2#8bq;"*BUˢ8Vf].sa4}ٳE]nO^\Ľ:ΚMkfq>>H0 +\ Ԕ gU@!`@h}7l7r<{1C?+ifwc˫߸MjdڹjuNJhȧ1^}Q8 ^xNHy/{Ō=%@S"` {Sb/ZBE@DjozG??q뗗{W~yNc<}~Iف(rVBhBd",},0K@" v97,TT$պ `;Ml{V Pͧ֬!q2sL21(4ݛy"E P,ڕ숀I#DChe? sKrhz6(Av9Wnw;)aTpLz "<潦j ]ץ1ϯ:dB$tDٌeSF.ljFLEuHct?(|ﭟbqp@M&C9Q2L3 !LæЦR!G ۬Gr/n#"8Xͺa8/g 0pt'p ^(V~sw+͵,o~Kjl6n;z #$C B=dLB%;tt%UmTbEh1':lՆXLi=EF298x8?zTJfO?Լm!Y4U*Z*M2Vmsc*3 Q@IU^#SeL`SPͧN_Բb0*Af:j1ݙЬ&@w^`WߺSWՎjvm q4{|feB\^mc~ލy\4eu5CBB,E T¦:yYӯ[H3inڽkhW~իc8_\3ٰgoV~ eҝPSV46%-&ɼx d@1TVȆzroVrh5 Yw_N#]]֕7L_TQYq" L n,cBBL5Vˉ $V۬IK$ lbL~4o !N 0ϫXO7wwf6`$Mb6!f^=Գ[$Q sȄT*fW#@ ՚*8QH tb>:|~`BTr.YXrfnESX][j]* ߯܅KmţZqN;m ]װY AR`4ˀոRٻg`;OWC_nl$*H2GH8ibF/=@HDq9:W\&J$!Gzɋ/.;ˣi{Պ>lGn=?pPLLfH$&b.0$L1缈7د<9T@"LU՘Wy[E!Eu"T5S̀Ы%Uq!4)0R1DSŝ̭Nsuj0 ! Z;-ލ!,ےHZ#fš8;ׯ]^^)rq^(.1PF"Ң2?jρmṕdĮp`:X0Kn3ZbuV{zz|W'//ڷ>뷯ܷ~?c+ڍ)Ox L/7/3lxJ;ǩLHDC)8y+`.eQ׈%x51E%U h041 Lh4+"P =0]*>\E,ƤFU5 5,}&r#SYGTU0pFX~gVaN)߻{? Y.惚 (#R@X,# !j,nZ 3m*UC1wF89dzBntq/گJRD50\>|>~?x_OBxÁ"y5#srpD'P5!G`qYlDW+I5Q@bpg$2.dӪ.j?ػv۟~?~WoS{B\ CDM *@q81`gM%bŤf})l,% ZAUHto(n6ǢWS@}o12!(fj2+f|vj szT+˧~"}QA}q c!>(NL@L d6yU!6dӘJv@C,f6oDDۯꞝճ!-g7?(TUT59t"*6޽>yJ67xAAǝps\&pETDt ḴiIHLs@D,-J3]0, x8FĘab>ۦdڗzk[7o3~_޿gqSdT+)kbدa%Fa H`> Ƣӳz,e HPLfG,s^W-#;4Uu]~& 5ڔb1b:UGn829z<0 #(`-;-=#\ UjS5iҊ) [p_y~*1ձPa0^[UWgg]ݐX%5Eblȹ7'Bpwduuj]MZ]8 ŵž[W%>wNauL a~w ?vKq4)A0Q}$4}TGr2D 9#5j$nR?ߜoO×G_< o֗o~AVR"EpqHn8T*BbJ&DB@Xz&h$\U115s0p$9n/v!mScZ\ 0<ҩ1s2UQ՝C1T8U+/y6NAֲۖhf^{kV]V(:K`N)>ֵzcث.#dO `Sn)8P'#b.F聑HCdc~[ ՍQ!o>@&|܊Y$:kJޖ y~ρ!xY -oZB4 ״GAn9 ׎l: QSRB 4mHZ`e@,8}h׿_<য়?HSuu$&ϖP j6^_ ^RsZ#ǘyj@hK]UHzL9̫0V1r2Q}4"[]I#Lc^1셠㴡b'ڤa" \i-7vr[UbgU+@%qzՒ  ,E=d:Ȫ4PeU@5u"@P @8*F©_{7W sS߶GP@ 2Ńaviup۽'o"/X5YYZ-'K$-^I#e8DsG`DDۈ> 1x#R!̫վ\<'mgVM{ɟOOO%ͣpDwK9ULgu]n10K\$lS>F!,˦nDfuܫ9u$p+#ζ'dQ? UE`"A8ue>mϟnLJA:Ȑ# f !Xլf LILTFtwaL䷿sxvg%j[nc̽pSlD䂛vqxYٝǯŽpȁ5-; @HP,X)R$-"\MJ;!ڝ=cj >yɋW,B"Tljúrnbhb,9q𬥖k}+ z1UՊeԼS ˆTX {UuߟV ݖuU0 !!ˡJYR n;uY"ɼt1 Nv iA8|s00 q) a!,`}N^!N͘sL8 1͎5J%Gz޵yi֍(,H<#6۔b%kQUUEtDf;-UFH F!(# C-޹.CsWR5+Htg\%eP/nW=*,V#-`hZvf ZDtD),&x,z-!EDDvnwstysSD& ?ɏ=z2-w۬+RQːKRSGa8R5S3YS9::|~qO>7l#ↈY-kXjfuR"bE> >h ,e,]Uinh;/@2be6pKv:?)qL 1&ީ(L@ui"BXTjqpdߍ[_.cVCGrBFKYq[Zd1WDvUU}2KDEcT)dt GAHТ)Avf:SGjnT{4c-sfEGt-ݵ䣺"~" ,T[H8d :nK$e!*yIDAT߉/!k?чU&edd&$@I͢0DfɚlΉ $+Y|ș*a|c|r1۳rHc{nMvΞ巛#X/嶖"Ojiv@# UK͠bg@F`Fni: &mxtu[zecE>(+?`Z?{ Fmp(LH@2АpcS)Y0ove2[E44=J!ĸI8!m,E( w)j崬+2a0+p-ҥ$L]`J Xm,CK!ׁ!VLDVa:ȃiFsȈ)e֩5L뜯: !Aff8c?"iR$H/y M(B`Z5ySK/|˯4yj-C>woӏBң,3-*`^ ~4hR-ݒj"Q=`8 u8E@J_{:~[A8VVxBPEe.Wvp,X7?/_b@NDn̤{frS '^f ~UTZq\<\mwc,.[ 5aVwnqIk 5@TbZ8 Xj)?#wA@+VwxA-u`*B07<%wfÈ`^Ig͹EQ/m\NG86h 1\@i܎4(AN\d$5[::dӊeUJYK`!:-U%݈GM-K|YlHLsK8#|&ݐR>{uqS$sK&ׯHC,yNĔ'IUA#|uT"7ATĔhHɊ93bnKFxL z% m./=z8:|հl=mМ% We{LX޼[׾{ɏU/?hViw_R).g~d!^u4'dF3 HD<3dyU͘  "U7DF/LdࣚC)wdԩfJ~ffVGqOE0FHj9"0xĩRF x6k؈%s@Ԝe6rA:uΆQ\Fx r6a~@wyv70_RL}d1eBF[blp5U jUpλ1u8n.| Oo/-_pqz*5ci06@YiWa 1p +{TUtꭄeZc7C剧Tʕ-mO>zlutwwƺq?^77ryQdbɔS jޡK Y+U 1z˨ 7E&&Ž%TdQIt*tn^rq<\1bȦ,FtUݽb3)j S(~z(H(iRCJsJ#tHHTT#srg6Hp`RI%0(GE*^;||LK.ݸlr6jSfj]r] w3Ʊw&>uUN MlB{8_lsV^vO#VxxZ-|َR,y@V=4&Ww*mɓ5uuUk}O_:8̹:ndv4HP%Įفn|y4\ h..ӟLn@peSuۋ@/_|^ܼx!~\ՕRճkfNjGO?s. Tȴ~Jb;Ml!,<>̌#%)H.&T x/FSΆH G]+jTL0.KhEx@DRz].숝C^t(,IʹΩVcWD*']}:yTM\9:?; >>ιZΟ~~>]QU蝂=l"\H"'_a,"HH4>/m}X9Ǡ e}X5) /?Xo^\_?v[Cf\Ef봹puQ:7^UXvx4.N7oxeZmp!o_~gwqvW-7j'Ͽ[q[ǹG_>MԷNYTT@p h>s m癐S*\s6 #ayg/REcn/!@t.eMf{T9eQTYrQyɬϙ:G  o?O>K3z̷Cҫݘț(:jE9S#E7DLcet6٬&9BODSɞ9VnfD@8U}Z1 E@J6 KDKn, Lc{FC30Pcb S_2!(1RY0ؘLAJ2t6:H)M)!2OY#lKy5=g5#wӧ$x>ͣAS WqY`L"jfX Ľ7X zN^\Jߧ.9VV=I9LP7f(t2},Fv8tceם*%^Ϟm8(ӥ!M5Fe^=wz:,No~J>OrՅzyr:_λ_RRه[qa=؅_gD4̍g&SDfE[]";k@Cj'@pC j嘉TDRJ*HDpf1:BaBa8_D L00{;"ME9fVf o`c) ~Ep@YJ Ef`RLwYSN go2|y?/SޤR̢#ETŀESV ̪{~a=S@pNn^K|S,-|Kvzߥݙ_,dJ`TՈ<]?%ܬ0^~9o^G5Rj^.Or3}59ffNx/}c| DBdi8{ytx5>? hr]-nG_z/]nSYמ<K$2~"@{K R8ULd6 X "obJR"!!utPs\ǻoܮj҄sQjT!m]E_1$LWhRv۔ޤD^!*"Hٓ{ y#:rc$Rwj4M˪&IlȺtXxTn?>fWI@+X$:BIk!5i沙S#Mï2N"GOO؜SM;wTƀ0,:pS1$$=p+~Lι1e=ocxW:=MP/NMElLz7]ߓ>ͻOޯtCq}pPds@( g[w|XhDLEE6%Q<{|Ťh"6P}b"b<,B=XSUeǎ 1/pjwâbxt?ma$*x*s;6 bj r˶`B<2M缙ay靣e.lίE3D(1!1@.eYEiD~DrXww] w߿u)4_ԏ 5G7߼v]K2XJ<4'("{C pUWMWYvb|Eg?x߼!oe,y\??Io~}om:g|7Ço?˫E ι'Y߻[/OWUΥ"αc"WD&&].ʴW EeX #b#f2s^KGBݥu^|7Q'q6)V<yslb0LmpYuTIH 'bRl3 1-C@>)͕s`,R)jU61KpUǜnRsOi. "HQä„GuTHc<@ գ:|덻W71PSgU82-UE].ɃxWe:, CVHytaO/Oț;2|^~[s3inݞ=g],?'= Z{/WG?@/%o{P;|tqY%`XU̐ P jG 3DU `Ua"f=;y΍c0l+95ݽsn,lg[+H&"RɢOYy*9(""U!PĐlJD`CbԠq)I53* a_ jFx3DPlrmN֑0'BdD 7qQUQ4SQt΢j<^ӨPΩ oY 35on~V/۴ۖd(/-Mhūg?˿k|Ɲy}7 >}q1b9:x6<=j|㝷qf*7lD$jscn4)C{f-Bh붛)gOR8-7v7'S]6.jiNˮ}p$oQʹOBz<)')sH'棍&3*GbZ:&)ο^_e+TAEȜ ڼFk(&3> a7wT.="ꞀmSI$2"{&8"#X{p xT'"AƋ~}7wdF\Dt2~q״hIj}xEu XKGwOPa"=x͓wɋ[_a{?|ч8LwWϝUoN"ׇ'mP,Ta;g=X?' ':UZoE)DT\_%iMȪ'sqrރY9zӜ v.:7}69a^ovIbXh3yڴ:^dW/ M$ZM,"FXD&dsAnX;^һS=Ҩ"@Ym2#bg<^ͮV99&0;o !9D@2Q#6tc֛9 mT쉳Z4aΥ iB&>:t_~]V\CJ*;">%`^RZ\)_!>A)E\ c M`^"$x}qsWm*ogW:1,\nvI5 zS"ș\5V(R*r5JWI7i&CG)bߗ jFGsFhXW _ )iA9̦VD Kө P;"CTU0ӂbu"y1@sI:._t`Ee0P, L|U^`fQ4,jQ?'>]/y xn=Y|O޿xxP|ڹsM^l?~|38>h%hVJO[Ӹ%M_n~;tbu 'xr쏎*9q}pM7/w_W 5] 90. +p>17CJ+)هw0vU |vszWR R1ۤ„r`Y];CF!Т eRve.giv &HbKsYv~Q͔ a(IRX!y^WeCP: ɪTի>߈syxBƙ[$TO$ N/1_`JX_N骈#:|˴[m>쮋1"i*&kϊt3*ƣE;3Ϻ^}2DC2P≘%@HA>@Ih`̤qw,&y's-@'@' tA}t%M.4Č)Ay LD8LT01s] +$@A'O:޹mZ 5gB7:w/ǟ̀'3 ,.9utWa?ogϞnE(HQ1&+D"# 0l癆&xf, rܵ "EnzFseW4ّq/V:rAJy:FYs|)!ЊhHdh@qțejYw6_T2k@4.$Α(P\͹ 7)fY5yePɷfgr׆s>]:~4U-`sb` I Kz~~[T.068?\u,$ml_>{](#55=x3Ď{fJH8K^r)_$d0Oo_|Y=\77=3Hype\.a? _n-;RDd!s.eQC@+jXGѡhTn]0)U1$)ۜ;RlV5@rU5pH~ ws6W1<{`o|(UP@fWD!zτB[ Y2Qx],4 @lZ G Hz ,߀%Cfu\30E"B 0kU QavgF15b I֭BuG#F`QR/ӕ U<6. m*'C5Syq}~чYR頊]WD`mtDEwۦIE)5Wr~ş۾DMՅs k9oUU}ȓV cãE;ŲI9w#y4s!E`}Df9Tg^tU1Ij b09)Dƃ!8qMxcQ5վhsj/ &h fH_ɋDm?`+XVaf&X8l߾׽;䲙 =ל4j]wDte]wJ~qG$!'b@~1z#@hyjiH`R._:B$Ԅ& iV$Oղ;}pkЧ4th%׻(upYmN1 :WGzlBW~sP n6!aԴqcYN6ٚ苂TѫYJh<]_աvXYaq7Sq.2MvYJRu?b'P0uE%D13efATgDE켣/9V VIAjԓYLT jjEX DD„ 8" uޡȈ 6 _{|Ɠ"P2^XKHX]ݹRoMY y `2t L٠!Ẅh]Vn̒15힟7*Ȥ\&Ay-N<9}x\lb7z}tqQvV%oSЩhGD6̓'R̔b8R xʩCp ձq\59;BU 1i.\nYZ))MY*RlU$",{6] yTmSf"z\&%xpS_( L"Q6Q d0d{4鼏&Ƅ.xP X)l fT TE"Q q1 B+Z'd^`@&w'm ` jS%@uegFL thn^{SԢy#$gXfW=}]Vz eiCr8ؼ ফK"D `t#Ǻ i76 MWdžvWԲb!x6%\␳1&v @QD HA,U9&P?eCl*|8fd$I qf FU-_J1xfB^dyrEV᝵{褍gve B]ﻪSɈJ#T3S)yH-= DD{T ԐJ遘u4d (ʸi:]ޔ!{GaRLՅ 3k=ڀU<Ӓ/,:hγ+9#jW,=?"HMTM3"GMlxrQDR0&0!t);7$1y&p[=/6G'۷`*Eٝe'=j⪪ RD`dܟ~"yRGˢX` Lb@ED[DMDM?cEs2]Ά?_^LLE=2 :h@pەr8- rVW.lR}WE3IJ YMDCVZ4le6 ]Fd+1&ɬ rFl Mg"4O-|n~Pƫ9?rA{fe!BO:IGKd],sc7A ;W`ȡUIB.Kq;\|იUmXI -H5`r 2 (f%@5h6nNV͢^o^z֝û=>}+&Mڱ*󺍁l7ݺǫ:z7L;LthLs].¸wȪaUKprp)#("_)jq2Mfqq΢f)߿u& :F޹]X9`1fĜU\ (zruwd07|mUI g3>tX9DwEiKDp #eF~]{z䷞XM\~Vw(\ٷG(yAt5Vkb6I=P1"Mf !i$W-A9e>lhA5-#Pi,627!:STv;\))Eb=RԼ:>%y+t2!h $4!Df7sղګ0a.x7_>}9nw7/w{^}qX?:<}盝?={ٛ۷>r{| Ű }U]/nmUcUUsSբy?&nYqʻY"0aVզcط1ڜMW.yL;gS6):缛RyB򋺩#;DJ>\g3ə=Bkf*j:<=dޥ)+S2UO株٘g VLEr2b^`fʜ/~?~pi Ӧ ^<MhSSֹHs<qaX w9ޯ|*C+"3Ds;J9Wv9GW~U=I3"w]""DC\GỌHQEBqDf衃Uɷ>2_=;/lt3.Eyy9~?X`l\2ru@<PpMd 83Dd7 q0k{%GGZp]׵oϯ779<'Td$0! $@̬y@&D&E&\Shc1 =m/ l:yEwOU䝺%,+n:^q'o~ѷ{o TMs޽W5cEUД%8TČ4TDAʙ+SF3B ЌxR"w0DǠ 3F"fDPĤYl7M `p6"lj Ε+,]$N":rG/sb Fe퐦]Aۭ䌳Q1o)fl,jyқ " HɌDw} 6d !{KL$!&-Mf 2~Q\kQf@ !cȄ*V3+FM;a_qh؀ɴ \%L2]wҮnc}<>>~t94 c[w \#J4tF󶨘?tMo|'>˦!aN1F$n*TvSTV{ٍs"~"gGdf!2 `%rzLW,LtSIAh)ͫDԌ" Fv4rnQw&B]L)Ϧc"B byj̊m6SN]|y1ؖOOneԫq8VS^ܞ"y5@ Ztޔ~\{DC);D"b4Ī䤒ZR0`2Lj- ! 9&xSj4k\]#J1@n :5+LC,i ,sd*J4TR,2&J%P4i6"'eԒ}V"F0tkG ί'÷`ыO^*v1.7CjޕBԧe/G@q G|wOy\wnLEsK #ҘrBpD{&jSvLM=3{ ,Jȭ6$ٞ撽cQӒLj2 RS=8:q$Y-8"CƑCD6AO%R{Xqܲ [W*˥>>^:kj5`0U\Qr"Lfb2\"NJ1 i/&#WtbvZF$BD;mIH= e)NX!bURz(*D&9I?4X2pUMl&2~ ǚسfDU@zPJv!/.ǗזgK;R\|=9Kq:~>y4P\psJlު~owOO__]:T AMM=cc.Dx73DaNYcs胪" M}֏*#3>X\XL(8",U켙CD>&D̔Tٹq.A fQ1\ĨAjQo?~[A}sܻu}|rcxߌOC R{]4>U(3ؐle*JЅ 2i}g *3AwyWH2A'`>O~??7[o?$Bթw(5ƨmp-@SP )Ю[׿S;xv>Eh"PLTre!gDL̲HMxYd3]*yfV8ETtX,Y!2#眊}⢨i)%wHƜg '6 .:Ɲ9*Sޅ/>|_[~ Ŝ<OyGWߺo}7߼i>]/n9 tʤ r6|ڍjrT  PS$@u#@k)b  A=dDT(;ALgӌ䢚 z ~)>/~p\H}{sXv<XG<|:ۗg|zjޤ7z}-gmWmO?=NGνqvf9bQRLH 1i"U\8r doVfĂ5f\#U @ DdF,`٣d4Ut!RڸگpRyw0lhXBJIA@E0&ECeb@~]6we}|Zy~9 c0\p'(%[S}l6 $51{X׾w .<4`QhIEQ$8IeRp9;DNyW >欋 6y5`$DKh@yfb W65ێi}7O~o,tmIMW]?۟ɋ=wyɝӨ?___$X\I;'8E;mժr e2Y64":she2IjD6ˆ#(hR.,dzMQ @*̮2]eDɃ3;<P]B=O;qu>T:r qUƋL%y;"Uz 3(,)hzR7p{ΡݜL/@P9>]J6 ƍ .m AMf9AuVw@`_A XEF"sZ jBQ'squ'Ͼs!ljt\!] \h:vԅPϳ!rD"8HaTcѾ$R9;fYd ,L%w)bjF䬯^\\aWڤlYg_Ô"9_ߜ_tW]-V/7/n c?^PnTaPh0NW{f8**g gHѐrK+#~Hj*Guj5O\m6#2MA@BMM2#p ! |CBcr7p_vEԃwq5P/GqR9ИcVŵ $GZ\\%Ǔ;Ն-o_؈|6K X@'boZ,.O>y.T9֍s N8O98Dt3'@sz@$"@L%-`]M9U&2 Ƣ f?vp|m6f3W_\_nuHvKl7<؍]*UEq7|fuѳA {RU91:GkO^RUr0iдvzu6R˛O5 'IWxQ&ID7+] n K䚽L2#zh!d.0N@nLɚTFxwXn,jE455Cʹ}obFyΫʫʫzww+@B=;4^\2H$WBU \ҵ(y<̕qt*SD*aQc h,Re!W ӂ쿲a>w &΁Zf$Ρsja}r ǧiJPzɮ_^]=\?pyO^s~y7\9![)>WV&ț|U8,8t (y@>{z.?A/hTf'}oϟ}'zV5uuysx 9KI|- vZusu]\)%HDIʱ77^mfz|p鋫EW7MsvG7ι$Ѭ6  5S$\#S{P"8較wVߺMEeb]2Oe]Zdtc2"*YR hg((hU*VcWu1kV@pܓ}T ƀѓ LՀօH2kղ+Zv7s?0TOGncqÏ^>bbyxqW:^˳?{OMOgן|l={}|8XDJ3AhGӢ%Rw{45UAi¢. abRT El#gSM]bλ?mۣE9EfX Ф;L"(cOT#>f,rL_惛v oeܥ Bќ ]-s""MTkՀȁi*.YG d}L4&jF`3SSU!B"U54NDаX3PĢyS5sueU!GS%Of @Edƭw7ez}9Mtt{}r~Ny_~K?_ndy:9֒S4\l><ً/|vy>`(0^D l'z3hc~5̛YwT;6<CEASw8*vJ*. Ud(xr8d$jr`~b7S-bEMwU yE52r0֌TR>g>̆/^K.aewQlֱ՝z}\+5R8t")#s5޳L&r[y \MJ3;0@P-f@~Ĉ VL3;0"g&X"*#d28$bGt S!GW/M ȁcIEEdTDpyr|0ޜ}L_~jMLE}}6^]\~^'"/^x6Wgm.͖e0,s.U499!:G.AIP %R$4о޵,7]AfDfs}%skbN(e%1C$o($gH;?䐶kDv@y>=78ʼ{s5U[u,Eڪ~[1Mm?ܼ}؋g ŔVZkl %e91ޟWW[w~d cnU AT2"#(@Ɓ*J ʉ DTA3)LD9iH4 G<&Mߟ> ޸ AA8dY@mU2jY!#d$2d=^@,Y-ٖ]UGf߱. AL7|E˂<#&&|P21-vaLq&J5hRWn:*ȑa䥤HTmǬDX|ʱ!2PF"`\OUE$ƔK%IGPaÒR NA|b&& djZr!$$dHBɂ",Z,{ qSykK8jI pw_Q?zyn[k7>-Ii3>!_6UU|rۇ+g-bc3sQsz=]*8A,KJf!f$brYH*g o=):N!^1bS媫i rS/w#_ysUski_OqRƚ꼫J Ex@]K)uc=E2 }[))IpE_ٷU ~᳸WIqJ,sժ(F(Y5jh{S~ic3K)gC&l vJJͭ 24L%42?X -\\6|~;ݯm/my#ڐ8Gaq*6 yѸ0!; ik)e!* :"FhHN$2~Ic*iN/@Ɲ9Ȫ*U&ͳI%h 9";@"dQ4+H@)%2K:%% #v hHBR\]f?oWo~s}{7O˒n~}{9_G??[dgE0YƔko1CyƘ Daʺ[Ɓ9 +o+cJɵs!ncٔdVΆǘW}sxwHCp٬`S.'saf?jm(`%՜Ⰴ1a5?p %b,uКcXϷӟ7_]"|t 0tlח29S7jLUJQb+921+9E {"h^@Kd,Sɩd7EvBHW ZTeV9OfHELZ"# )H3!Jg$*YdBR Q AAK0n`U7_|89=߼=aZu4_ލ7|ؘO<3pp?, tX"YÔb9%)J 2RV\6ިލ!T)R16"bRSnN͘'r7a,+c<x9Gb%ǐ?BLis2RQEbg(S-@EU!h[a1C=lQ,"T9vEt28X$V=YRѵsmi=h2]TŲ:qK^Ryvݛn˲IJrO? ,Ф=o74|ggWnæ/.67C>8=mwVجHN>a9T4c)`}_ XWM^Rk.ɮTIUPeAU0С4Չ뒦۴%5S8U[d'[BP)HJLPb$ KN8-6+F& % RW%[7FR4y&M{[Y~*wtչY/O.*Mۖ_v<۾x~n?0qӻ5@h Q-uLDƁa LJ"zeID! !P)ZD^B* 57fiH9릞r_*, B!ČƦ"aXDSbO;T;SJ.Ȇ15T7.(ThjUɧO ߾~Ǯ6 O1>=!]C.3Yw"6NwvV~~s7lYlKUEPQ$t'&R%d+"5i|4LLQ"($i  G @vzrN,HTj$ z⾢ l=6$@5eWѸCHQrRH}\ ֞*/O>Xgom >>__gh,%.mkZ[㜟bו%)Kox* ɂ1 ְ"hħ],rn5v! V KHY4g-E!X{W{'!(ZRLgQض7*I;z~fe3̑ >>q Į3 ;8 ggo_r^?~!%ovpVBlP}8ϟ/` ,e?~Wy_w׻g%3p}ܟ4D^rL%Ɠ@F@5t-eb( A 22Z@B ;-FL%9I9{Gl>ĵ-y^|J#*mlhYruSǟvSy8, ˫'Wq?Kn]U2}Z(*.q iگ.ms%3 M Z5"q"UMl8\r@A4qH}>c֒@B6FSQR懲,wW=ZO~ng2Ֆ&T曲gcL͹a~몫\λv<,H73?z~گܦC %悭{L 4&Dl@3hlC,xٰ?bICTc}݄ͫ)cMiͻݰ1_^~a7O)w?o6gطLJa:.iskA)Pى %cI`B&dTo X dU#Sطl2Π_*4A@@Pb.x_C:ٹj]ϾC6h,9&7 lL3f^xrf|{3UMtDe,EӬD?yۯ -2jo?&zIu};wW[cDtĜ*%URyʒC.b"q)k,K%eo(R2Zgvν= ݔ ABQb-svlji[٧}XWMJIgOΡHgx%{8IٶxwHCVC,sOònǟ>|<IWߏR1~|~~Y/cyW7Gqۖ"d9M5/7uvCޚSW7C4TΤrc*" Ą`SQ`է]ǜ3[c*jq2ٻ$)xKLc% !V4VCaQQBcZ]_-'nzWo&cg9F/ ump|BNىqѳeM-k0<咱f8o7tU77]?e8N71p}u}ՙ/akS9U*!"h))R6$i{E"B$D,y)qѲfU)0d49*")I8Em6k~ X4MCT${{\_DU prѼ0<- ǡq\HE(_>i䇟,Փ3r!¸ [ 2 í4w_nw%-!"A,ו?*gA팈"fV(*$clWgqbC," 5H( \gϊ7ǠDu1iB1Eؤ6ËMcT*U+yw_λM7oo%nwYenon&=e񓦲4egO7*˯V7TJ4wcYB|y?yWD#-D[C!.CBͺ7Z>|gͯ==7LLI:Ba߰k@2JI94fk֔]h%eM!ϻ%QI"0`P~EVR0L*AKR-2KiکŚQP! x81w_\n܍zX"$*,i0U:8]\m8L(X$AyGgϟnZVM(D>O-c2=#̒yف,"L %[<_$>ŵ$*UAjŦWk4VuUU!B ^ErJ:jNlW*.'갏͓jiWa5rQSVW 0VD@ȟ!,KRm]1*0)[R)TzCp̹"j9oUmn?-wCpB'Df?-yŠoSJ0 EEa=8CP(ykҘUnSDzҴ Gg_jPcwo~foww?]]xSڴEqUe@E㇗g4Kn?_M͇ C;$&@P4T~zY1밤ͪ9<MUy65ȎTl=[: ;тߋLbQꒄL ƕ/k (*9*9$m^=AbBeP&fw]XFx\kdPGQ(lj"zk6<|GXW/阇\vn܄7!ʜrQ5@m%RjˆQcd*'Z>̳5&f"۶ލӪk*|f}X"yb_9Sb55e{lչ:luF צ4/Rf`g%u*|yAVR,c\4"vfJ)JlbZHaʒjպښs$O?㗿ݛ"vۙnjlvPQ@R)Λv @!FAsۻ1漭s*1+ˆ3-eb vVRN1 ybUuEEP *!Ν_3T1$R09QEAJLxˌ&~bhH٢O5>yU'9!kWي܊'SK QADط@%@%S:BBHA5;d' Kɓ4!97ez Q̸>ެ!D"1M}ܞu\5, %*P\˂e9_[+eV4Q]L׻?ӕ;721y !@0ÜsY{hj*benu'?slW}*p=FYeSPڛڢ%u8kڠ"x?Dqɪ7!ƌ%kYm!4)n+ZeDŽk1W}v@ι8=ZZR^yS1>'jb-oZg1]eGԮvkDB66}s<䷯v_~JAnշF#HdEJD"%@N-ZBȶrl$"S0Z U%T d`cGHLƚR-Qq)3,cLq9R;k+߾?{~pI}wšƣe4@Yc`B")(Ptf(m:o\?Wkݽ} 9aǔsƆXK@s)33Rk_T0pŻՓY*[OWTyFc̆1f-붡.UTu?c,1 qpwE":/Re Jk,QC%.@R)`cr{C-b;h TTs!Pqh*D6H")uS"reWò /?j %e YPJPHcw*u,EOdWЄ(ErA4L-Ƶd@s`Z݉@\5n?};yHGkxܾw8ZgjO1U]m놭Ec I)d=AURI C !% ޼gK^~(H8tbӈ,)gQȪYJ)rR$kL]Y Zm8Fm~<#),Ql][an5lBW.xCe}crzW5uv%f])ҷݒwAsIyVu7/۶bbRʭ#(1vLEc)狾:[%.rLjUjU;!C ᔓ j*]3S̩`Ҝ2Uִ<$!eキ\~8WOWEޮ )KeD("k H+$ek"c P""h h&`APh "J씌bDK"$/~R)jh4Eɳ@!g43TO3Ulo~g4sEsXn6mc6_nQbDKLt"∘HD7MmQE1bz?5 @q Ḉݪfc3"(E͔˘$Y|7Pi8.yz8mͧg6/M#);3v+ÐUa9M*b%ǔcs(!qKRa\'eC2ȑE QFv:C2-e(:kR. D0w}=Oe5$)ii$R„2R Bd $ =Ӎsd, BZ["%Dd{"@x"gl,LZ&o.~gL:Sgc2x/92M'YDqְ [ۮRlALתL :1Gl\Um_k[vj)3# qE2LjؐJ,EdIwSM){C֚W7z8/0YCrOdPʖTs"U$n#nǢg;y\aj+GD\]ymY%me ڳl GP6o\DlJ)*9J8i0B径ֶ]N߼}4֊8[%eg536cǷ(1(bcSiM( ѓh2%7m*k8Ck0+"#KĪr0 U, 3+J!RkI(49)ʕIYrV⮱1 y1bJɉU*I)v]3j x|߽;޽=oxXC q3<|8> 1,Is$+D[w';Gr֓q J|2hB, KA77bIB̭>|FLq>y/>}V`>&xLd 1d:gZ(*A!Rld7n:뫶q { 9x8lzH"Θ9))1  'v$Q,IaCFƚy°DLE]bz|y4\) s(EW]퉨dkxc*0 ۮ!qMND۾3*;-d㜋B]U3$e_ǔ(2Eb.%-1ǔۦK)*`2rlC 9 37jv֘ ]oss-fa2qyawлx?s ]BefɠC'09% GMP"! exe4@#%ݛ?DdɪR\)Olp{ӝ5M)-:ԘL)85(ɴ$Dh#_2?S=qfpǐx hmhIuY5V@Nb)0/c5#jq(sX%?\ ƺa^Bd 0l*qW-vE(ŕp E " (#b2(;xx<1"I^nxNo-LsƑ@"[Jqj*E6NӘPT%2K)/! = 29Ubƶ]UtM)F@9=fTyV1l s ,A}HxawG d}YdZ$e$LH Lm#QS$εghZ)BB(*VE|K \gѱH7\QuvuQo̙Kڑ_[Հ5j.)۪)Sշ鿬. yyo}8#ۆ*Ê,s՞R*ApL2ZmWI֚9г!WQ} a-Ckouw4T3= HԐ󺮗y:Xb]UyÂ9,IqyU#E~9Mm9<77Z\@u,9e}89s:FD)c*a [[$dݏi8R|*B ,M[r*̐KQ1.1|^D ?_o6Y_NaԖ!U z(kL/s~hAy6Ej+S?_vK.Tͺ5u8;0ҩdLQT[J˦E*I)Z˕ݶYrNu0gUj2DYr1aI"RDJ5<2DM.wiڜR,1 !T:oժÒVHa(mۮM&FВg_XC3i?1g$٬ZoaۙyZ\{OE5$1HN}[luiiY~9Es66eYHӧiL2n9]oolERi..Z:ȯ;B= ־?'TsN)n}p_W5Ud|%  s,K@b i*aG\gv"!IYw_1:%oqwsG-o_ww:fv\ :)%`2v;oKGtQWL*&eI|LQ$%&S@r(㱬&Ġb1oL[Z[}8@%eBb=Yq(ƛrj٪ܼb>Ni7&i2cѾ"OcE$yZoXԥE_,lOcQajUeɆŠڶMK2da7H6+8͒*xY$)eoJ HԖy6a_ 8K49psTYh.nbL1|h]u.:EZ"jzA9Mڿ*wl~tgrȷ_ujWl\KAc Le WrkW_iY5{umsټxz=;g[b]5ݾLXG,~)qB$ 덱%@)0iz冸aׅoڵ8g~n(Zr㫛Wz?/Ӭ R(6-c,(#y)2*%"Oq:dǔ_BDRd :CD}ms{\B`UeApR)bBcucr:LQe",sl6<ʚ5"@1䪪[JLXٜN!QtMeYKIZa(UӔ !ĘMeS$D_WZ`0))dR6lSJ&CuW\T5-q7 H;8 @*PE =mz欯_~޳whkթdѴ5Dpx}|~Oxw3_n'ϑkBBR֐EBA쌢HFĬ׈.ߢJQK(l[)A}>($9|wӻW??||L^<ccD(m|miYS\sKsPR&f Z(9NaLF@C)( .֝H)%u!)KEES]ն5,9u%N1j[uUNlەi\n]WmqCJ%R qLZko9 `-ZgMQaP2I֘ mSWU&BW%"|mRԶ1bFQn$]2JRzs#CTs9\r1qeg\= ڊ] H{7d HHPooO~,s\ueP띖R7kr|0۶,_(DckЬ21a_靫h9|T$QG \d9}P~)6[P2o\?Alo?6_ RVRrtUkY@ժ50_ކ,KT5Θ MZD1!! ,8+K)B&!DB=NYӳl֭[U8T'cHV-{cc.!тHS'U}JiJ 1U3b-FJ Uk Up1گk䀹 1umMHp.*gX Stn7JRJk(U Rr]7b `Lc*1㘫-|3JO`rɨSH*pmy_ př,*hU,e\g;N=oD @$DT曷JɚƸa.\?=}DVI*_/~y!w7yU1YjC%˲$Gs_\ﮇYr&,:ۺJ%(bɐ @ELXk RHø"Ϟl^E(KÏx9f-" ppkXTbMʣ0'먭NTYv*oU9DrU[gޣRJw1Rpt h [ciZ<ͨrvnö][0msIJ2BcLU[kj*TUM\ 7UWgKLb]UW6rT<O(U@Uӝ\/Y ۟glAkz",)akq73d&cXJrDc/T|IxmnAKx8ćۯͯׯ?~E1Op7%d)h71" !%\[ť 1"HHd%boM BUô|V ͫi7vIe'wCq0)k/azyVjeT$th eADDr.!)y+j^waNx\rҾo @[ Iiw<k0xTrIxe*! $~;%O:Oͼ{0U |IokM(92 Xr*4rdRb]-*n}aˤy&2/_}{hHTWwoz\'/y ֘u))ɐEN^Ι%8{Ͷ"٧Ͻ TkgcIFĒ@TJR,`)ݴj;*eb|eiJYT,S[{밯qSm~jeIιRaLES^$P\J\xqTP_9qYOjeÇ},!r}W-S<"iVF?K*9qO$۫ 0Eqh,Uڮ۪d McɐT`c^mzgQ. qQBA( A%M*%U]UueTU,A\UH4اRqP2˔QŶ6ʮn\/zpγۻW};sӸT7MDl,n0Ҝ2Qi[ǨtPwdmAæb6DH'fY skl{XC{d~ͺ/V[_ezsH$﹮Q"?RuFoAoXEIdO˿nq@L̆(ĬnE`yHEٌ!\1Cd-Z"E#1+oq7ha,WӮIv-q6.eڠ!(*H&:tEHfcA \ht]UWyL}_aNkMg jB@Jm"qzrg| Ovi|/FA>~pZ R.JdmEDkrEn7år?@Z!ҰjI0Ř(f0C"۫cwM Z(r`ZVDj+MKU<gKTS(OO)k# B$B<Om|U[/ (TrbFdD7"ɵVi)Rklo_7@4-"yüL!.1֊W/?O>ï/_y϶Pk"n]f}iVkZY5%km4mQ'FsiT#O^OZY}ԈHwjӿxߓ6c޾H/O%w rΕ3}JRR4˶whR17W!C 05,(Xs94ukJ%X mAxy򇐘PŊRA1Űj]9< |Ef\؛qO~/+)/DLi6 ˱0ߟiq1)ǰd&_ X5Zk5O)b|RiRT` ޮSiA&,[֑ѨbD7f^ J#r]k9ƕUY#U${I1Rsi S %2<|>rKy LKB8͗u>Wǟ|:gկwRFÙG=֒ Vd`m9Ѵk)cR1LcVjQW>}XrR2TPx_M 3z}?wO.:;v>be ɇt1S6F)&XKbJ+SlG\%9u ڭKHKJg[b "_@(Z"ʈo{g^BbAVlҶUJ!6!WXᨕ2ƥT PixEVIb9gŴ YS.l/7ǜJH% 9UzWsVڅr1AJhWRIk䧶39HɑK*JT$*L(F#Hb U!LUXMܾxw?z]oVI3k&($o_FxoxO4?'ӔKȴlz 7_覗Zj jULuv0Vj|3M}wZd_?TpoC_{Q?[}7>GO ٗ*SKm 1 Z}.`R^^{7Fya(ESc!9އb\ֹd,9ZR[3ǔ*ԶPbdb>h4[(eɹ T!}c4j^I1mBׇfɯ˦o 32kmPy%chl P]kYmx9E, ȸ$D>"Npݝ^/gOw_|qO߿̔O_קwv{Ta H$( ɉ0pq^c4.ڭylk &&5%/nW/_ \AϿrǫ8/4ow?z[+n_WW7>q4%FELHK-1ApUXSw>ܥ$b}[mp9(sYUJxf R"SHqN9T|X'_IJ)*e\% 8koJHbθXANDZ[9ۺO?yֆ5NpE)mn}L& m/B)0Y|Irdt.LcHWs*hc Hev2F@\zi|ۛ>4PvRl^??÷Gpk/Άwnt;=|0)סrzҨ+ J)iqsm:[*HpkwŔӤnǟl;ҦfôH&syo_~qO_}"u1`LV$ZsI 6ZuFW~KcQk[}HJ))C1ׂU*2V; NյukJm=ΓS|wc9C<*Hcm.j8Es&$$Bq7 XGރZH5ʜNXcSK1Z !G6۵VLnZ15gcT\EXevhv랠XOeB4R,EiQhzXH.)iC*k} ޔjb͊uKQ}wV˸98X3<&}ng|xqw{&.2gv|O)[_ж-@jqZk]ם?FXZYFeI$D!w?znٗ7QL(k4V:ݏiQ?O_.\>S׬g}~󓟽<󫯞pр :R š_$UQG"bQQ~BcX*r"(=(}3Tkt}* +V|=3"X˾ "xl-~'kYԄRfQX,Y[ymkqkM-Ik{}X%5ZI)TeYn~Z|GB)kV|*"RN Q 3瘵nP1*.!VeWϿ%1)Ŷmkf%eiT~Rf{a>>,bH3Jaf\ V AJMR<+UJ@ zPGwWCHZiiOW1KR(F1b9爵l<]wu>O!'hXkVQN:k 'AW2"b Bڇupm[S0B)07OK͋qKm5|6-=D\|-)Ak4Ȅdy5!IeFuSm׍K ֹREr(en1dsf>XmXޞ|9 ūTnՄW%Z/z#R)\jEU3+XcBL̚+Es zXopKRBT8k8\yqt_}_={˟Go}Q:Mǫ[˃4VY9~~/Ube%ĊMkRv_NӏFl1NEbRj)IhJy5Zx_\>d^\J%ZFRW mvBTV čQ[kjt=Rs=Œ*98̕4! B-ǃۇzjWkR TQ!_:ŜZ-Ack)ZZiJU,"5r3zkR4K1J3Rp}t}ɗRw3Z*qʹTbB}Zf50CӴ%*q$Fm֪:4)[皾FR5E0窴e)]W._EӲnH 醦qtͦ^ݏ̓j>嗛~77,~; 3V()lZ,B:]/QǽL|ׯj,QP_Ο\?Mn^Z5HS%J͹\bCj/~y -R*KLo^ԗ#@h|sΊ)V\K.}qcbX fh1Qc~m)GׇZo@Xc)V["6kvZo>$J\jm "Xj}_^(Ui\g!|a1X mVmkqD%z8eZbߵLXk}xYuM-eu2QUjۗsήi΢HQA6id1ڦUde 69'N5y;͉֗>Gs6۵yAF) ):a$2jg8T*um?΅J)1?ϧ#|j~q^ƟzQ_!NZu9w=Zr,g~PIi6- X) T*)9%·Qt}#ƪ©ֹB|_ovə5VQK?ABRPJF $"mlsX|- CQia,+ Q!{got; F)7n-U1)ˮEH(nA @EJ)!V͙SR >wm4ZFQƔ[tԜ EZR Rs]BX5eB>Q('oJ^d}[0Y1ӴXƒaY\NAb:M˃]aTZ7JPQ Ym~a$LQ H1"+\sM1u}s ۷'7?z'_mm-a(P R6/63Pm`'Bbe*ViLk"L1YJ΀P, U'Q2hJsPRϡ22g_ǩkfpk.6͒Ʊai2 XTzgVV=TfY!9w! q)`kJZђR;P[M7fJj%K7#1.15fJWEP%P{F5vULJQJ-  2 MBc }()V !#Rc~ccYKz%X]:E3 \uZzhjc`p{ȥYq}kJK͈lP)V6Ntծ}/?{9}/nfc(fY¥ DV.W?ݒnݩTDPrD)ej`QK.)zQ1Rv1T%TSce6ڶNƲbp6tJٮcRR{K\E[c cVJA)%D!qYRL|XBuʅ|*VKe^uT&5'gy"Fz+Ӄ]zݨ/ZIY QUBR{g5>11&JY*)F*rmk VKE֡UZW{lRiN!JPEqV)D,k.O5譆Ef"RҶ-6V]O1)BU<Я~djAfRZZwGRggif)m֪ @ 5"$m|:Źce?٦!V6̘'RoƆ&CPq%*RjkѸtd5K͢9i5:WinhM3Bʊ[[-NC-Cﶃn.k@!Ms^c`ycV'JBVTC#~&2DTBĥԒrhHbLIzwi"}yΨ_&y<Psm~^֚F33+(ȩ7Zk} 91ZNߟ7F'kPYM!R!lU 9.Rx֖Rm31Z1Weцĺ&LHG<+Z3buM-e'@qٽu߿{uؿ:nN}_|TKP4xZ~ǫ}Owq+1R#+ED[KQ)UR*JA A[[bVs9s^$%*~I4YR|²>hm d<j\NK&msZ*0$1jj@QYr1J[ ) Y)K&֍b$)MjƜS9U.Z/hi1UGHZH:6V}v}j_ke9x9uO w\:墙J.PQh!6V\Vpl-U[= {Z|42Z3:Ն*k[ _^^n^~׿G?œwcd>ޭncTLoſ҂SgYsx`g6U9rPRğNs΀ )trեfB~Ytĵ6"*F`64lۡ7Ӓ:,].S!vl  J"1ZKɚIPI1o!fFA@)$꙲rr;-AAy#εDb( Q܎S}?XλI:5,!+XҒwwV=9CR,T}G,15PQԚ֝qs.p*OHK% Saͪ7qK{c;`fks.DN"$!րr,R\CS +%_UQ?~ه_ټOX?w>?xZ.~b9?z}pӅy?\Ɨ?"r}Lk6NgN14ݠ! ͛H8nRV)\r5Jsɡ,D @Pk0vFLރ@͉;kRSl-RUs*"EVjh},1K4FA|F\kkM۸TB/e%DDfp=y"g5F[ͦ1HYK+ZjQx7ΣRIJ1LHm̓MY2JDV(:!MS*@vF6}BU䌱Z}'5%h͍ֈa j4}q?͹ouQjI9*ŧ1>C{aU!V53k"V}tZ7Ѻ7bwww?O.~a?pG?{J\;Zu)ͮ7r1R5ul̬m13Bl8riͪg-R#PR6~Y8%VNk.jjH_Ʊ]m4SuUrRK0 Q0䜉bVG")şN3"k",UZ}0~1 n/~{_ƳO>vk6`!\X.Xk XQYM34ݶӃnU5"jͫRR2\r19Q ӜCbk JƔ "9H)ĐS >),ƀBY 3ݛ4&urM9|烷6C|a~WS("xw24uE\|LUKBqڮQ\RXR{|4 QR9v8Prg>d%هTwN>eV"+ 9ηs8f[ui Z%DSCH1BZBʬVQu*b椴ZﴢVZ2kR %嘤َџR.%Cݏ_k_JMGg/>_~cuu+߿z ݫ1i` DmCi7=`ybGvݐ)됳^nxC)tT(!0+?yVD@!bQLd +J*"Jm)zͨDBVڞ?>StR p_M͔[ ө/W!۶:itJ0x?X's.bZ4y_EZZyO쓏4{U뚕UVBDCLiXbcm. h ZK(U@V)5΋Q:WrJY"_ 5Oyxgx;Vh:E%;k@DMD;c6sjk5H1J.,f51s RRZ(ì)ŘS1Fkߜvi OHC9QZow^ȽV1ku4RJcL0ǐj1*y {/q |dba蝔@entJ[זRJrBZNzƁHX ̣vwmoN~1w_ܾ"9K~i_^\ݞ~g_mnZnO OJqKI)cY1" Zh()DiXcE)+Ps$EBFx\ @Y65~5k cau1̊r]Z- ?,o:F0X3K hq 4NəY]CZ+Iee e KA*B_B]wSq{WWKI`ƾuŞ.oTe bHi5Ϟ^6 Nc ~򓯩1h욦>9y׏zgiJ(mGX8"Hs㸔J5W4-qzg3j Rlטiqkc\6SZM,/)ĒTSKKZ }pf˟}?g_]߽~b+dDx_>}z> *%1)Ӻ0E&TgB4G@Qq6\l:gޭV,K+ځԚ%(sGkmɩJ !KqSDa93Ze z4zc5ܴ[-αT@.\b*w ,>=X={vvswnB\ޞoEB<8[]l'ɸtu*,ᓋº0CO^?y_bnOսUvz|1W95Р|㫗e:O9^>0~ރ;?.^\Z֙iz7[뵭)L׹UZSY*tclgtEq$D׷5Em]uCpZ򼟗/biХ(cm.5Z.M:-dWHL$hƂ@ތӑH1jH3Y_r"RJʈJ5Os%:MrJ.%c"SL 1K8̱mm') KFkM{k5m5t޺|{_~gXys{# * ?+lJJm2Mc#պT 5k#0xpMd5զs0_< bF!q2z\s8~gBE3E+"# bU321Sŗ|=.ERB%R A$Kbm b  W}2a 0g.8ur)<(Pے)W'_܇7W?xvr>zAvwxpm֪%1 ~NQKpjtc>4E6F}D>)UqQ~> [n1ê˸Ls[?ؘ!A[N>ԔՓY59 "1ɤ꡶kxNa~9ݍi67Wf4\NO/r~w_?ߜ0/ꧧ÷٩vR\ dmu)bVD),78z׷uDjYm&ڬ鸟s}Yﴤ6f6F : YR2ŗZ]7î$UXeNkM)7gnSK)B{Tkc`t^4L1V,ħo:K*p0y_ryx;ͩʹ1)*^1޼>zu7F_~hz8>7o=>\m<usNfƙ(_M%w1־5H|S}=ئnJ~2N_{(4- kG@ԝmї%<ڏ<3]9RIւm=.wMSH@䬍1Gb[1Z r:{?mO޹|I.F!VeHPMvMKӘe$CZ(ͪ] 4%?0O8np4_ BVNǻ_y|~"j~pcQF~If_do?z/j|ZMU0z|^9Z|h+5w9.4/O),b!43CP-!4Fgo]qp8-B@qzxY_ߎ?Fp<>k[BXϩϡ4 )}{s[RrMG"Ck|֩'gyԃmLIi3HFP(Mך@)iXrMSU Y34S3IKl#R*ksvݳ4uߟ$UX1Z+?I{o??=?ۼ.Qs( H5jlD)%GBBp sgg,:IaMYR$)Zo~X!eV@ Y D閐tMۯ^ZMMf)Ns{T~/K DV!0ZAaɷKJBHy|ʄAD]4q,ǻ iU}߱bYbPbέ{4vmУ*2/^ Dw04(֨ulWk?ͻǗ?GcOΆP.! 6njǘ۶U>di[PEq\sNsqOƹx@|wu5Y4j8JP1~H~M̊<#Bs~SS=K3&jӡq$^=wҜњ2[L )U[oݪ}#Y[dLnjK%kDcTi]JIRK )حj?^k]+#|1ïM5^[|k0H*Ey)mc>%cU4T )ČQFk B/?E >Emtcyh]IQaZHJ?)Z#eF@h (7}kک<ӒO"N3f1PkPsMX{Q^y&Z nF֦WH9J咳H1.pc*O1 VC΋TTW}<.7XNK@amBJk66?y{gTWmIu"XCу"O1!j)jĘŧ7L úNVkÍ-yޟ3 fnnOP]c%kX1\TN28-G m׼a[:!֪ݭIf5HevpWZ$6 ;Ѝ%feS(b]Sٿ:H~)o@""2nYR}!\BbɂAy"ŴJYU%Clv \5̆+QHenh}8twX\LcHm-LU U%cV9ݎoN-H^|v?$e܃&gMoq0ͥޏ>Ȭ>Ĺ%)&k";sاN[MOvO^&ucxGF ia;Nsڵi!-!ilj隦e4 `HH5UwSًTRf qZiRB!fd,iֶcmUsG%g C9+ ZLv Q$Et-n))/Wg;nȝA*jĜS>TuoN'eCl6ƹ)}9Rm )&vkNW8"={ts/w'v=/A0jBֳOHrF(hS@4XBx1DbT j)JR-62*DubBl}HIey Rj]J@1ݶ qaMHLVDe )C\R YѲ̱K%Z_6+L9U+h\u9-ƺ8u>5aڑRS dgUN)a2y\sbXB,hw=ynh֥-uwZB~@<ۮ֭:X %[XVz^kC9La ^Y=|uFLcHqzy{5N+8ddgN}X*3 w3Z@krJFVF)qZ"cnF(BPj֪5mIq9;APUuC%%d$X=tzwUg[uZvՁT$®my{G"$LFB\rfW)5 * JsUR"0jfKN`I(FJF"va }x~w}yi;LJ+&մlӽ]A.ao.*^\Om>?M* HRi#Sښp5JQ 4ְR*XjVj§WK!'Pv/xA__]!ɻ.oq>TzyWau8Nw7~/еVJ 9Ac_icȪJ䌹nBR8o//,jDKIo/E}oۖӵCJ6Z;mzK% 300s l:5IDAT֔14֭-!nZ稭bJ1bJJ $Kn B,RhlVv`ƓFϷjPsRM_kTaP2j~TY[ۺ%>I"bmH1 V;$\梔m;&Ӻպ#(H>_ۖUY)ӚR$Oǣ %&o\r*wWG WXA'@U|U=?X:fV)hv]j42bXc YVKJRRJ/)iV1 afqV*lsn^Z!Rꭑ"1x4*Vi<7]a>u-!e1ֱr;6nUj:K7'*A2Jo/0R|]kEmB(P|̊H*K9M ,˒bF#\0#䌈\rsO' Pmk)DR U'D(ĊL Ak#kADUj0n=J+WƠ?y"8fQuoլ4TIŜ"(åZkY[B"ݪUjُSmS XbHqk{y3细Xrf:O6z/n>j} +Vupk)4F/N!Z1>c:1ZQjeeaR!\;L)~\pÜ{h;JU !ʹ0:%9ʚVTVuyYR A %B9eQxn݃:AT!e)R+aH2826m] ":&vR @QT))p k %&H !/ OZRIsdȄJΊx̱B+!!#U2IeR*>ϩLSqȘR9F̥.sc))"OB4&Zjt3p3%8lz)^Պ8gRtvք9~Ne9WC]/^[A2Ԣ5beR[P)fRFøQKN @J|8\Mc4VϿ_KS,>:c_v4tzzA)Och)vBz¼(0NCk&?g#k "~<_lu5 ]3Vi*D$)Pp YvYƪaňx}ߴkRf:-oR1mS3\D +F\cMC@DVkΤin+ĆHd)l XkմD %IJ"U;CRP; RQ%p*prxܺ~bDLqTFhft6@EdujzJm`@eXko7aFSdҚ#]5ocM7THj a˟24lWڹ1EB5*KIKR*Υ74~CN5էkޚ!4JFmH6n f\|˫}J-"Y!"HI~W틁6,1CߡDgPcٖ+kKiCjE8.T 9eYOGda@ޠ\oss۶q%Rjr\mcI4|/3'PC aZm\ĢQNiI$ n4hRq6-)OS$bD8K B= [At$6 [+i1MV- 5.lۆ#ڋ22#`l`iR!M<0jmÑ\rN:ZwF 5ڙ8-۸v%1G01/^OKb~׀wF$)9,91TPKU6FwƦa$& 9RQ1Z+Jhi`qE~'M68Lc)69߭kw {޵(u?*ivΞv[M_C1Ϟ+H.%Ke&5Ҵn]}~uJH|;.W|j|HxZ R&1BFu%m_ܔ탷qڬz$O/_EYU{ry4dzca^RȱHCN#iy<\_C%ϯx}rtI0)31֭q:k))5"rdeJ.}QklZ@^p}tWۆXڡ:5Ε9L)=xt)5\WΑP(7;c&jν1 swF5OqQV3\$BD SKs.!,E2`,@uibLSHXZ9U]J{H7"9 v};8[ !M<ǒEZ_ e(]H;.R$A.)1S#RrE!VZ7N9*HժFj(d%2PYJ9$V T{)ٳ!3I,B)muI9AR9y s;ԔJ,ܭzjV F/?r46,]kZU8ոϬeeyyZdSK),"V)V\@3QJjR})KsTjCSn;]*Rc)K,]+zn[t1txLSoO\8i|\X^&_ Zs.ɣiiSHӎhA)9>|1L|*B)]/~iXPr5=ؿڜuOY{pOZ+&2y@ )ıDV %MNVLFغQK8VStkIi6EgdfUkNi*XsQED,B$!%@8dqiVЭ5V̚ kB~ҍaET3ֺ 1?|SZ3km۱HJa)|ܛLşJ/(bP (-hdB*b.P+Rjz%43Yt u7X|O/ze]L~?ew+_{?/Om t{~nnI1c9n7y,owug_n-WwԂ`4hsfM+>o?+mOw'=˳8g4%L s=ˋiivkvFQ!sj2Ԉ!U¤ ]VrݰBV%H)69I @)n.X Nk)ƅT+f+RqJ05@d\Z!f,K m pZ-+""5HUNY[q[}Ot5P"f8J!E+ "ru7[J.u9RCI1 %0-lneREva=P@,6CǸQtѵiT@YYeŭ!(ޏSB|+EXR 0Ƽ;-xǨ5;k0~ʸL/kOWncNu5{77YʹaJ!΋SZ]o+]javU>{zu8.E }p$IO\X1sY2ضI,'&KZ#欜#@j3) Pb5ݍ~&Qŗ7Q8{USS.S6:Rݍ0>?R(y8TXzANj~ꠘQCoΧI+Ptic0g16{ni#nږqi~oiZ`Py.5yqa?nS)eVku+BeeĊs9EfvZJt]jb^S#+6x-KK(Jr ZӣelAKN5 ֤i}1Rv-꥖EFf}1J Pu),IFݔJ-37 QyHfBtiYgºûW<=7oïνͯILje}OǸ\nnΩnХd͝ۯ6{M Z?wq9|ݍF RJKs/:ox~e^ Ӳ~?(Z[RJZJ-axAF J bKSKZ2Ĝ}KkɅiM*T" RL%%`6Bpz<vfz9 "-ӗ疕z9ngbRBھKMO50|Z#œJ )p!EY/%W8L(E}$iOE֜לI1"8D\ڨˈ 4XbSﶝV9c_ZeZޖRs9J fTOO%}jOHr>`2nw<*Xftozc4fv)n;~ ,k67otX'E\js9f hlŲ&DB =MJ-\'lAPRk VK %7QWwϟ/71߄s %B&!FM jz/~R%H#uh~|&@,*yژ&RS`/ zZsͷ8En!?}oM2jarK!.>IqIIqۍN-v?iպ1?]߾%N#aAAM0vBɕ3"-(Xc)97%X1æeS\N[?/ v]QL>P캮s݇15W7 늄[h95 ɗ7_w_'Ye,ݧ><ק',8|qܺިΌ0oo\&b6"Fv6n71J+ew(bn2mn{ ;W[g{-}C*mƛ22OV5FBqnNMz y9=Ư6Ct)綘۾j۽Q.q@$^kCfׯJjvDmn_7 *@L wIee߼=lvp&K?_OS\Rf$h Z*Ӥ) j~PHkR uw|ĜB̨uOV hW;GRRm1*B/Ň7ZeItMV9!M]sN:(i77t}Za)<?~v`»_tC\UCϙuO痏')O_Jy]ad&}Ptɡ(ngٸ<\O=v{r 3bnFlJ7[!=/[)t$R^{\??M~NS^B5#ÛW5nsۡkhDz 3[F&=8tVȵHM?}|wԛ"RcdtFQ9x?ܸ/a[;?/f]GOߒIw;-Uw߼V%_ua܍LJru]}3v^V+ëbvJ\Zc-Hap`Ĕ֘ewv6BVs.bN+% v0Xm?Rگ^kww׿{7(w?iۻXdغW !"$Ŭ+1` %gjMJ2aⳳR$( A)eSiY[mx={GJlo,#O"tvqUOKQZ6Ĉluz?njbIUDz0rvQNED+JA&`f HȽn?o^"׿~ΧOzc%N}$Io~h_lyQ>|{1ZjmĩeYE̶77ۚs U6]iKm8BdBe:geD}u}g,af׻ͦcy\s521Rb07j/)\r|>>>SI_y^OQoov?>>Jm\Kb|]Ppͦ/4eVr-Y6e#Se~>Nmwx}`=ԮXc2 q9qSCʊrI*/d)\x]k5&R\?>5*DMV% +Z|1k!OKZr sR=#(Ij&@DtZAMU@QKTVGt0lǻzMMNs^cq>*-L*_^y|x7㫷:ZMwo_3JU+AKltmSAXF%Ue- +VTSk!u$5K7}uk4/ua"Ӷӡ2alJ~}_7~zps7~z~YE9/kztv]ZӀj佴je"upz0*ILǶsntuZZ+a|sk%UJ5˧y?^Gn,3 1]OBDb@pj^~$E6b֦k9͆* $(-DVd*ezmTtvPl@X!u /eM0^"XT%zۍTAE-Wraejϧy՛ojZj?1-~^i6/ǥ )fӇ}V4=vhtH+ mt 3ί +X| xc IA)Zi1Z܊ҜjRV!Io=^:(Y*w]ߍZPn0Lt|~7c78s-v7\ArէsNU|?tiФfyzzZS.>mu-!F3M1ep 9Xbf|նc$t&B̹{w/3 OAqñ3)"ږTJ(PSZ#ۿn$?|j%є5wk]KYyrjsIڼ+Қ9))s?:}̮q. O nkڨnaR&6Jp\%`2IuJו䥒ӗE ,SAj5ۯ­Cz:_W7.) F]{~us׽} m"(%5$b26V*<tvkL* q۠nk)KV`5r겦5eS̨\LMZJ2]uaRۡw2Kט^B\|>.VZI`P䏟ֹͦ#vm(XEJ֠,0QA!/p9]jnjBMm8Gm;ۙ/oov7=ޚNik kF%4VG2毁W1i?X\[S8qSl U3& tJfklQ2xNO~t,S#Ф<Hrv+YҔqfהضt xNlݾ{uwaJiIӪLL )7wܟf dM5ށnzsPVDf:ӛt KrVJb3ݝrlwMDX'?24TlLEQ9ľsFs}s kZ"c\Mկnw"_.N(94E֦Ւr[RFΙj,k)ǔZ8DY"!#Ymy kUK`Zk( ( öMmU]Cjk*"( *Z;gc\I ~,9,t[UӚ.j*ݧ_,yLt ϫ|>ϗ 0ٗZbL4N)iqn3ZMSnwchrTsʻ6iU@33jۙZ޼Uv2%gXuY6}ݷv{x<' 4G6VԘjTazSKR9*Z)\rYTgSp][uN +eR9"%v:LD x1D3AΌ5**cP@3nBc\=b:|{˺ڽy7on0^9cFFkTvZV_mXۺ; ZyU)%Wjom yz*?}sP֢!4,52JSikY>鹈<yiS.X|[Nz\ݎP}yD޾{7€K+%РOOvh owD(5CiMTUD}r?XRje1Wݻ׷5hf1+ XgrV+r}1تMoAx8ӂ%:|a#HU%5ZRȚaݍc[t27|$5ŘjSt "{kKpPHٞ7,"AI4az)dsYj][ jF'גk0~k!٘rLDSVauz՝έ|8ƫZ7Yͨ/!|ر˿|_ g͚iY}u)R*1X29̱Xkd bQPh 8SY!95X%у! ?:{}>J)T9T@fk !IW;5%1x0RqFl!5!Zn1砭(kZR !s$@n>еK>ͩB̀S2D$7$K 44 R[\!t) ))钖 ֦넆PS-A1ۡz4BRÊ49Pk.>IIJx^eB3rn붚8'k іRxI3 Xr5aEҴϗxi}|9sL|VD 6[*6uc_t?~uk1֎ ZsN畿Rۮzr%ĔcSJ 0NiB, #V,PS B*s1  0FRZj9F6x٬U{YKH i5:=XaIaF`H`i}9.uz]kÚb* tUzYsb|,1R5^*6hs"[V@۞24>[ `WeZ @Q9:RkftRU,)]V5<˹LÈug)z;h6C!*@EHY<l*2@kQZoV[#bY_/z6VAc=׿U{sCPlgЁut)OO?l!\ "*OQ㉿I#ҩT)&L "RLŽ1Ed" @kF1k}km-u.% 45"O1*ؤ|^qD sΝb&X-Z~sK!(u5T!V;c6wȌcMZ,s*n(ϭ*g0k6>L>YR؊B$ڤD=pW/ZnYw9WR,JbMkL8}>_x紼%z LqHi-4*-@*ItoԀZ+V [LP O/3l ++C\Ns榍L|uR)7Nvڍ[TRM)K!*iөb[9,1r=]/^/~ww0Y#2̋O_C&c5cÇ'~%Wؚ"R y kjH@ HpBjSi=ZÈA+dkV)ȹXy ).&}mEkzs_&s* ԡs#C˹4g[{Fq~BM3vUm5 t]2/XQ+9gIe7q>Ȭ)vvZ5ѣV6YfSQ8hj>a BMoYu4/iNH@̮ߐ0TIWmmq^Z".k3PCKK*!aki5b%-4NǢj`>P9IC@=ƥ9\i\ H琖2_Vm8TR/aV?7wVe Jm:G˗<,r߾{Gk}ozI@`T|L]K! 4)X`zV_3X ҪKnZ+H1N3*VgL*&5WZKkKȥsN3h4#40}o]ߏ3ޗTvA64Ԧm\,(2L%'e6r*[ks`-۱Z)m'r߼{her%K'3 4Hkh*4=OnW[P ndGf;g (C7v>.PkSiUa//` K2'd; 1ח|p=J\I)^.5UbĬ#ZeY<_-+4Ig~~YΪJfK%l_oK(f'_˲hs._8XX>^qq@ʧk+R)7F5P[96)[%E! H"HhB\b s٘Sn K)"8E^9 5sJ:_9ӒracYj4=RE62-~MĤ4uc/E* LZV`3ZQn&P3HRX|c ͺ>*Kӿ QRUU--.kKA/*׊BV?=/9.kŘk\ JN~C СR" [)HJYZpTMk@N+rj9Vb EXjEc[yPQ̰]Co u7a3Z| %J#/ϗc(a|t$Ⱦ5К\>]|o]jJEM`͗ tZ/Ye*jƒkZ|m>ɭr5 N>|Df0k97Z~W(צ) RҀ` r :'5cu )K;<-֊"W!9 ZumX cH.A|]shZk2Q:GL%F$[iv3.s:}>km[mTc#R αjN]cRSɎk uHA\OSI ȨiMِ16Zkl`%4UmC"T58ϊT6?%"@گb\ZO4mUVfOFP0~uwow;i ]A[?:RUjCJ_r_PAy~8 mrwws*bFiRE ԪblBɱP[&LM kHdCdbRJG[lsFf5[d"hXu#D)RxH[#li@7QDЇ\A΅RNqNbL78:,%%VZs5E9&Ztn˒%Պ ( ҴK)j?y4ki|w Q81.a:qJaEX"ǹ<JׅwojВ5/^k͒f{%R͸k4Bcx܏JsI9,x^j&Fïk*TEq\FVvnΝ?bͻw71,yur\bDr3(dϏg@q??p;BCǗWA\|-+DMJ!*NV@n "( j+5 9KX!@D8̊jkJŝ&gHm 2b֐RmD(MZYrP3J4QZ\VDk}g"Bab*D9f\co+ SuBȔK,MZC&Zj%v7j#v0ݰaZs*`b;fKqFi OƊ4K矮9.1d Zsj)&:y!Қaq-:&T)u$΅zm (& v9N?##oP %Z뗳F0N?ӿ|e`ӗCMw :guilabel:`Download Zip` .. figure:: git_download.png :alt: Downloading a 'zip' file of the source code. Downloading a 'zip' file of the source code Building from source ----------------------- The recommended way to build ``whey`` is to use `tox `_: .. prompt:: bash tox -e build The source and wheel distributions will be in the directory ``dist``. If you wish, you may also use `pep517.build `_ or another :pep:`517`-compatible build tool. whey-0.0.24/doc-source/_static/000077500000000000000000000000001442026364700162525ustar00rootroot00000000000000whey-0.0.24/doc-source/_static/style.css000066400000000000000000000004601442026364700201240ustar00rootroot00000000000000/* This file is managed by 'repo_helper'. Don't edit it directly. */ div.highlight { -moz-tab-size: 4; tab-size: 4; } .field-list dt, dl.simple dt { margin-top: 0.5rem; } div.versionchanged ul, div.versionremoved ul { margin-left: 20px; margin-top: 0; } .longtable.autosummary { width: 100%; } whey-0.0.24/doc-source/_templates/000077500000000000000000000000001442026364700167615ustar00rootroot00000000000000whey-0.0.24/doc-source/_templates/base.html000066400000000000000000000003421442026364700205600ustar00rootroot00000000000000 {% extends "!base.html" %} {% block extrahead %} {% endblock %} whey-0.0.24/doc-source/api/000077500000000000000000000000001442026364700153755ustar00rootroot00000000000000whey-0.0.24/doc-source/api/builder.rst000066400000000000000000000005131442026364700175540ustar00rootroot00000000000000====================== :mod:`whey.builder` ====================== .. autosummary-widths:: 1/2 .. automodule:: whey.builder :no-members: :autosummary-members: .. autoclass:: whey.builder.AbstractBuilder .. latex:clearpage:: .. autoclass:: whey.builder.SDistBuilder .. latex:clearpage:: .. autoclass:: whey.builder.WheelBuilder whey-0.0.24/doc-source/api/config.rst000066400000000000000000000010311442026364700173670ustar00rootroot00000000000000====================== :mod:`whey.config` ====================== .. autosummary-widths:: 6/16 .. automodule:: whey.config :members: load_toml :mod:`whey.config.pep621` ========================== .. automodule:: whey.config.pep621 :mod:`whey.config.whey` ========================== .. automodule:: whey.config.whey :no-members: :autosummary-members: :noindex: .. automodule:: whey.config.whey :no-autosummary: :no-docstring: :exclude-members: license_lookup .. autovariable:: whey.config.whey.license_lookup :no-value: whey-0.0.24/doc-source/api/foreman.rst000066400000000000000000000001741442026364700175600ustar00rootroot00000000000000====================== :mod:`whey.foreman` ====================== .. autosummary-widths:: 1/2 .. automodule:: whey.foreman whey-0.0.24/doc-source/cli.rst000066400000000000000000000017071442026364700161320ustar00rootroot00000000000000===================== Command Line Usage ===================== whey -------------------- .. click:: whey.__main__:main :prog: whey :nested: none Editable installs ------------------ Whey also supports :pep:`660` editable installs via :github:repo:`pip `. Editable installs allow changes to the project's source code (but not its entry points and other metadata) to be automatically reflected when the module is next imported. To install the project in the current directory in editable mode, run the following command: .. prompt:: bash python3 -m pip install --editable . See the pip documentation_ for more details. If using pip's ``--no-build-isolation`` flag [1]_, whey must be installed with the ``editable`` extra, as additional requirements are required for editable installs. .. _documentation: https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-e .. [1] https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-no-build-isolation whey-0.0.24/doc-source/cli_extension.py000066400000000000000000000121051442026364700200400ustar00rootroot00000000000000# # Copyright © 2020-2021 Dominic Davis-Foster # Based on https://github.com/click-contrib/sphinx-click # Copyright (c) 2017 Stephen Finucane http://that.guru/ # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib from typing import Optional # 3rd party import click import sphinx_click from docutils import nodes from docutils.parsers.rst import directives from docutils.statemachine import ViewList from sphinx.application import Sphinx from sphinx.writers.latex import LaTeXTranslator _columnbreak = [ '', ".. raw:: latex", '', r" \columnbreak", '', ] def _format_command(ctx: click.Context, nested: sphinx_click.NestedOption, commands=None): """ Format the output of :class:`click.Command`. """ if ctx.command.hidden: return # description yield from sphinx_click._format_description(ctx) yield f".. program:: {ctx.command_path}" # usage yield from sphinx_click._format_usage(ctx) yield '' yield ".. raw:: latex" yield '' yield r" \begin{multicols}{2}" yield '' # options lines = list(sphinx_click._format_options(ctx)) if lines: # we use rubric to provide some separation without exploding the table of contents yield ".. rubric:: Options" yield '' yield from lines # arguments lines = list(sphinx_click._format_arguments(ctx)) if lines: yield from _columnbreak yield ".. rubric:: Arguments" yield '' yield from lines # environment variables lines = list(sphinx_click._format_envvars(ctx)) if lines: yield from _columnbreak yield ".. rubric:: Environment variables" yield '' yield from lines yield '' yield ".. raw:: latex" yield '' yield r" \end{multicols}" yield '' # description yield from sphinx_click._format_epilog(ctx) # if we're nesting commands, we need to do this slightly differently if nested in (sphinx_click.NestedOption.NESTED_FULL, sphinx_click.NestedOption.NESTED_NONE): return commands = sphinx_click._filter_commands(ctx, commands) if commands: yield ".. rubric:: Commands" yield '' for command in commands: # Don't show hidden subcommands if not command.hidden: yield from sphinx_click._format_subcommand(command) yield '' class ClickDirective(sphinx_click.ClickDirective): """ Sphinx directive for documenting Click commands. """ has_content = False required_arguments = 1 option_spec = { "prog": directives.unchanged_required, "nested": sphinx_click.nested_option, "commands": directives.unchanged, "show-nested": directives.flag, } def _generate_nodes( self, name: str, command: click.Command, parent: Optional[click.Context], nested: sphinx_click.NestedOption, commands=None, ): """ Generate the relevant Sphinx nodes. Format a :class:`click.Group` or :class:`click.Command`. :param name: Name of command, as used on the command line :param command: Instance of `click.Group` or `click.Command` :param parent: Instance of `click.Context`, or None :param nested: The granularity of subcommand details. :param commands: Display only listed commands or skip the section if empty :returns: A list of nested docutils nodes """ if command.hidden: return [] targetid = f"click-{self.env.new_serialno('click'):d}" targetnode = nodes.target('', '', ids=[targetid]) # Summary ctx = click.Context(command, info_name=name, parent=parent) content = list(_format_command(ctx, nested, commands)) view = ViewList(content) click_node = nodes.paragraph(rawsource='\n'.join(content)) self.state.nested_parse(view, self.content_offset, click_node) sphinx_click.click_purger.add_node(self.env, click_node, targetnode, self.lineno) return [targetnode, click_node] def setup(app: Sphinx) -> None: """ Setup Sphinx extension. """ app.add_directive("click", ClickDirective) app.connect("env-purge-doc", sphinx_click.click_purger.purge_nodes) app.connect("env-get-outdated", sphinx_click.env_get_outdated) app.add_directive("cli-option", sphinx_click.Cmdoption) app.add_node( sphinx_click.OptionDesc, latex=(LaTeXTranslator.visit_desc, LaTeXTranslator.depart_desc), override=True ) whey-0.0.24/doc-source/conf.py000066400000000000000000000045241442026364700161300ustar00rootroot00000000000000#!/usr/bin/env python3 # This file is managed by 'repo_helper'. Don't edit it directly. # stdlib import os import re import sys # 3rd party from sphinx_pyproject import SphinxConfig sys.path.append('.') config = SphinxConfig(globalns=globals()) project = config["project"] author = config["author"] documentation_summary = config.description github_url = "https://github.com/{github_username}/{github_repository}".format_map(config) rst_prolog = f""".. |pkgname| replace:: whey .. |pkgname2| replace:: ``whey`` .. |browse_github| replace:: `Browse the GitHub Repository <{github_url}>`__ """ slug = re.sub(r'\W+', '-', project.lower()) release = version = config.version sphinx_builder = os.environ.get("SPHINX_BUILDER", "html").lower() todo_include_todos = int(os.environ.get("SHOW_TODOS", 0)) and sphinx_builder != "latex" intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), "sphinx": ("https://www.sphinx-doc.org/en/stable/", None), } html_theme_options = { "light_css_variables": { "toc-title-font-size": "12pt", "toc-font-size": "12pt", "admonition-font-size": "12pt", }, "dark_css_variables": { "toc-title-font-size": "12pt", "toc-font-size": "12pt", "admonition-font-size": "12pt", }, } html_context = {} htmlhelp_basename = slug latex_documents = [("index", f'{slug}.tex', project, author, "manual")] man_pages = [("index", slug, project, [author], 1)] texinfo_documents = [("index", slug, project, author, slug, project, "Miscellaneous")] toctree_plus_types = set(config["toctree_plus_types"]) autodoc_default_options = { "members": None, # Include all members (methods). "special-members": None, "autosummary": None, "show-inheritance": None, "exclude-members": ','.join(config["autodoc_exclude_members"]), } latex_elements = { "printindex": "\\begin{flushleft}\n\\printindex\n\\end{flushleft}", "tableofcontents": "\\pdfbookmark[0]{\\contentsname}{toc}\\sphinxtableofcontents", } def setup(app): # 3rd party from sphinx_toolbox.latex import better_header_layout app.connect("config-inited", lambda app, config: better_header_layout(config)) nitpicky = True toml_spec_version = "0.5.0" toctree_plus_types.add("tconf") toctree_plus_types.add("envvar") needspace_amount = "4\\baselineskip" latex_elements["preamble"] = "\\usepackage{multicol}" tconf_show_full_name = False whey-0.0.24/doc-source/configuration.rst000066400000000000000000000423061442026364700202320ustar00rootroot00000000000000.. _configuration: ===================== Configuration ===================== ``whey`` is configured in the ``pyproject.toml`` file defined in :pep:`517` and :pep:`518`. .. note:: ``whey`` only supports `TOML v0.5.0 `_. ``pyproject.toml`` files using features of newer TOML versions may not parse correctly. ``[build-system]`` ------------------- ``whey`` must be set as the ``build-backend`` in the ``[build-system]`` table. :bold-title:`Example`: .. code-block:: TOML [build-system] requires = [ "whey",] build-backend = "whey" ``[project]`` ------------------- The metadata used by ``whey`` is defined in the ``[project]`` table, per :pep:`621`. As a minimum, the table MUST contain the keys :tconf:`~project.name` and :tconf:`~project.version` [1]_. .. [1] Other tools, such as flit_ and trampolim_, may support determining :tconf:`project.version` dynamically without specifying a value in ``pyproject.toml``. .. _flit: https://flit.readthedocs.io/en/latest/ .. _trampolim: https://github.com/FFY00/trampolim .. tconf:: project.name :type: :toml:`String` :required: True The name of the project. Ideally, the name should be normalised to lowercase, with underscores replaced by hyphens. The name may only contain ASCII letters, numbers, and the following symbols: ``._-`` . It must start and end with a letter or number. This key is required, and MUST be defined statically. :bold-title:`Example:` .. code-block:: TOML [project] name = "spam" .. latex:clearpage:: .. tconf:: project.version :type: :toml:`String` The version of the project as supported by :pep:`440`. With ``whey`` this key is required, and must be defined statically. Other backends may support determining this value automatically if it is listed in :tconf:`project.dynamic`. :bold-title:`Example:` .. code-block:: TOML [project] version = "2020.0.0" .. tconf:: project.description :type: :toml:`String` A short summary description of the project. PyPI will display this towards the top of the `project page`_. A longer description can be provided as :tconf:`~project.readme`. :bold-title:`Example:` .. code-block:: TOML [project] description = "Lovely Spam! Wonderful Spam!" .. tconf:: project.readme :type: :toml:`String` or :toml:`table ` The full description of the project (i.e. the README). The field accepts either a string or a table. If it is a string then it is the relative path to a text file containing the full description. The file's encoding MUST be UTF-8, and have one of the following content types: * ``text/markdown``, with a a case-insensitive ``.md`` suffix. * ``text/x-rst``, with a a case-insensitive ``.rst`` suffix. * ``text/plain``, with a a case-insensitive ``.txt`` suffix. The readme field may instead be a table with the following keys: * ``file`` -- a string value representing a relative path to a file containing the full description. * ``text`` -- a string value which is the full description. * ``content-type`` -- (required) a string specifying the content-type of the full description. * ``charset`` -- (optional, default UTF-8) the encoding of the ``file``. The ``file`` and ``text`` keys are mutually exclusive, but one must be provided in the table. PyPI will display this on the `project page`_ :bold-title:`Examples:` .. code-block:: TOML [project] readme = "README.rst" .. code-block:: toml [project] readme = {file = "README.md", content-type = "text/markdown", encoding = "UTF-8"} .. code-block:: TOML [project.readme] text = "Spam is a brand of canned cooked pork made by Hormel Foods Corporation." content-type = "text/x-rst" .. tconf:: project.requires-python :type: :toml:`String` The Python version requirements of the project, as a :pep:`508` specifier. .. latex:vspace:: -5px :bold-title:`Example:` .. code-block:: TOML [project] requires-python = ">=3.6" .. tconf:: project.license :type: :toml:`Table` The table may have one of two keys: * ``file`` -- a string value that is a relative file path to the file which contains the license for the project. The file's encoding MUST be UTF-8. * ``text`` -- string value which is the license of the project. These keys are mutually exclusive. .. latex:vspace:: -5px :bold-title:`Examples:` .. code-block:: toml [project] license = {file = "LICENSE.rst"} .. code-block:: TOML [project.license] file = "COPYING" .. code-block:: toml [project.license] text = """ This software may only be obtained by sending the author a postcard, and then the user promises not to redistribute it. """ .. tconf:: project.authors :type: :toml:`Array` of :toml:`tables
` with string keys and values The tables list the people or organizations considered to be the "authors" of the project. Each table has 2 keys: ``name`` and ``email``. Both keys are optional, and both values must be strings. * The ``name`` value MUST be a valid email name (i.e. whatever can be put as a name, before an email, in :rfc:`822`) and not contain commas. * The ``email`` value MUST be a valid email address. .. latex:clearpage:: :bold-title:`Examples:` .. code-block:: toml [project] authors = [ {name = "Dominic Davis-Foster", email = "dominic@davis-foster.co.uk"}, {name = "The pip developers", email = "distutils-sig@python.org"} ] .. code-block:: toml [[project.authors]] name = "Tzu-ping Chung" [[project.authors]] email = "hi@pradyunsg.me" .. tconf:: project.maintainers :type: :toml:`Array` of :toml:`tables
` with string keys and values The tables list the people or organizations considered to be the "maintainers" of the project. This field otherwise functions the same as :tconf:`~project.authors`. :bold-title:`Example:` .. code-block:: toml [project] authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-ping Chung"} ] maintainers = [ {name = "Brett Cannon", email = "brett@python.org"} ] .. tconf:: project.keywords :type: :toml:`Array` of :toml:`strings ` The keywords for the project. These can be used by community members to find projects based on their desired criteria. :bold-title:`Example:` .. code-block:: TOML [project] keywords = [ "egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor",] .. tconf:: project.classifiers :type: :toml:`Array` of :toml:`strings ` The `trove classifiers`_ which apply to the project. Classifiers describe who the project is for, what systems it can run on, and how mature it is. These can then be used by community members to find projects based on their desired criteria. .. latex:clearpage:: :bold-title:`Example:` .. code-block:: toml [project] classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python" ] .. tconf:: project.urls :type: :toml:`Table`, with keys and values of :toml:`strings ` A table of URLs where the key is the URL label and the value is the URL itself. The URL labels are free text, but may not exceed 32 characters. :bold-title:`Example:` .. code-block:: TOML [project.urls] homepage = "https://example.com" documentation = "https://readthedocs.org" repository = "https://github.com" changelog = "https://github.com/me/spam/blob/master/CHANGELOG.md" .. tconf:: project.scripts :type: :toml:`Table`, with keys and values of :toml:`strings ` The console scripts provided by the project. The keys are the names of the scripts and the values are the object references in the form ``module.submodule:object``. See the `entry point specification`_ for more details. :bold-title:`Example:` .. code-block:: toml [project.scripts] spam-cli = "spam:main_cli" # One which depends on extras: foobar = "foomod:main_bar [bar,baz]" .. tconf:: project.gui-scripts :type: :toml:`Table`, with keys and values of :toml:`strings ` The graphical application scripts provided by the project. The keys are the names of the scripts, and the values are the object references in the form ``module.submodule:object``. See the `entry point specification`_ for more details. :bold-title:`Example:` .. code-block:: TOML [project.gui-scripts] spam-gui = "spam.gui:main_gui" .. latex:clearpage:: .. tconf:: project.entry-points :type: :toml:`Table` of :toml:`tables `, with keys and values of :toml:`strings ` Each sub-table's name is an entry point group. Users MUST NOT create nested sub-tables but instead keep the entry point groups to only one level deep. Users MUST NOT create sub-tables for ``console_scripts`` or ``gui_scripts``. Use ``[project.scripts]`` and ``[project.gui-scripts]`` instead. See the `entry point specification`_ for more details. :bold-title:`Example:` .. code-block:: toml [project.entry-points."spam.magical"] tomatoes = "spam:main_tomatoes" # pytest plugins refer to a module, so there is no ':obj' [project.entry-points.pytest11] nbval = "nbval.plugin" .. _entry point specification: https://packaging.python.org/specifications/entry-points/ .. tconf:: project.dependencies :type: :toml:`Array` of :pep:`508` strings The dependencies of the project. Each string MUST be formatted as a valid :pep:`508` string. :bold-title:`Example:` .. code-block:: toml [project] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] .. tconf:: project.optional-dependencies :type: :toml:`Table` with values of :toml:`arrays ` of :pep:`508` strings The optional dependencies of the project. * The keys specify an extra, and must be valid Python identifiers. * The values are arrays of strings, which must be valid :pep:`508` strings. :bold-title:`Example:` .. code-block:: toml [project.optional-dependencies] test = [ "pytest < 5.0.0", "pytest-cov[all]" ] .. latex:clearpage:: .. tconf:: project.dynamic :type: :toml:`Array` of :toml:`strings ` Specifies which fields listed by :pep:`621` were intentionally unspecified so ``whey`` can provide such metadata dynamically. Whey currently only supports :tconf:`~project.classifiers`, :tconf:`~project.dependencies`, and :tconf:`~project.requires-python` as dynamic fields. Other tools may support different dynamic fields. :bold-title:`Example:` .. code-block:: toml [project] dynamic = [ "classifiers",] [tool.whey] base-classifiers = [ "Development Status :: 3 - Alpha", "Typing :: Typed", ] ``[tool.whey]`` ------------------- .. tconf:: tool.whey.package :type: :toml:`String` The path to the package to distribute, relative to the directory containing ``pyproject.toml``. This defaults to :tconf:`project.name` if unspecified. :bold-title:`Example:` .. code-block:: TOML [project] name = "domdf-python-tools" [tool.whey] package = "domdf_python_tools" .. tconf:: tool.whey.source-dir :type: :toml:`String` The name of the directory containing the project's source. This defaults to ``'.'`` if unspecified. :bold-title:`Examples:` .. code-block:: TOML [project] name = "flake8" .. code-block:: TOML [tool.whey] source-dir = "src/flake8" .. tconf:: tool.whey.additional-files :type: :toml:`Array` of :toml:`strings ` A list of `MANIFEST.in `_-style entries for additional files to include in distributions. The supported commands are: ========================================================= ================================================================================================== Command Description ========================================================= ================================================================================================== :samp:`include {pat1} {pat2} ...` Add all files matching any of the listed patterns :samp:`exclude {pat1} {pat2} ...` Remove all files matching any of the listed patterns :samp:`recursive-include {dir-pattern} {pat1} {pat2} ...` Add all files under directories matching ``dir-pattern`` that match any of the listed patterns :samp:`recursive-exclude {dir-pattern} {pat1} {pat2} ...` Remove all files under directories matching ``dir-pattern`` that match any of the listed patterns ========================================================= ================================================================================================== ``whey`` was built with type hints in mind, so it will automatically include any ``py.typed`` files and ``*.pyi`` stub files automatically. .. note:: If using :tconf:`tool.whey.source-dir`, the entries for files within the package must start with the value of :tconf:`~tool.whey.source-dir`. For example, if :tconf:`~tool.whey.source-dir` is ``'src'`` and the package is at ``src/spam`` an entry might be ``include src/spam/template.scss``. .. raw:: latex \begin{minipage}{\textwidth} :bold-title:`Examples:` .. code-block:: toml [tool.whey] additional-files = [ "include domdf_python_tools/google-10000-english-no-swears.txt", "recursive-exclude domdf_python_tools *.json", ] .. code-block:: toml [tool.whey] source-dir = "src" additional-files = [ "include src/domdf_python_tools/google-10000-english-no-swears.txt", "recursive-exclude src/domdf_python_tools *.json", ] .. raw:: latex \end{minipage} .. tconf:: tool.whey.license-key :type: :toml:`String` An identifier giving the project's license. This is used for the :core-meta:`License` field in the Core Metadata, and to add the appropriate `trove classifier`_. It is recommended to use an `SPDX Identifier`_, but note that not all map to classifiers. :bold-title:`Example:` .. code-block:: TOML [tool.whey] license-key = "MIT" .. tconf:: tool.whey.base-classifiers :type: :toml:`Array` of :toml:`strings ` A list of `trove classifiers `_. This list will be extended with the appropriate classifiers for the :tconf:`~tool.whey.license-key` and the supported :tconf:`~tool.whey.platforms`, :tconf:`~tool.whey.python-implementations` and :tconf:`~tool.whey.python-versions`. This field is ignored if :tconf:`~project.classifiers` is not listed in :tconf:`project.dynamic` :bold-title:`Example:` .. code-block:: toml [project] dynamic = [ "classifiers", ] [tool.whey] base-classifiers = [ "Development Status :: 3 - Alpha", "Typing :: Typed", ] .. tconf:: tool.whey.platforms :type: :toml:`Array` of :toml:`strings ` A list of supported platforms. This is used to add appropriate `trove classifiers`_ and is listed under :core-meta:`Platform` in the Core Metadata. :bold-title:`Example:` .. code-block:: TOML [tool.whey] platforms = [ "Windows", "Linux",] .. tconf:: tool.whey.python-implementations :type: :toml:`Array` of :toml:`strings ` A list of supported Python implementations. This can be used to add appropriate `trove classifiers`_. :bold-title:`Example:` .. code-block:: TOML [tool.whey] python-implementations = [ "CPython", "PyPy",] .. tconf:: tool.whey.python-versions :type: :toml:`Array` of :toml:`strings ` A list of supported Python versions. This can be used to add appropriate `trove classifiers`_ and dynamically determine the minimum required Python version for :tconf:`project.requires-python`. :bold-title:`Example:` .. code-block:: toml [tool.whey] python-versions = [ "3.6", "3.7", ] .. _trove classifier: https://pypi.org/classifiers/ .. _SPDX Identifier: https://spdx.org/licenses/ .. _project page: https://pypi.org/project/whey/ .. _trove classifiers: https://pypi.org/classifiers/ Environment Variables -------------------------- .. envvar:: CHECK_README Setting this to ``0`` disables the optional README validation feature, which checks the README will render correctly on PyPI. .. envvar:: SOURCE_DATE_EPOCH To make reproducible builds, set this to a timestamp as a number of seconds since 1970-01-01 UTC, and document the value you used. On Unix systems, you can get a value for the current time by running: .. prompt:: bash date +%s .. note:: The timestamp cannot be before 1980-01-01 or after 2107-12-31. .. seealso:: `The SOURCE_DATE_EPOCH specification `_ .. envvar:: WHEY_VERBOSE Run whey in verbose mode. This includes printing the names of the files being added to the sdist or wheel. If using whey's command-line interface, this option defaults to ``0``. Setting it to ``1`` has the same meaning as the :option:`-v / --verbose ` option. If using whey's :pep:`517` backend, this option defaults to ``1``. Setting it to ``0`` disables the verbose output. .. envvar:: WHEY_TRACEBACK Show the complete traceback on error. This option defaults to ``0``. Setting it to ``1`` has the same meaning as the :option:`-T / --traceback ` option, both for the command-line interface and the :pep:`517` backend. Complete Example ------------------ This is an example of a complete ``pyproject.toml`` file for :pep:`621`. For an explanation of each field, see the :ref:`configuration` section. .. literalinclude:: pyproject.toml :caption: :download:`pyproject.toml` :language: toml whey-0.0.24/doc-source/docutils.conf000066400000000000000000000000501442026364700173140ustar00rootroot00000000000000[restructuredtext parser] tab_width = 4 whey-0.0.24/doc-source/extending.rst000066400000000000000000000025161442026364700173470ustar00rootroot00000000000000===================== Extending whey ===================== ``whey`` can be extended to support building different distribution types (e.g. conda, DEB, RPM) or to modify the behaviour of an existing builder. Custom builders must be registered as an entry point in the ``whey.builder`` group. For example: .. code-block:: toml # pyproject.toml [project.entry-points."whey.builder"] whey_sdist = "whey.builder:SDistBuilder" whey_wheel = "whey.builder:WheelBuilder" .. code-block:: ini # setup.cfg [options.entry_points] whey.builder = whey_sdist = whey.builder:SDistBuilder whey_wheel = whey.builder:WheelBuilder Each builder must inherit from :class:`whey.builder.AbstractBuilder`. The custom builders can be enabled by setting keys in the ``tool.whey.builders`` table. The table supports three keys: ``sdist``, ``wheel``, ``binary``. * The ``sdist`` builder is used when running whey with the :option:`--sdist ` option or when using the :pep:`517` backend to build an sdist. * The ``wheel`` builder is used when running whey with the :option:`--wheel ` option or when using the :pep:`517` backend to build a wheel. * The ``binary`` builder is used when running whey with the :option:`--binary ` option. The value for each key is the name of an entry point, such as ``whey_sdist`` from the example above. whey-0.0.24/doc-source/git_download.png000066400000000000000000000642761442026364700200230ustar00rootroot00000000000000PNG  IHDRnvgAMA a cHRMz&u0`:pQ<bKGDgIDATx]T^~v%kR~"EC[)j#TxXxVJRZ`- ɀ_L2OU__4u񏘪6=am+ vlc#Vrv2& ܭ>O.ݿkC֜")6 YZ ۭ9ʌ\e[}`kNB 愥??G69rW!kOyb¦Xst##еC y]~;Q/$ ׽Z?$oE9~_}8o' xWv鍳z"' ۾\*]EOn3%H溷=AK(OOҼ{N_/ݨ8u~ ަ2"f)Y󭫕4zYUc4k ,EQ|cX+,4O.VV/. x벟*n ;Kt=s')tSZ{e񯇮kCfvtOx򛯿[nnu/"+qޟN|+D~b?u{M٘1 \BBG.̴xbղ]o~_eeE)zkxޥd?ziQ|.TSEQvn]lifguV/bM(dtwǺ'*"&gz$orRRu+'ԍ\7~xMm?:%[2 OO@NyEV=_Qp0KOkw.]yg@zoн :?igEWB7 g 㱴l x1u*=~{´7ُVOeXi{tڄQZbD}:D]䌁9iҟ4D+#6e{ M%E9oSyM-KZ?o g wsC髶V 濖ytx39Tzyk}AșD#g253Zkm/N˛gn660K"}cǪj#li}at۾*GN*p@Wj>vƥL :͉7w[}z}_U` i"nݥ>!7m2|Oj(J~k<"B0X>mԣ]/춡ܥ^*ݕw~rf7S/9t=wǫwg R}wrFzT3yWכ*&Ш׷v.Ҷ~Ӯ*+;i1_f i1a\%:ު5` NN9?O@19lNmu^bꅿN~Yݵ8b2(Ae1J1}啭~D4i]SyT/g6/x=YvT6ҿ[ëL<%\CSw=NSM$4\R{Obl74LQ悌'.L4|IwӍj7KM蠝0]{>{M_TuyƠf#r8܅43FYvKBwZċ>s`՜wkstvɐd gSBotXUdGma|LaazD!4imnScVWy'ʻI2]*]lOiת3%쀗e8s7ZEG 䵼<7< Yt?2[/8(̇Je9?Ȭi9mО3W&8G7qߺҿ՟ZM'+ ץטLlu#29qu6+g\DmT~*h]_]<ۧ 7wX: d}8e)Y(7RcGB=ق0]M2w|54Z,iWIcSl ώ;7[|uYNK$쭎a41t;Vai}x~K_7 EQ}'k_.o_.rֿf6Fa KNjR۹dm1B:?}ڥ%ES{!}k G> 7ߝ5S`_d^u]uo1}hRƨy &}VJŵ]uA:^]&/P>/7KykADYgwD]w%aoFg51SM=q].ctf&#r:9g+*ys0EQcU~RS5v"tIS@-OjCܙqĩVN'I G~2uG$[-@/6~(=(]>9ͺ^~$ z~J a깎8rͽ'˭KCdx翑kۅg8a깇N5M7:ԥm/Կ}znIKkSzŬu""4i]rrSz^c?79-BDjFOrb7z}޲}e;OcUIH'(6O>x5E+Sʆ(W%Ej.~rO\_Ǎ^ww+KN n 2,nr{q^)sKw['Nu;3p9zy9,w-=fVn *NRR\QFD'^ ucͱQAyw>F6Ͻ[uͩq5dRs1ܓ]o1"Vf\k"VB?G<|{rƈXqbߢfoV'X59c@̸|V'X6 Vf\kLXN wӭ۰hÚ!kO=PHbסkO=Dڢ km?п'ol51m@hlLXN wG@Cv? #.XӨbtrkmXSl?Z'~Z!km /H~A]#}#~w]u߬dcY{"dW@,RK}D!kmO߬His?_Q];w:?)K|xiiyb¦_s"d࿦՟y]=-wiS/!M˝^ߟה%ׯ9b^`_"vm͉5G6w[v o!|Hסe\\w(~'$IrxxX$vTT(:IWF;w,YrvH@IrC3-S6R}#0Xw!~:hdJfhhHz&V!WtCC-)`t٦7D`%177C=z-hh8j4@CzPT!dC~899ipp:/~d X MNz{pi@hhRwɾ~m1 X&MMMMM9q,/;=пvl,?A_oѳ'GơH:=1/X? {+Yz@?x[V:[೩ wU|igsGO{ĵUˏ3rF?\:UJZ)<ݞ(M:F.+Q쒫WMO1nLH\Su{UjN|6Ub-f?AN++^,ƝmMʙ˩=WFIk{0$ݸӵWʊ a`@d8I,bGx{ӧGzVu'ݛh3 C)uۖ*%N㤡HbU|D9OQ?O?wdu6OHO9r2)͑i;AwR)Ț=vuYb˵]jGwZ%g-kD~aa|V @su( mNQd5lYӧ)g EJ;\]V^Ϙ2LRT^QVg~Ͳ:[Nr?X:ז%ږ+My2JKOV6x_v']Ǿ*Y{,8uhG4RUJU^{DQm7&vjC%}N{ÎL2U;Z<4u͠1ˌlBƓ:ҿFbiA(JRz_L1X?pcnz@R*LIXum afN2| xk5w:1j'6 .eVꪹe_@DgUjťC ,bvԩrU|dƧ6)u\Cj~ق?Yg ?6m=zF`ȑJ특f~sxz6Ul?U:XړnUX}ϪTnLZZI?sdr“͠v蘻Yt`QR^FubK辺QΣ(lg%(2"6@*sk п&*eG8ȞBqLHO@u5?[BZn9[4z1<WjC%Ug׎. Z*_֓jqbUj'`#%뤊U]]3h'^!_ڵP#[(u5g`תT]qzAqOd-3;z^<؟q0f?ܿg[;С:5mTRuɶ^y0Pj]cw2<PA2>]9܉c?o~/DS5#5;-+LӃ6hP5CEQds~b١3uWjeE߱Yhu_YM?Tjyq?j-pmT3,+έ# {祬5?܊K=jRP} =yHz g]:؏Y.6CVUsGiiuW;֛kTgtV-Q@dlTdŹ{|N(bU2;ܜ]|Ԩ3{l&/w/+f~SL˧:tܛjTTX(*7ב ItLOc3FS9#G&c3CjԀFp]`r0jn@?FU#CC?h+ ?jO'Rq8.:_G&ħiW8M"-q%q?Xw,(u?"<.Y_ݪ3U^ayL^ $xr-EQd' %ye7ߚ?E 'yZOr!qp@UiMhM+f" ^Ƹ©r<=--& #E0$*Q't#?# td#6U5MX9)DZ蟢TE1""N)Ga+ga*SDVYH㋙)?8׿W[a' "eL+ܼ(JK CYRb?&)ic2OK"HveMa@Ϻd]Ւ ' )$kr4f&O?e0zЕ%ֺ$,e$[DTc"kQdֿv`R}H{{T{2]@j䍕yh?#X íGOm<g.\))t7]L'"^( bNZ 0/В-qg|?~Yer޿Rf=*9TqM$k*y"LRT^QƎbI0O@0}l!WS,@pE~f=2eBv&x61Um3%qB1vbg#StEDP^V,Sju=0M.#H<5Y=ű6#gTISo6I!jxNP YWlsE$ eWsԩJ<ׄvR6! O4gX'@CK;TFV%e37XmiJCFq8=|- {$ aBfYO~HEQ-AtC[( eWHZL猛]档ZW{AP9KX 2iE棨blG韢t !-h{ʱms]hv_hI^hit?nCJ+?c/+O H}RIYz,LҠ]6a^TUR/wNg= s5ɭQD?zoC~bŀgHQLzt78EmV&K-8ۈ]@_yVLd>ONlwԈMKѿ]޺SA.=M;J_uk{}{PZ4/?y_ϡh'0W /O@DfY,3ZއjZjn^Ճ}Kճi10$ߍ]v鷹 ¥LY_?P# 7U1 qt?@)7ĩw%Hr *>^B?CO$k…b9}H]+ Ngf"&A^q~+tyIED%J\,?+>2O( ɒC:&=[^MB-}, *:sΪx7os.@^KߧqRwG vvjci@$t[wږr]pDDO:{'uS33zX83333=Za0=O;: `4I$Y@xtEj0 R?cR{Hsss,9u{CסW I?`=z4;;,77oB+PYsssn~ܺ8~< ?xGnn%g~BeѣG?\7og~`%$gOʪʪ??9𨩽 < 5|[&r@-<^ P{B}[&ZyQ@isv.,b-vڦ>O@${kT 2?5˓>/BLz$3!_\R.a%&2Ev4)8\ jז% am=5I!|I>sAQU Ł:km-K  ĬVtIBARycIJ' N)JңVBR/"yr#(=nEO9%x>C6x"qT6xtR~er{+O~]cB/ bNxV~8OT/r?]+?YRZ( $xR.8_^!qqEY9ʳmc%g:SVZMTdk~4 ٘{|ՙ|^`R{%A~bƛme"%=YYUQ$M?K5\]V^QV~&;F(\\ O%dW1)O@VW2E.V\sׂY( A|怼0'H پ7L@K,u[A0O^d:VX( Z)U' DdaZpd,'εMďg@ӱLTR,fz.AYtVDdae~eDV2EDX~<7\ЖEMg= Z~ֿb /}۔9}~J+"WvZ]zMOq, 4j7ׂmYji͏ x!f랙M!]mӔšר Z(Q/\CѶ"%V Uz}r[e̳2r vWS/HcMS/>ʾПN||r4$uV4a}`A/CjSme5*YD.ݏW}v\w>j(do?i#SG3յ)=ՁH}_'e̓2V{c ^^9A7FSn'߼3c = dwq *eҿb&տkT63Кd'אVKj %q~aHûF:^(c cz͕@k}Fڲ?e}qϮі% ,mtUb'7Mֳiյ /筪jX\<$=\xP]_ˡ:^(ң63ˏ+1<2'/뿩Zqt\}|uu5F՞٫dC7pxSY1b^>UסDUҿMEi 48[*GyjM0H6M@gEH'R=WUoKZ8+q{Qzswwq-K% fA'MR6ik?]fhd7ތK'ɿ?w'߾xؒnvMzԌA7M'F'cCCMҿs>vsK˃ݣ(Hu ئP4 fϹj'6@sIkʫ:L֤Źvw-ok$RX\}gZ_w-/'J6X-N 7zE/C} }}ohlW[{6J`y gd|dMUx)3f.VHC7 t ^qS.ZDY/$ yV[scJrNy(/ Y"F L5*FW/7/z-XnX<$= ?2rFqxs du@ѿFIJC'ȤqS[nGJמ:# !xgM%dWTԞ8 ㉢;hx_y2JhUQmC*D ^H|~,@akyk֓/o?(F@ce5-JEkMaRLr|q.KR+|(81@HM(3U ő"B![ZP1+ qkyz8}ér)c<~gFD/~|Uo .rgJOzq$x)=٭u::U쿺 Oz}^9$<_,)U\ncZ ɋ4vpNR~008F,jw<6̹r؆pM aHTz,Ѫ*oK䏻kA*ke+der@B(DZunUy!|/,ARir~MjFGi[Keļ6On9_ M'\Rk+Sp?[$9S9x)ܮ=`O 7DX>;wu?)uAUQ+X!xU=*RoOYno ttv+ ni/1؄r^)I׉l:zQ9O >*朗8o\s_lOOwCb@vyEՕIa"B{@y;l,?B;_o=I:=Y˝dq:_'x+?/CT*F)'JtPx|P9*1&@RX jofI3_48MTk᱘ C= `?yK:%l( yK:Cѣhݞ%z[қo{z,&A?aǵ[?w6,?Vͷ& K??7IVG'877ߡct ™[ns!?>Wt tݎn@K]E&&$977˜3[K9n~?lOty ̗?<~=%IHFQLOO릦&u RRcdt@6CC?@?C?@?C?@?CCC?GC?@?9l|m(to[ W*Ԯ>2iSL3k-oڿAڄs-EQoLi >+%]Ob@??K99ZI;Qv+sz9IV-FK?GwCgMt*t<ݤXX/J/~V8i8Uc"#;akydzr 󃝫]/*lD7~Ӟg%gv;ܿvRgIr/֒ RbvRETSkuFŪ$i]mfwicTJVתCz(Vu>+U۷r+ZG4jIbIo?<*aTo=?EQ#|s{(f=RMQZsi'ۺٓIӇ%9+>sx0f!ff¥(J;isڵYV_.WKz94ܖJS}joFELc_C^vl鯝I(#|Ư#ꘃ=lSx}eS~OmL:|_~`J0U*Ul*SX;sM5_]i٬x0;n1x/t;[tiLFsV%/Cyk)jY9&7ČHFNXV}*Uo/nօI':-{MiPx-ƸjJ3joMwgO?[0Q3}SR;߾GoBˬEQQ*eB߃hnn50gl־h摏 v?5IZ˔v{_r@?FȾS]OcKjk _V(jfTyh=I'Mnۅϖ̰v?y;{6(p}rX|`r<(ʰug;s+;2ފ7`o3oOSWlxBu􏢆[%xwfO-;L;|;C,9cŵn,?5lCRcGOF6[tvs$KUtJ?OՒ.uӽ0_ʼW`)v 2 sJ+9mzӺ3'oT/)_S+l:zmgHkS{?CT_3:cD;NCCCF=420azA>uo߀AOo}僛Q?C|o0O u:ӿN/T?eI,;OaCno~%Ǐ'tSS-]Y+]?{@755  J@ H~wꡡ!VK]qu<@ VՎjZV;0pd@ ݙ[t9#JhhGGZ-- ~lیCpYnZ.@ _JN-O^4eLw~ пc+lv\>֧Bgff]=YJ׿+\6+E{⶧\%X-~{z}?9 -f}#078fDu߾C*ޞ]v0?.ܿvx?z\jc?~kzϛ?:Nd}HCt_YPq̑l#cg2l33:a?@,j Ѝn 8h bbb|О۲7o۳㣃+ر#{/׸p7voޖy[ݛeoؗy'rٛwaҡݛEdw_:mٛ~Ҝ=eo9Q/g6qr{?{t죏SkDк3J]Ǐts} yfiLMM׆TS>عy7F6>J8?)ssp޹?;;}_ۧ;7肒}⏿ͼpOvn޶s#0mܜul݇?}yNg[oyy[e~߃y3 n0vSM\?@LMwa!ϻwkMξiw殔>AihwJ`rvecb({'w;HƓ>ع#jwn ?M#V{S$NvJ%eo0wv\`7vSWZ/|][l8>ؕZxeJ`oܓkeJ}uJ3%}+>-gLσؙu.ٛuCgzBY$zz]w-qvSA]n%_4ɮTɮTɮ4k|Cs8U+T#K|R"huobffff׏$Rصd9-J7{ەџfffffz`W?+wv,adV}^Gwp{i0#5z䃆/reiꇟ_wtܬIii:DDaiR%Rx '$vz?OH?oB}LDvݷ{wJ]z}累$R?*o#hX'Jb+p?~ `o[6kklPL>Vپ;1g(߾}/Gl0p[+p#M;voUޝpvhVVKrͷZvJHԏC閝ޙ=-i/CVBah\ϡF@_@ lc8dϨ拷o߳cἏҷŕ9[oe時l߽l߱{[>*>T6gwo4.Z^d|U?͍v69vc?uUୟ+|Yt~^M񉪫j/?vqƿ2Nܝeu>쳌=-Y>:qt7V;T5לh8k X67ʖmsNn˗mvSc3qV8SOLп- `1}쿷fUÝ>mmY2ǵM?-g+=?0׿ݠ67,=F/ߟ[5Suk>ys癙>x!c8[f,7&>(`yjf10=x unuMx~C߅Ѡ?9P?Zd?峁,j??_:/| %tEXtdate:create2020-05-24T20:00:42+00:00v%tEXtdate:modify2020-05-24T20:00:42+00:00TtEXtSoftwareShutterc IENDB`whey-0.0.24/doc-source/index.rst000066400000000000000000000114571442026364700164750ustar00rootroot00000000000000===== whey ===== .. figure:: Little_Miss_Muffet_-_Sir_John_Everett_Millais.png :figwidth: 30% :align: right Miss Muffet sitting on a tuffet, by :wikipedia:`John Everett Millais`, 1884 .. start short_desc .. documentation-summary:: :meta: .. end short_desc .. | Little Miss Muffet | She sat on a tuffet, | Eating of curds and whey; | There came a little spider, | Who sat down beside her, | And frighten'd Miss Muffet away. ``whey``: * supports :pep:`621` metadata. * can be used as a :pep:`517` build backend. * creates :pep:`427` `wheels `_. * handles type hint files (`py.typed `_ and ``*.pyi`` stubs). * is distributed under the `MIT License `_. * :wikipedia:`is the liquid remaining after milk has been curdled and strained `. It is a byproduct of the manufacture of cheese and has several commercial uses. .. start shields .. only:: html .. list-table:: :stub-columns: 1 :widths: 10 90 * - Docs - |docs| |docs_check| * - Tests - |actions_linux| |actions_windows| |actions_macos| |coveralls| * - PyPI - |pypi-version| |supported-versions| |supported-implementations| |wheel| * - Anaconda - |conda-version| |conda-platform| * - Activity - |commits-latest| |commits-since| |maintained| |pypi-downloads| * - QA - |codefactor| |actions_flake8| |actions_mypy| * - Other - |license| |language| |requires| .. |docs| rtfd-shield:: :project: whey :alt: Documentation Build Status .. |docs_check| actions-shield:: :workflow: Docs Check :alt: Docs Check Status .. |actions_linux| actions-shield:: :workflow: Linux :alt: Linux Test Status .. |actions_windows| actions-shield:: :workflow: Windows :alt: Windows Test Status .. |actions_macos| actions-shield:: :workflow: macOS :alt: macOS Test Status .. |actions_flake8| actions-shield:: :workflow: Flake8 :alt: Flake8 Status .. |actions_mypy| actions-shield:: :workflow: mypy :alt: mypy status .. |requires| image:: https://dependency-dash.repo-helper.uk/github/repo-helper/whey/badge.svg :target: https://dependency-dash.repo-helper.uk/github/repo-helper/whey/ :alt: Requirements Status .. |coveralls| coveralls-shield:: :alt: Coverage .. |codefactor| codefactor-shield:: :alt: CodeFactor Grade .. |pypi-version| pypi-shield:: :project: whey :version: :alt: PyPI - Package Version .. |supported-versions| pypi-shield:: :project: whey :py-versions: :alt: PyPI - Supported Python Versions .. |supported-implementations| pypi-shield:: :project: whey :implementations: :alt: PyPI - Supported Implementations .. |wheel| pypi-shield:: :project: whey :wheel: :alt: PyPI - Wheel .. |conda-version| image:: https://img.shields.io/conda/v/conda-forge/whey?logo=anaconda :target: https://anaconda.org/conda-forge/whey :alt: Conda - Package Version .. |conda-platform| image:: https://img.shields.io/conda/pn/conda-forge/whey?label=conda%7Cplatform :target: https://anaconda.org/conda-forge/whey :alt: Conda - Platform .. |license| github-shield:: :license: :alt: License .. |language| github-shield:: :top-language: :alt: GitHub top language .. |commits-since| github-shield:: :commits-since: v0.0.24 :alt: GitHub commits since tagged version .. |commits-latest| github-shield:: :last-commit: :alt: GitHub last commit .. |maintained| maintained-shield:: 2023 :alt: Maintenance .. |pypi-downloads| pypi-shield:: :project: whey :downloads: month :alt: PyPI - Downloads .. end shields Installation --------------- .. start installation .. installation:: whey :pypi: :github: :anaconda: :conda-channels: conda-forge .. end installation .. latex:vspace:: 20px ``whey`` also has an optional README validation feature, which checks the README will render correctly on PyPI. This requires that the ``readme`` extra is installed: .. code-block:: bash $ python -m pip install whey[readme] and in ``pyproject.toml``: .. code-block:: TOML [build-system] requires = [ "whey[readme]",] build-backend = "whey" Once the dependencies are installed the validation can be disabled by setting the :envvar:`CHECK_README` environment variable to ``0``. Contents ----------- .. html-section:: .. toctree:: :hidden: Home .. toctree:: :maxdepth: 3 :caption: Documentation :glob: configuration cli Source license .. toctree:: :maxdepth: 3 :caption: API Reference :glob: api/* extending .. sidebar-links:: :caption: Links :github: :pypi: whey Contributing Guide .. start links .. only:: html View the :ref:`Function Index ` or browse the `Source Code <_modules/index.html>`__. :github:repo:`Browse the GitHub Repository ` .. end links whey-0.0.24/doc-source/license.rst000066400000000000000000000002021442026364700167720ustar00rootroot00000000000000========= License ========= ``whey`` is licensed under the :choosealicense:`MIT` .. license-info:: MIT .. license:: :py: whey whey-0.0.24/doc-source/local_extension.py000066400000000000000000000015061442026364700203660ustar00rootroot00000000000000# stdlib import json from typing import Any # 3rd party from sphinx.application import Sphinx from sphinx_toolbox.more_autodoc.variables import VariableDocumenter # this package from whey.config.whey import license_lookup class LicenseLookupDocumenter(VariableDocumenter): def add_content(self, more_content: Any, no_docstring: bool = False) -> None: super().add_content(more_content, no_docstring) if self.object is license_lookup: sourcename = self.get_sourcename() self.add_line('', sourcename) self.add_line(".. code-block:: JSON", sourcename) self.add_line('', sourcename) for line in json.dumps(license_lookup, indent=2).splitlines(): self.add_line(f" {line}", sourcename) self.add_line('', sourcename) def setup(app: Sphinx): app.add_autodocumenter(LicenseLookupDocumenter, override=True) whey-0.0.24/doc-source/not-found.png000066400000000000000000001352371442026364700172560ustar00rootroot00000000000000PNG  IHDR\rf'zTXtRaw profile type exifxڭi7sp`?C)J͈M*3wÃ__S4Kk{q3_Ow>?h]?3}$ׅ}>9"~|? K~\ꌟo)_S{~7rcvU)ƓBYA.u|KH ?nO7ui~^oQ?A(??|pv;_vȕ_=exd{[Ww2?"8/?B\rab9",{\D(Wv2"q.}-}n;X-_ޥ- ޾\O^E@[y?6ٸ?r+8'^W[g5c }44XyL9N"JEƜREJ=-kԷ&QRM4V΅iȡQRɥZZ1Wz5\KUhVZmYmXlŪ536z ,֭>Ft\kwfiYfms,gUV]mk&vm{Hq)v3.vͷz۵׿ZZ|]ڷKIQ̈X́7EsT3ߣ,Ȣظ1BO#r7W9D'Q"BOT??6\!Ru\[ 5pmv[]`c-[s%YeS@E"t_n1˗YX:@[ -a39rA ;Ni|Ș8)v n;+ẳZXeOn mݕܜNf< +Zxeo m7͋ mQZllbvPՕMrpɝvG;7xa<˧0oUAkSl7wbiu?qu8 I];^$N7-4uǽ~lM'"g;jxcz\Rq7sʙmkMccCڷⵉerW$My5lv<~iqJ?^Ch G"ms3;';+}%|✠?˗:UQqsYi`߈wA/&u)KD>@髺`8 ,-4"X՗I kZ wQQ"apR=i&( D uM %+][ `CvZn(&_p91tC D45[Ko0JJA:KArHkl]]K,`0J5 #ut!50Ie3¨o2jj@yAeM̍<]=8C#',ԔͲ39KjS9~7~pB8Mfz441*'3$:D*\Ҥ[m98eAP}*DDgPX@wqEE6D!%>ˁaPFzHd--CZd^|R!1}^$@u@c5G ;UlR4ãS`w(}ϭ"+7&zdGRr&uo&㣜LqIAL CwLM5$JSm~k2R"Z\Ky~-6 Qx'-aO ޥ>dl=wL $,9w}ٮ$D< cP hضc"o +8fPb6PGQT.D|(p;W*F-`vC^0$s(r=H(uX mr{U+`z+,{?X|! FFvE<,*Ȧb:L>|: |0::]asS!%Z`6И cW!K=yj% Hp]U =@hAסÅ-~UEGU95qCM.79]dna%2uYяcb@B2+,~U)C7!rgNs :"P@Xw4Rs< ϋIO‚앛)^8>APGJ݀x\9$¬F(Ķ`Xz8P(dVJRcB3K=)9/ J !mEq`U$1-W?:`i"蜉nMBHjJy ѽpAmpQ :OnLn@hlɦB] tL@f#P#؆@7ʹRD cXjq“Zы?/u`{SCg(l|s5Q^M蓪C *;e t>0?zF=u; I5^6|퍩zvhrd+ω]'Q3rI3q@|JX+Pe&u.7XIdK@2]`A[vȳB^aM?IDw w`YXUVRsd4a+,Y2j6'Rұs(^Q})V PKKBS͘ig>`>^ LF6LH,!)ܒ`RVTJĤ#cG1H,. d4 0Mr1L`&0j  (b~wc&O!SPS'SʞUe!J/ցCpC#t[ 7` Xe.Pˡp#+ 1N+j(U&D}?إP1#@ub_)&|/A&I@ wP@HVսE ƞ &@,Sj2B x Ԑ;.wQp d̚>2kx03Fm ߻!>f5F T VhsRx\c].VP Ջp}o?hP ` "\hlU>|C+a>^[D(Nl-=9y1~?6BRїμ nCe\Ed@e}o)6$ N]#R0cJ5v4Dx;=& $n+-J2)oNnIOjsQV*O پFe颣?l @A%2o7 _OOj9CbP@U}kgx?t5חP dƀ#WlT %)le@41{:mAR W9Bj#dދ;Ż'{z:V$|TP ]HqEꟍ 8<6 oH8.`Ȫv3aQHq؏0u!Dē;! $Ux+LT(a|($[诮sSN'6 utGCOI|*q.G # ZÖe@ XiE2o8p.`$ɱP$}%8W'ǵErqYL7 {Ar~>RujR=|Xod ^'o]햬ViLI!/L|%١N+x.f(= nC'zJ0|()l.0:V'Vχ-@Kݬu@Eg[u0V AYƈR5jՌb)yg&ubFH-x%$7K (HM{Rk5 vV 9AFR`Yt$jաKӔH1'/7rCF6?BA0rXæ1K)D~՝@$x`~b$u4 ,r-Td"z؀a/#Qi;o ^w\S.|8VPg7BѸl}^ CVCl!`KL±ItSE^Q4{{HcSk6hӴ,摽TX3!,,f%h8H]é> @ WJIp7%})ʄq'H ZhS ~b-#SPV*b:#ʝ(p;~FԆ w.OڄijFv B^u%fE|5ƜΦ6u"1^Pf-JIƨ)c՝O"t#+j06+@U{!H@$2[}%nT~O' ̡̹ut,; P5V$lל¶wO /ҔJuXܭWC|bB!9`C}32_1Xċ یEJpB[BNXuu2jDkAIXu-OI:V )|mMЬemHu#܅FvM)#Ө0,S u^h*:>P 9fk`hI ٗF6VMhס,+,WǓ[PT-0]w{uЗ5=;n跇bGٯI/piR4XM~Ъ|QVm͈4r}ZY^OEv }#-`܏,jٽ^z+0!L># 4u*͉إFxSfkB5#([-bW#Vק{6\-$IsL۷KI9NQ) /Xːx'SZY*!Nt`n҉N0̐cw>%2pXt DJ(V$ORpvH%Z$b$χbׇp`MA]ojF2KT΄ѼS٣o8RY0+g`~&I1,P`eQiXt:SjLguIy؂z&*t+%BɢTnFj#X-kZP6V6:IKD>z5u]<w)gB>Az7#}H:ʒ`P H^I:-z cjj-G=j(D `*-cUY:$Ϙ !0buDsDP{F+`~o󕭓&Pp ]Bra_`C 1HkZ8iv7!4}ʾRE-]6 WEgic7R%DNs:$AՁ+HT y" HS=P&p> ojabȠN(J@ڡMġcj{#~ mEG@/ULP2']vqjlaLrP/'v;X< jq q#(%Xs",V1pT^0zN*ȼ :1E畝@LuA.[L!rC3=@] n,ʕ@>#ܪEӃ [k1X1 Ⰻ}4|S䁘,N7W;JUи%&?pdl Z}ǬB" k|9_AX|e`=%n¶8(b܃1^qh:u2UQ&=:6tB8( R騤hX^#U5U0`:Sf}G(F&&k hQD;9p;?utUa/BNf^М zaM,HL6LA]V\}d2N)n,d,`\UxE%VQEѠ2F>W֢8*s@Gױi2 RU(advAQPax8 i"8AԮDlR!5WCkhbjx"gf$8:gdDvқ(6I\ ,Y̽5e 404TƣŖ'ٽC+sWHHD6J뱌DjۓSQ7I@ PaCyw՛:#5% ԯHBSXu5_PAʛ|5 \WOد]˧ϟp*[uj_XG2u>,g0(rOHI{еqޠ$8˵@4XQFHex{seМK}@I(a@Q󱲋겷4=lF3mמ3)uNg_T=z5x14VHrbYK33՗@8;:7pnGXj j+鎻 s(֐I[7 C7ҥ0Xwi*1H۔m_sE: )G@U ۘIOćmL`FN *Sj|7Zlb/Au|ޱ[a'**a7|'lhYPzNO}lDL~=^IH< Kܱ.Uk1u^b)P!l v6k^{ &Ltҿyb㓵w"{zQTBPtH'TMՉc4]uՈ;ꑰ <6i\R )WVɖUJȦHagu { ͋ă\n\N8Jx V XI]'yA0#P2MB'H6u z 0gD"Y ,hFk иyoP^,BU ܗb6Fjv_̦Uy`>zJQchbXt`*TV$?Q6o*T2QhV+38s;2c«Џ8FӥIMBa~.,0v}}l53d+ny>0"ŘX^w")@37cm(PzL-Ws]r[_մAe=d!бՃLW9AƹD=+eZk"A _yHAŅHEI!UzUc oBGɡNy`&^ +ojԳ SU^N DZP=Y׮ 6ŷ{:?8:CE;]j: =IigHNt{[J3S-CB+ >s]|a:_4x`[3zhr)~򃇬ppp`|K&Y zpU!kӱq*@#er4&GIg֍@ЂHpMBWHgE9#,K0JqF:F $f] Z,"h:ܞE旦,EFtXk _^~ |<)5gVA SQњ5 E˦ sZ71{}d꣒P؇'ǕsOކ$B1YI 0EWw^I"NE$z< ٸ;"`p&35Xdz^(X[q>- yN"-Wt V9xؿy+, YH0=daXА2u?sV٨`9.c}}Xid6VuڟœeQ'ٺPQ͂&@=!`&^_9Q'ҧ56kȅt.a!fAHҹ2Im'5/LP?zI?lR lZ]0@|h ^g-z/W#thIf!lZFm@!V6U #B]1$xԤ ?2]qeef&=O ;X)$qLtkҺ'{a$,3fI,b "Ȩ liIUBTAr`[01%E@q>.Ь;4O3p0IzŎm⺭{0dHJA\7[g뭵 C]nC`H>3~r}bKGDۗ$ pHYs  tIME#? IDATxwy6ٽ}z9G& Hjۤ&_nt/ݐ/$`'Nϗc\0QDPC]{/k?YFBسў=̼g9Yr,g9Yr,g9Yr,g9Yr,g9Yr,g9YESpף> <"h(H0MH~wNp9W`UʣWj 8$cSJ|8WYp%\{j8E/S?s(@WG?_{Ʉ! # vIFRj5T*J%eeEE4gR?𯄐o޽\yG̮GyMo(uvݍv!##hB~J):j 2 $R,$iC(%kk>`BbXbzzzގD"uI?JJtӘ з|)g?pDQ? &xraժUX|9z{{/ߦL㘞iCؽ{ZtOw /֯[Wƒ%Kz?PhX,"cbb8 ޽戌>~@he,]>4 ?(FFF@)]gO3GtX>1@G}}>JlذD'kjFJIIrEMPñ1>}lv1_rQտlX,۷cڵ D\\FZERAvqѲBF)4 r9R)LMMԩS^0?vQ#l"Hի/g\.T*T*R" "rA)"Ncff'NBvG\'np8n k֬Y342X,.o~ߖ$IZbRfggqQ.t~mppp)G_-lex셾2ÈD":RT*L&)bN._qkY~=n&E|tzy<-Cq1AV<Ν;#G,u188qQu=Wx 3"F83á9+bV?uёBObĂAP JE^oܼ:k7c@#zhoooHcH&~r9ݏcpp#vx7 -o0}݇ަ7<2 #YzdOG 7v`;z<[JoV3`mGsA[oWW^DѦVffBzñ+80^|'b)x.yIp:~CN]Rwu_RT`\ U c]=bÊ]Ov@ ݧZbrrZ 'Ncvp!pbUV;c!J!J-ju7M㉗&0^Gt,OCt8HB$I lJB)ϗB)ɕZrJB@܋U;u/^$ $ [h`rrJcccx78∠ޕoݺ7|m*/OR-f5 N/]b["<ՒL9uIzNsTs6.WKumǢs~?:;;mCRLOOX,b~~/)HeG   Em߾7p%*˘Ztӣi|y0N/NYRW[t=>.+f;+gfS}sپrX1;Kq\.l Bffffo>nD鈢xU,~7x#mf+\s&eF|;5=9U^$M<;Rkز7,Yp@^}饗ڇwgy睟ܮhpۆXs;UW6ilZhp! W︲kx_ ֝(]QDpV_L1}m/Qu !x]`|yg(.1VU5# zZk/WcSU9=-M j*BE H@ \.P(@ `w]v}kϞ=+kV.Ԟ Yǎa,[%֯}c`ew@垫z֯./${Y].TkdS_ FW"@ xݒ%[VkbHCIh[[l2fS|ero$K rd"H4!V衐uڼP( Z"7^޹s=sNOxG"h7w}m-*B:WxYn4 &}uj9gA`= hs^˽=zjR_9 :ccLR& {ck^J"4Ai߳gӎ*n4o߾}mIږzl$ ٴa٫^G%B>u'[tV_u3 h LJ vEojsA۷3p1VVqk]J \ex{!tz{㚖[tmz~Hg<ѧtJO9B4:Pz#}]qpBn `ݕxݾ`PX,<{rs|3XW 7UHUǞEB!0D/Ϟ=O8Sv7vܹK.3==ݬ$f㯼 /IiWb2^~ T"dք3O4?! DR&"gGU :3;5 $nt`T(FB\2˘qe$q8aqUJ)ժP|>mZkk+ECw֞={N:"VCCC7\f :anncDŽ}.4%6#:6w?qݒݭ6j4(,'~=z<gC(w8,N@HkdP@0/#QOpV|2ZIa]V ۵k޳g *!7`J B;;jAjc83_^ni c6Bވl ѡ(z\f#{NeĨ 0HeW`g ˽Ii@GKtbWəE Fؾ n&#rPA\,!33@#ݒ.g}&۷1cffƶ1k{NdQ@`m\U;߾dsp5U=w.ט "LL*7@0`zc7 ?r%^£KB,̑sƶzkFN+WkCCC){ؼ֭CT߿s()|mͲmmqaْ/p϶M~gb5Faԥ(_YBKH41}E[1Si_\oBЎuK@[[|rͲמ>ċ3+mG[[nNtA=r@޾};|>пYt}qw遞==b=yuʼQ6tSS1{fPA7#Mk1X3ݴ <AoumE4i^*l7?}Uo*eQj7(eo_B8??o Ӡ{-#>{.6׿uGz? 7k-[v[Bдw^Ɖ9k2[ɯ[:5%r=kB=g6`1(D_WtӅ[{nQS(F g _[~Ԯ;cmK" inϣYQp_7q,ky,2]{U$L;ƈ.'@Xg:_Ż0"Z.+O$Jo?"z?{j0ri(ۇw:"|*G}[Xb)Mvx`'? u\ٶ̄/ܺ ju̬FCwЕ:'L`Qx S1`*nU2 )`܅@*[q: Xr.NW[M AQw,PAG/S4L=CV^ I, Oe7DHc޷D=sKJD\~ zk|N} l( ZjQGtd 0l^>l8j2!lͪ%oIX.⿼0dV\h4(vkۍ5kֈ544L<^ݼ}Uح_:/ʹtI`( <ՉxVns=gFH8Aa5bc((S4--d%3`Yi0SW]S(jhhBs -(J((Ȩ?gE`П_6g?8NRj1 200`71cc 1>ǃ+W;?>ǷZv}|_8-/a: pf)H@G_ =5 ?@w2`d󙢣8*LxrPS FF'CW,L73G2wz(*ۢzZCD3g]F.oZ+Bn^%I Є۰i&@_J iATW}y9yuHBU!` # ;N #}PyT6j}WM%ЕK^{Q2+Db>eVח.5d\.2cy|XZDڕ F:[B '̌Ti>@ P.o{U~`ә|B gLJ4)*>8!lN0'Pb^IⓉN6CV A-b c~Gq2A)29vGoeGٺ<%@qKSԢ(SFBƬ Egg`Q!NVm#HcU’1ɗ%@E/n-FϿir v-r#>G~m4vSc1)CV߿5#fkCxV'I2ƤfLa%KϛS0P. =vU9h<]A(_J(OSE`< 2>7@\9H9Gˡ+dRP>DžX,2Yz=s88ӳX,^[`P&ۅYH r~FookSۮIm nRX źSFqa0]42[Sr ӂ̼/3!@Cv؉_m=yLxv.)ro$ "+:aS %0 V-ف>OHd9ꓟ%G/l{ ëhU <57G?Jz,JTWFD~IVD"P{D-!L;J IDAT:os6u'x(| DQ0<ݽ?>pPpr_8GT{ObLeF(+j֡w LBE܊#sѰ?͗ |cf DQZ@oo/NnJu9b> ~7oXzZMi:>Dl }<ɚyeDq9M(D?3sB 4BP)Gy'PfE(R=Hx΂ġ)X*Wx ^(7z8q.eKVUR>zooo7?=d5^n3/\q J|Yx%@p)Stg _׳~1:"r$98yy^[8kƵi|]1sR( u RQ51s#p@O&_֚y%ф$I;f(2c)hTd9&̱ڃD L!ڈj9P6i 0z+ėmK]E%j{ߟʍ z'RIM</$IQK]H* @ NѡV;b(,B%F O o΄mqyok0{%`I=fHeڿ)W$ /QYc0*=tHxac%4׊~dB#'b#Y w[I>%cR1 x2W4botu sN\]Vh4, ' 2]X_b044`i&l!jX#|7р {CS6)/.Oc<93Fޗj@J؏h? `@5.0u L+43 uAu+س{^4}t zc{bjORboUpk~~("xB]R ?x@@Ju;cko}`k5kP~aai b!5 ,6X.Q=7@&U2F,!Dy?r^8x2n6{*j`|ɰ񻨮 s Z+eBO(iH@Gk߼t6|I|/."o8IB{vtGqXh)1[02kM}pg"c|ʘ0&_W_;co|7Yp9 e*5K`)a\E`ugL `O~hoe!Be6ͤIjo%"`vTm1K c #Y[7@t(Eth !d#ڗVl7ohmmՒ7̍?*N G<] )!>3ՔeY{(b~<_ (S(E9IEKJt 6Lyxܾ}]~:!839!'fOs!DB[%3>B=xAԃvYOMnP[кEg1>LМ ^koPj&I1j(t2bP -ԲjQH1#G &T`h\Nw+v..` ~_Ek81k Bv5כkȡ ;5xNM)'[%)W<' SstO)+KWNjuoqi5Hv" 5sӅi!8, \a,\Ssed U[` UؼJG/ UD55' Ev yJ,;z0cBb!uxxNuP!}~9+'Q!:a0t֕IC&`{X\q\Rs=GR`-3p Jtfa6>IJb2]ȵ!BX!K,K< liwx\j0ۆ.?8ϸt?%Le u@1LЄkD +:Q <aeZl)IGR{"ZO<ג#VbˆF$OyT)EMǙc건 gJY).v0/x.K伸(LQMJRD `E0a!WI@/^ Po~>M4_PƈgV4&hdѳ`R"?}cy絓pO!Zhur-|<7DS)yL1 2@$Y=?T1T)?TO }kzzz"B`N&3?ØYt{B Η #le2*Ԋ A\Z)8GV۫|8u&/Ky'ڨ7LuPCrgCDBT'C+Pd'EC' ̏XniHdUFn̸p#Hɣ[b|+/Đ)Tl9#347OUovX|>m [rQׇɲHjGm؏<ћk:?~ͳrs4YUK5뮽=mDG#Q`k~p|ߡw?C-xQc8L'ƀtifd1d镣e Q$n;"#:}B_,*s$_6@}x_|`/-(=`~vLE\Z/~`J{ku|kjqr"}4:>:__=+{k[g>ty##zOn#dO4ʹ;M#\rnI‘/\NMNNNB`;ov#1UFn֊ȪZL6~&5HAYؕAN E\&xӏ}>OY xT+g ot{:Vg@,rD"DT#Hdʒ(eAv]TDvr,s6_WS$]B)9ԯ 7/䢱Mu\Z7s#!G>h`%G/aZ2x Bէ7=iA9-N<O.Y?osDѧp03])FfLZxkQ߱sŞw^V)0 ӭn:3 \Z$|2d,7 eO,d ^"دfQC<^jVj)[}3#OX/*(v<'^Tozh t$9k?7ڟrnkqz_zŊ~6n\a xBң`ܘQ  q+O>i,K\4PC3N$iՓs8_,Yw췰BGhkw~}9Kg&7l^9zҌYZ% vvĿ>Uo;n:)G00C(cgˍj݆saN nIH{x.3:QG/)vm !t6]AL/}ĝ©3b p;w~k'yCo}΅wݰ1~xOgޯ=O<ݞVfׯ_=7Η J5 ={D7ՙ o%$E څ,0R V4 `'!m6bP(D7nWJպ"xfߑij/?kfs-xYZ@+o?{j\2y?QiBf<Oh'l\hva L(T5P0F(QL!b`&P(X[GvpsϿ}R2gw<ܛmnq8;5\[MFvrE?jg]{~#{r Z VȽpt3 :U(IO(kbP1y'Qsx8 JÖY<|D]jFfˍS[06S"b|g Fp>8' W>vgnڱg'~Fu*?þ~Z]gojO[}$f;o9G7uJ͢P{I"I na!Qn~9P5?:2}OQ/s[$ Pں9t x@c1k!4XSAޠ\5GrA0O(|f$/Cyoe{5O=\3.o]1K%Y EOl{+^+\rh2f Ѓz^::s0SW`E-p_JBl=RjiA J^%4auXz쬿r^A-RΌ2f' lUcDU%;Ou.o`ūGGlfU/}d܉b_ؿ,]Xwxv5Ƅ( Ћ V}SjAf#HPY[ Aוچn,**`iUE^kF `b ygLctLëLfߋ\,Gc#=g'ܳc/~obj}R/"Os'p%QhmZ[r--AAk=x~TPa?QĸoǟmFHIk\p/(]sf zç2@P--i ugT`51GcZ"UQ {I[r,®ܺirS/Zߗ|~LY{>d(\_[6-yE=`E$+ot$ZchKk;kYZk({dZZyhi:UYmކE,h}J νTRܠg1.^X-NĐGɽDcеF"`P s\k]}ՖyacOO ϥS~hir<(D_J`8r לS{}guz2_7˗ϿEUSJ\?OOsx OFp$:fhKl0)Rpu LP)U ,`cs_\`iV/l@K2HTb]偖j!7="MVT2m$*0JK4hoo[?+_׏%NK^>uzJVH\n-[ggf <O>MљH,>EsHAL XT X۔7#4])JG/S*L3Wq|:`YgmJJ`*]f2 6OI#b!ƹF+ Bna#l劥sO?}_l,Ͻ|;o]t-QKt:OF+Ei{]sssṹ91vKXl.Ecp<1$ñxA.f eQ[ h3~9"~cl DM&6, _of6+ l:S)Vu\Z[Mq]vە'|z1Grߎ#oHZYd43 m$֞p zER\O>=b;wk{}5 o*JR]~oz,KGcT4Hct$d KBUGI|^Hu"+ݻwW&Yr J<خ\zTk \ ΗݭZ܌1BTOLTM#rN%%1`Di; \#U:1&a۷zΉd~܁jrHPzsr;t6ux.P+*f'IZ;Z;gCegz2dO!r]\\q~AݩT-JaXW =kUYlVN;}98+ ܬyCW&dm~oMj9Wj~t +V?&1yZ1T Tu7'ݞzkgTkg$ԕI͵eS|6ݙˤ;l{.kk4,IƼHD|B_P(F#ޗFdz]HnaUQ|ucd1)tָCG抹KrAfL~0F2Crw~IC~2!( BddF> IL!`#_S׾~|I[ݒ'oOYCW-3AT9U2A^TC2bge2-\-δj&n VU᧔=RW IDATG/hT*ek&"?@R  H02k0F'KP+q{BwNR$* Kᗉ=IATT*N˕gg^Yߠy\_纷7>owſ>haNx`ƭo*U5Ӂ2)(K`2(]Љ!q$nyz*c\8+0`X , lM2l*ٞfZRtV%_2έb"E3ov{~PJx_p'B$uKV+ ݡP@gzfj D=g8#rMNH>0Fԣ#w*@ΈxG߽fd&nvoC;Z5 ֞x*7]55zo^kU 3 բ SG8Bh>;z&)ӧF:76!9YjsyHǓY{K熆Fbj4Fj@$ ?:3`߯:/=ۛp, ]r}; ta+<$9j@K&S'{Ӵh=,;_q54(+f3s)F]zc\cg9zGW߲RUB(M%bH_JXAJ/-]DtgW YlWU$I1#ڗ~fR)DQTU6+n]Ed b }9ӭсcM bN$;P, .!@\1Be)eQFo+k?"[&ܵc˱?̱|Re0clڍG9tTT6LhKH [#MI>5_ * ~ِOhP ~xDyP&/R`#ڗV㆛wnZ>|>XyGֈXm(el,Y*%K9xn' z~#IZ8=Qs__W{=̦[>Hkgϴ>OY8GvLGݽ( <|:|zO%b_hzXi_b.Hn1o%l\!᲼7"ORJR+e}߼abbBrY+V>Oqml3-/Ii47^g5h7ߛ?yc͖J !0GmGxf6_ŝۥ-ar6 9QgMWaSW6ShMJmmCPL$x^=bg@Ξ=kҧi>)o9+J I5-]cM'^l9~ݔڧBk?|_l/C.aD`:À9 I$j<{||.6N$*eTbmh/B#fnnLF`J bAmEUVePHn V=nPǠcyB|^7;*֭{r}Ӟ+΂D-V10P9*g>f$2#Mj$w`9;rn9KΡ3!v}t+̦{xu =?1?22""h\.۶ [&BM(̢[1oq뇾-7?| {\73*߃sfbHr.mzr=!H݄(_X?PWɜ"ZGf.Wj0kN:%_>WqDUO@5WmbȢD!X$Y&c6UO&Jk i;[HhZwwsn7u?[ړ &t&rBt̊r6%+JΞ\yD]YgÊ:t{+?*Y`I&=s_,b ' Z ottJł#<Mq9rG)x^ۈ7 >7!fɡ]ʚ >1˖7~v-ۻ뾟k72[MO:fnuǕA^ tZ!>yne2FLn1Ģ*n4ѨrDj,˖tcǎYRzX,wG gϞX|>ob(۲nYc}-WO̭2߉k0]7х X"C;v~T!6n1q]EbP d`0xTn+AȳM.+pU%0Q^gv٘/U-AWǰ|zOsDfff077g)w4c+ mPrj |\nZ*}UJ5 aNBΚl όBeEzY,+UJ *JI޾g_R:;$.:FEg1|jWajMFoBPT,#GDYJ/2o?sF ?j ̱zzO.ax&|qJAAύ(@EDLw rՋ.d9Q(ǒɐ?HG"<|Eb s-d<ö[$nW"uR) * _B0oԺVUab%o۶akl00111Y<J6|M<z`mP{/QTO9MnA,.Aop C~еVSs||f|h)xp۵}jj 9r":r2S Q|0<o<5zO2KG'ieZFQaܿT*YDOc8"|y L(s6hEH]ص\ նF'bJ(L@0 3j^O2Zj,(@ro飇?ƻχMґ)*\fBHOߕ/U-3n|br;(tc~hffgΜ%|_rUw.kˍ{:%KA{{0E83~\n6"M ln] Is$b s&?,[5Ek&rkD(p.r Ο:="u oBZZZ?~0ꫯ{X(o`!N)ɓ'9 9,h ]=32{lo^ӛ !X]&170(B"ްz?oE!胑3[33g}_˶O$(߿/p2WK{Yb307'H$pر""NJvBO̤ @HRP!|u]!BI֝ŢͿ5n8w^dF%D,$usz~&n\׋c^X̂Tw/VxE_8@`YwޛGqw_]]} IQlEEEm|g;y;;M}|T*( jaoocT@ >1 % Oq| KxO[y:H;hA x3YNSnY,7e vIs"|1ɏ;9>1|qŗJ7( N-cMwIs\gggRaXXXp,E==Cv> yyͼn'7%XWYBH# 9WտIlsEs \4m(D"tul9ga_(NM)A? A695MkJpq' +خ:t7>0d2-뎙a$A0F{ MNT~4Nzddtkj)lM88_ސh l2 (YlEL\@ pn恻I ;6s6np{4rž.kUN?]H$X7??4 n>77':dpQСC|z^8sWU9Vz^TUG-+,cGdu*&;~y,2ڦ|| i!o6w*H>>p=?tS~FRk>ޜ4,,O;\,Ft^ٳg*~o|;݄YB]vX/,,`֭&*^odB|>JRS(Ah{T HR!|6-uFÑh>G+9$NB9gY9ɛF% $D3N'f?ᷯ1^79S|I'<_*ہ&%cǎСCo`kGf}vsT*M?Cv-$YKe" L/xYF@sHٟ@HjO`?{5ZZ'3\L=vo79cyG__ݯ:^@䊢G\vNoֳjMH)>t0M#k!F}Aty& |łxW[εEıJ՜:8Z3T@ooيOձh GH[DP+'/~d.]݉>ܓ8lٲ5;77˗]eJ;u]|Ϳ<~xf#x^}vSF9u ,7ُL׋f;(Mv|ҜwiRnka-r@Z8(Ik=inwHs1gF́7.n8 ?<[nB}}}$(MLL^pu/~'w^@xѣGu'I VNAQx ˇۆCx\TMs4E!Hp fצ ?k1z'F3 G&-:>w)aM1ǟ|7npcwk*Pӟ.~>'oFo':MC \=t= TUE u\$IAK@$]1\!YTMbu`>IIYCez1;c~13{JesVSdNlyco=VRd2t~aa;v}{n #8dYh~i{9|) ^_"qSZHݻvjl2R49| u 2'^O"Яw o}NЭ9l<1z഍nNA#!5>vs z]&.w5U-޷/?Gp~{A" ϟNj/d2J;xJ؉l˿0Aq֭[Kn݃kfggFH:;>y T='\eg9Bf%@o&a#%㑍}3EU"5+Wo29> yV><ϷtUUBus[woVTp Mvod2m۶+bk+,j>vqXsE\ͻ4ݛWvLϦo+$=:p 4z34UZJ}]$/^t޳s}m>GvqNJ>&hx19nO]r9\rGP0Wz+b1yhf>o$]?2::H$~Ձ& - _týl}LƬacʼn'N4&qܟ>|X@}A^tvw;lZchK:Е,*73gQVھ_s9Ep`nQݷD ?FS e@)H.[زΏfr݅rmY9|>sVdk}>qҘf`t p52N8sΙ^x<>p@LES077T*e&99ÇW:p`&T[Ӄ6@0t8t5T$_WPזW(|1\ o*ϊPw89a@(|=_ \uJ<[9k pb6JnmzJc166HٳիW+E y op0H 7 IDAT]M@e2+T*6r/J_E_1鑄#$QKXD |:љj+\WU^W55\]WT-߭/;q}K|>]4(fB>ǫj߾bttpؑvw0sop0H!?tF"u]M뚐bS:٥h8}!~3.n Tw[zqHgd]]]-+b\ũ&[߮ /0;;3g L"}3Ž=zuVU̠!M)EP,FqT% PǵZ1 Rǝwo"ҹ2y:wnơwlC_gX x5}ϙLM(:D"|>=!LME S(>M$So` | : xX^ `&UĹY|6W&y85!m~c,l v߻8%t]ɤzi\t$V|"FFFL"bVĉHRCťң>!M@M7044亢%eXQ0,bb*SWxJeZ:!5@+.4DУTRҥKx;ѤuPǙ@|cΝy/PVc~~ I8V;In,wEW0I=hO:cǎaffU;n?ў|C?A ,XX059}3(4M31&lpδЍ.Cč0==mR[.fQ.͛^+uεlTJB:u:Ekx155J7͓zu]fjj 0my||d,=9E5^k}}G,LXT@q&\0_ӑgxo~: sKUU3Zٳgq%U{}Q{Jk>B)߿Ї*.^AT*arr\`Yx fՎ,N8|>T*F?CH}Q> /`k>&lhOX,brrϟ7k]׏Op\}=8x >1әi'Zf]Mn\(i{ 0a.38?>u`siO Js>b1Ȳn,D똜D\n[ϱt았 `ll ,OkoUUqi$ɥZ lByHZ}7eM3 ۮ[ Q|LT ssszK_R~//>OȔҧ)w8A޽p `ff\nI39jBعs'@&~J)Ν;iR)!.xln`; l]QVP@ CVM6j5eL9ɘ7y QJWG?nJ3=N+c;w4oNy/5[`كcddhԑ˸p9E><>>L6|+_u]?>}t\IAYӠ(YºTHox\RJ/YYGu9]G $I9If5C!FLc `x  s|f||{xh27 *^?t]c[lPSX0!3===l 2gY#~i!__p?kKRJ)G/u=<uf@ @,Ν;͜}6„&+)& BqMV*p  ͵(ˑ#Gxʗe/6,& 3U]ߠR,G}tz?=W0;v "aB;pg z[\ibΝ/„,EI;1;m0ŴՔeL& П~Cξ{? ࿹iJn>a¥r[`0q$&LRKEN`1B0!SJ؂* @bs+1(*rƖ0''r>xI3Nq BŦ0bvvldv҇[ ?d2\i,&u:&<0vaXoA 5>ܮV:ŚHXP(MP'6wnM-dlmDvtt{ORՐfqc1!~(6+_óx9Մt,evH$χBIPTH@D"J:]m/% !EA:6w*:Չ%Wr""ǹ\ 4 ہ@Hl,uott4{;wvj:[O0s&&&tY McX@ EQP*FWm655͍Zu^J(J؛PJ!2fxPV ޥ ' C[C#h$$I$Oرc>baa$ydYsp}upbѱjω>jz-Iz{{ I {{ttDC ֠ߌ[011q|ddeBؓA٬.,, uypjuj0BYnAMZ>(f|httt,t# c%YӃt: j\[vD"Q;A %FPJK8{7 .i*1`,LvVej\i Qۋ|>Q[E<8::D"Q|[?kpPM.tPkVTP׸d֌Fo<ϣ:K$ɷ !pnm$F$ŋn(oRJP(d Yq;#HÀMfh^B0a^$InSFD"qq=x@,㵫}Zg9\ȉ1A%,Y DE"oٕVQZzQUUiVZVUeRD ’Sm\] q=Hۜ^166QcqjB=y㭺/phhȱ9'\ u͹+>2>>Bk\Ju |>qŸ. `0>Hy<NE!v . S]M4]4i(( #ZrY+JZX2Nt:҅ GJWb1n g7u1kJ\boGuuuapp in`,xR/_w]ih@! \OBh8W3:??(333ޢMz$[p7z^p MGDi._Zvqq۰o߾jB)r˗/ss\_f`b懆[]]]B(`_$IEQ`Es^8y8 !moی(v" `)T~JF^UUU5@VjVSZ*|>r95J)W^UIZҵ^oY8!chh7tX,u"lݍO}>+ PJQ.H$կ~)ؓO>yuzkM(k.~xxXܲeńp8,]/ h^`8N ƪ/X4g7͠[4A" {Fz]JZeD %ͪ 299\rET*t-W|u]`1Ff]vvmXl:dn?Tav<444brlT‹/|;NOm||VY7" `sN_# %'ʲ,z<A$Q$QPEA7< c`gP+[Y7 U]7H@뚪(jVSժba(LFWfff/333mkD op__w!w9ݼ^{AooO&l!hMD###pm5Bo8~B^xꩧ m"x'+<^g뚒Q0曥={x=}}}h4D"@ |,˒,Y=$MEQe<{x8qyly={ly,dDDB;f`h&¢> Á<Ϣ( i|>" wH$y<GE(A< x K x83q'<1^2q^c p{-g{+!y !^dBq!Hv6LSnXL7ܢ0y Xc lV|۷i5MѨ=(8ՄK giۯMuaV<==YB"AY6 _ -A cccАX,&AƊ/J$(ƾ$qg9DIybbbv7:zz^"I'"KibՒ>go@)q'''q%TUY<ݻw7[ ^~e;H$ ,بvP$ Fn8j r쪿U7q ہot]iV4W5M^a$`j㺪UMjuUUcEQ^QE늢(JVSj TTrYj.S3JYujjJfW~ţCCCUޅtj"^R44eYF hh:uV`D&n"J鋆l7e^tVVi\FZkD"^zN}>(.IxtM4EQ4Q5ATUUUU#P8NyL%-R!:8x,鿌p㱙kS`b K6@T*JT2٬2??\zUVRcǎ}7)IcN'Ob׮]ۑjB]r`ƻc\xtMqpYNtl rqTfggi6/,,h-[n- jPH|Q^j$),VRy ୩he,c@VJ@VR-6?Ͱj՟J.S:??_UtMӮؗzsό.Z={ĩS{nȲl$Iرc&''V#Ny pi)J䤾}vu۶mJOOեa@@eYx<%IbuA(T.v0Rk-ޡh]b $:/.T3`vY~6l}C5j*RɤL&zN7oϾ|]w/ ~^ɓ'{n~l< Iy8%1brxc+y<m۶M|4eB}>o$ F "/q~1cv$ة'q"k Q[WE\l o}EQ4z} JT*f2,x->o0c߾}4 ;w4XzzzuVs`jWVl\.~Wl^L zzzh4*B!F 2xAXW s32lBl 4QԒ@% = V[\6 9L&+k UΝ;op~'Pʲ@4 7U ۴ӫ~'_7 韏wR&l9^ YkYbbMLLh cp8|>>$x< oh 9!,DlGkTŒ:\ YP]UU/(ވj^3@^6ղ٬^,)?r?8x|<OCK5rL`y1 0`}aPUU4FZ+^.RB@ ^ըÍzkM:@ .2G @$0AΝ;@2nZ[ /.3<^O/?:A1~Θy<NeN$b4%FyG,(pmf[pRP0-˨NM>RBؐdq}$I&C<,عs'D4VPef?3dYSѪjysa  8HR EQ(N6׾ skLkNs>{͒s4M328 &u|K/dرcp߿Vne{k܊7BnwM7݄[nŵJD4G?O~' Gyt5dz Rl[^Zj P(~VBv?P*fc}?T>)m5_6g 8o;/lfNȫW4MXlOj59I x <pRJȑ#?X @HcӁR_ze&,{{EQX/GetMضm 2Ģd2s̙3KEh =r+uy6|z~΀_oR(~`q,و}i'=zzV֓jE_n;@Z۾[Z8 ˗/u]n4-BPJg[k ֪BX+e`#]|D *2SU˖$5z@ e v^w-לW.W{RJ(?>Ses_ߌF[obM=mXtꄐ, TX< /{*F]ѯo`3+ZZh MKk뵚_o uz]l+ `~NLzZ#v"` X)RF ѻ:8. -I.]:Fz6FaWݍ,YLakEJXkaS~3ZV Xo\׮ oCo bXk]Z'-vh nƱ;&iVrfp-4t`S}dk ,zvG:6VБt#HG:ґt#HG:ґt#HG:ґt#HG:ґt#HG:ґt#i-?_4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.optional-dependencies] test = [ "pytest < 5.0.0", "pytest-cov[all]" ] [project.urls] homepage = "https://example.com" documentation = "https://readthedocs.org" repository = "https://github.com" changelog = "https://github.com/me/spam/blob/master/CHANGELOG.md" [project.scripts] spam-cli = "spam:main_cli" # One which depends on extras: foobar = "foomod:main_bar [bar,baz]" [project.gui-scripts] spam-gui = "spam:main_gui" [project.entry-points."spam.magical"] tomatoes = "spam:main_tomatoes" # pytest plugins refer to a module, so there is no ':obj' [project.entry-points.pytest11] nbval = "nbval.plugin" whey-0.0.24/doc-source/requirements.txt000066400000000000000000000007721442026364700201160ustar00rootroot00000000000000git+https://github.com/domdfcoding/sphinx-click.git git+https://github.com/sphinx-toolbox/sphinx-toolbox-experimental.git default-values>=0.5.0 extras-require>=0.2.0 furo>=2020.11.19b18 html-section>=0.1.0 seed-intersphinx-mapping>=0.3.1 sphinx>=3.0.3 sphinx-copybutton>=0.2.12 sphinx-debuginfo>=0.1.0 sphinx-licenseinfo>=0.1.1 sphinx-notfound-page>=0.7.1 sphinx-packaging>=0.1.0 sphinx-prompt>=1.1.0 sphinx-pyproject>=0.1.0 sphinx-tabs>=1.1.13 sphinx-toolbox>=3.0.0 sphinxemoji>=0.1.6 toctree-plus>=0.5.0 whey-0.0.24/example_pyproject.toml000066400000000000000000000022011442026364700172030ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" description = "Lovely Spam! Wonderful Spam!" readme = "README.rst" #requires-python = ">=3.8" license = {file = "LICENSE"} keywords = ["egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor"] dynamic = ["requires-python", "classifiers"] authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-ping Chung"} ] maintainers = [ {name = "Brett Cannon", email = "brett@python.org"} ] #classifiers = [ # "Development Status :: 4 - Beta", # "Programming Language :: Python" #] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.optional-dependencies] test = [ "pytest < 5.0.0", "pytest-cov[all]" ] doc = [ "sphinx>=3.0.3", ] [project.urls] homepage = "example.com" documentation = "readthedocs.org" repository = "github.com" changelog = "github.com/me/spam/blob/master/CHANGELOG.md" [project.scripts] spam-cli = "spam:main_cli" [project.gui-scripts] spam-gui = "spam:main_gui" [project.entry-points."spam.magical"] tomatoes = "spam:main_tomatoes" #grapes = 123 [tool.whey] python-versions = ["3.6", "3.7", "3.9"] whey-0.0.24/formate.toml000066400000000000000000000023361442026364700151170ustar00rootroot00000000000000[hooks] dynamic_quotes = 10 collections-import-rewrite = 20 reformat-generics = 40 noqa-reformat = 60 ellipsis-reformat = 70 squish_stubs = 80 [config] indent = "\t" line_length = 115 [hooks.yapf] priority = 30 [hooks.isort] priority = 50 [hooks.yapf.kwargs] yapf_style = ".style.yapf" [hooks.isort.kwargs] indent = "\t\t" multi_line_output = 8 import_heading_stdlib = "stdlib" import_heading_thirdparty = "3rd party" import_heading_firstparty = "this package" import_heading_localfolder = "this package" balanced_wrapping = false lines_between_types = 0 use_parentheses = true remove_redundant_aliases = true default_section = "THIRDPARTY" known_third_party = [ "apeye", "backports_entry_points_selectable", "click", "coincidence", "consolekit", "coverage", "coverage_pyver_pragma", "dist_meta", "dom_toml", "domdf_python_tools", "editables", "email_validator", "first", "handy_archives", "importlib_metadata", "natsort", "packaging", "pyproject_parser", "pytest", "pytest_cov", "pytest_randomly", "pytest_timeout", "re_assert", "readme_renderer", "shippinglabel", "toml", "whey_conda", "whey_pth", ] known_first_party = "whey" whey-0.0.24/justfile000066400000000000000000000005731442026364700143360ustar00rootroot00000000000000default: lint pdf-docs: latex-docs make -C doc-source/build/latex/ latex-docs: SPHINX_BUILDER=latex tox -e docs unused-imports: tox -e lint -- --select F401 incomplete-defs: tox -e lint -- --select MAN vdiff: git diff $(repo-helper show version -q)..HEAD bare-ignore: greppy '# type:? *ignore(?!\[|\w)' -s lint: unused-imports incomplete-defs bare-ignore tox -n qa whey-0.0.24/pyproject.toml000066400000000000000000000124571442026364700155060ustar00rootroot00000000000000[build-system] requires = [ "setuptools!=61.*,>=40.6.0", "wheel>=0.34.2",] build-backend = "setuptools.build_meta" [project] name = "whey" version = "0.0.24" description = "A simple Python wheel builder for simple projects." readme = "README.rst" requires-python = ">=3.6.1" keywords = [ "build", "distribution", "packaging", "pep517", "pep621", "sdist", "wheel",] classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Typing :: Typed", ] dynamic = [ "dependencies",] [[project.authors]] name = "Dominic Davis-Foster" email = "dominic@davis-foster.co.uk" [project.license] file = "LICENSE" [project.urls] Homepage = "https://github.com/repo-helper/whey" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" Documentation = "https://whey.readthedocs.io/en/latest" [project.scripts] whey = "whey.__main__:main" [project.optional-dependencies] readme = [ "docutils==0.16", "pyproject-parser[readme]>=0.6.0",] editable = [ "editables>=0.2",] all = [ "docutils==0.16", "editables>=0.2", "pyproject-parser[readme]>=0.6.0",] [tool.mkrecipe] conda-channels = [ "conda-forge", "domdfcoding",] extras = [] license-key = "MIT" [tool.sphinx-pyproject] github_username = "repo-helper" github_repository = "whey" author = "Dominic Davis-Foster" project = "whey" copyright = "2021 Dominic Davis-Foster" language = "en" package_root = "whey" extensions = [ "sphinx_toolbox", "sphinx_toolbox.more_autodoc", "sphinx_toolbox.more_autosummary", "sphinx_toolbox.documentation_summary", "sphinx_toolbox.tweaks.param_dash", "sphinxcontrib.toctree_plus", "sphinx_toolbox.tweaks.latex_layout", "sphinx_toolbox.tweaks.latex_toc", "sphinx.ext.intersphinx", "sphinx.ext.mathjax", "sphinxcontrib.extras_require", "sphinx.ext.todo", "sphinxemoji.sphinxemoji", "notfound.extension", "sphinx_copybutton", "sphinxcontrib.default_values", "sphinx_debuginfo", "sphinx_licenseinfo", "seed_intersphinx_mapping", "html_section", "cli_extension", "sphinx_toolbox.more_autosummary.column_widths", "sphinx_toolbox_experimental.download_icon", "sphinx_packaging", "local_extension", ] sphinxemoji_style = "twemoji" gitstamp_fmt = "%d %b %Y" templates_path = [ "_templates",] html_static_path = [ "_static",] source_suffix = ".rst" master_doc = "index" suppress_warnings = [ "image.nonlocal_uri",] pygments_style = "default" html_theme = "furo" html_theme_path = [ "../..",] html_show_sourcelink = true toctree_plus_types = [ "class", "confval", "data", "directive", "enum", "exception", "flag", "function", "namedtuple", "protocol", "role", "typeddict", ] add_module_names = false hide_none_rtype = true all_typevars = true overloads_location = "bottom" html_codeblock_linenos_style = "table" autodoc_exclude_members = [ "__dict__", "__class__", "__dir__", "__weakref__", "__module__", "__annotations__", "__orig_bases__", "__parameters__", "__subclasshook__", "__init_subclass__", "__attrs_attrs__", "__init__", "__new__", "__getnewargs__", "__abstractmethods__", "__hash__", ] [tool.whey] base-classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Typing :: Typed", ] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10", "3.11",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" [tool.mypy] python_version = "3.8" namespace_packages = true check_untyped_defs = true warn_unused_ignores = true no_implicit_optional = true show_error_codes = true [tool.snippet-fmt] directives = [ "code-block",] [tool.setuptools] zip-safe = false include-package-data = true platforms = [ "Windows", "macOS", "Linux",] [project.entry-points."whey.builder"] whey_sdist = "whey.builder:SDistBuilder" whey_wheel = "whey.builder:WheelBuilder" [tool.dependency-dash."requirements.txt"] order = 10 [tool.dependency-dash."tests/requirements.txt"] order = 20 include = false [tool.dependency-dash."doc-source/requirements.txt"] order = 30 include = false [tool.snippet-fmt.languages.python] reformat = true [tool.snippet-fmt.languages.toml] [tool.snippet-fmt.languages.TOML] reformat = true [tool.snippet-fmt.languages.ini] [tool.snippet-fmt.languages.json] whey-0.0.24/repo_helper.yml000066400000000000000000000034711442026364700156150ustar00rootroot00000000000000# Configuration for 'repo_helper' (https://github.com/domdfcoding/repo_helper) --- modname: 'whey' copyright_years: '2021' author: 'Dominic Davis-Foster' email: 'dominic@davis-foster.co.uk' username: 'repo-helper' assignee: 'domdfcoding' primary_conda_channel: "domdfcoding" version: '0.0.24' license: 'MIT' short_desc: 'A simple Python wheel builder for simple projects.' python_deploy_version: 3.8 min_coverage: 95 docs_fail_on_warning: true sphinx_html_theme: furo tox_testenv_extras: all on_conda_forge: true conda_channels: - conda-forge conda_extras: - none # Versions to run tests for python_versions: - '3.6' - '3.7' - '3.8' - '3.9' - "3.10" - "3.11" - 3.12-dev - pypy36 - pypy37 - pypy38 - pypy39 sphinx_conf_epilogue: - nitpicky = True - toml_spec_version = "0.5.0" - toctree_plus_types.add("tconf") - toctree_plus_types.add("envvar") - needspace_amount = "4\\baselineskip" - latex_elements["preamble"] = "\\usepackage{multicol}" - tconf_show_full_name = False console_scripts: - whey = whey.__main__:main extra_sphinx_extensions: - cli_extension - sphinx_toolbox.more_autosummary.column_widths - sphinx_toolbox_experimental.download_icon - sphinx_packaging - local_extension classifiers: - 'Development Status :: 3 - Alpha' - 'Environment :: Console' - 'Intended Audience :: Developers' - 'Topic :: Software Development :: Libraries :: Python Modules' - "Topic :: Software Development :: Build Tools" - "Topic :: System :: Archiving :: Packaging" keywords: - pep517 - pep621 - build - sdist - wheel - packaging - distribution entry_points: whey.builder: - "whey_sdist = whey.builder:SDistBuilder" - "whey_wheel = whey.builder:WheelBuilder" extras_require: readme: - pyproject-parser[readme]>=0.6.0 - docutils==0.16 editable: - editables>=0.2 exclude_files: - contributing whey-0.0.24/requirements.txt000066400000000000000000000002751442026364700160510ustar00rootroot00000000000000click>=7.1.2 consolekit>=1.4.1 dist-meta>=0.1.0 dom-toml>=0.4.0 domdf-python-tools>=2.8.0 handy-archives>=0.1.0 natsort>=7.1.1 packaging>=20.9 pyproject-parser>=0.6.0 shippinglabel>=0.16.0 whey-0.0.24/setup.cfg000066400000000000000000000036541442026364700144120ustar00rootroot00000000000000# This file is managed by 'repo_helper'. # You may add new sections, but any changes made to the following sections will be lost: # * metadata # * options # * options.packages.find # * mypy # * options.entry_points [metadata] name = whey version = 0.0.24 author = Dominic Davis-Foster author_email = dominic@davis-foster.co.uk license = MIT License keywords = pep517, pep621, build, sdist, wheel, packaging, distribution long_description = file: README.rst long_description_content_type = text/x-rst platforms = Windows, macOS, Linux url = https://github.com/repo-helper/whey project_urls = Documentation = https://whey.readthedocs.io/en/latest Issue Tracker = https://github.com/repo-helper/whey/issues Source Code = https://github.com/repo-helper/whey classifiers = Development Status :: 3 - Alpha Environment :: Console Intended Audience :: Developers License :: OSI Approved :: MIT License Operating System :: OS Independent Programming Language :: Python Programming Language :: Python :: 3 :: Only Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: PyPy Topic :: Software Development :: Build Tools Topic :: Software Development :: Libraries :: Python Modules Topic :: System :: Archiving :: Packaging Typing :: Typed [options] python_requires = >=3.6.1 zip_safe = False include_package_data = True packages = find: [options.packages.find] exclude = doc-source tests tests.* [options.entry_points] console_scripts = whey = whey.__main__:main whey.builder = whey_sdist = whey.builder:SDistBuilder whey_wheel = whey.builder:WheelBuilder whey-0.0.24/setup.py000066400000000000000000000012071442026364700142730ustar00rootroot00000000000000#!/usr/bin/env python # This file is managed by 'repo_helper'. Don't edit it directly. # stdlib import pathlib import shutil import sys # 3rd party from setuptools import setup sys.path.append('.') # this package from __pkginfo__ import * # pylint: disable=wildcard-import repo_root = pathlib.Path(__file__).parent install_requires = (repo_root / "requirements.txt").read_text(encoding="UTF-8").split('\n') setup( description="A simple Python wheel builder for simple projects.", extras_require=extras_require, install_requires=install_requires, name="whey", py_modules=[], ) shutil.rmtree("whey.egg-info", ignore_errors=True) whey-0.0.24/stubs.txt000066400000000000000000000003421442026364700144610ustar00rootroot00000000000000git+https://github.com/domdfcoding/pytest-regressions-stubs git+https://github.com/domdfcoding/natsort-stubs git+https://github.com/repo-helper/appdirs-stubs git+https://github.com/repo-helper/toml@py.typed types-first>=0.1.5 whey-0.0.24/tests/000077500000000000000000000000001442026364700137235ustar00rootroot00000000000000whey-0.0.24/tests/__init__.py000066400000000000000000000000001442026364700160220ustar00rootroot00000000000000whey-0.0.24/tests/conftest.py000066400000000000000000000042741442026364700161310ustar00rootroot00000000000000# stdlib from typing import Callable, Type, TypeVar, Union # 3rd party import pytest from packaging.markers import Marker from packaging.requirements import Requirement from packaging.specifiers import SpecifierSet from packaging.version import Version from pyproject_examples.example_configs import ( AUTHORS, CLASSIFIERS, DEPENDENCIES, ENTRY_POINTS, KEYWORDS, MAINTAINERS, MINIMAL_CONFIG, OPTIONAL_DEPENDENCIES, UNICODE, URLS ) from pyproject_parser.classes import License, Readme from pytest_regressions.data_regression import RegressionYamlDumper _C = TypeVar("_C", bound=Callable) pytest_plugins = ("coincidence", ) def _representer_for(*data_type: Type) -> Callable[[_C], _C]: def deco(representer_fn: _C) -> _C: for dtype in data_type: RegressionYamlDumper.add_custom_yaml_representer(dtype, representer_fn) return representer_fn return deco @_representer_for(str, Version, Requirement, Marker, SpecifierSet) def represent_packaging_types( # noqa: MAN002 dumper: RegressionYamlDumper, data: Union[Version, Requirement, Marker, SpecifierSet], ): return dumper.represent_str(str(data)) @_representer_for(Readme, License) def represent_readme_or_license( # noqa: MAN002 dumper: RegressionYamlDumper, data: Union[Readme, License], ): return dumper.represent_dict(data.to_dict()) @pytest.fixture( params=[ pytest.param(MINIMAL_CONFIG, id="minimal"), pytest.param(f'{MINIMAL_CONFIG}\ndescription = "Lovely Spam! Wonderful Spam!"', id="description"), pytest.param(f'{MINIMAL_CONFIG}\nrequires-python = ">=3.8"', id="requires-python"), pytest.param( f'{MINIMAL_CONFIG}\nrequires-python = ">=2.7,!=3.0.*,!=3.2.*"', id="requires-python_complex" ), pytest.param(KEYWORDS, id="keywords"), pytest.param(AUTHORS, id="authors"), pytest.param(MAINTAINERS, id="maintainers"), pytest.param(CLASSIFIERS, id="classifiers"), pytest.param(DEPENDENCIES, id="dependencies"), pytest.param(OPTIONAL_DEPENDENCIES, id="optional-dependencies"), pytest.param(URLS, id="urls"), pytest.param(ENTRY_POINTS, id="entry_points"), pytest.param(UNICODE, id="unicode"), ] ) def good_config(request) -> str: return request.param whey-0.0.24/tests/example_configs.py000066400000000000000000000042641442026364700174460ustar00rootroot00000000000000COMPLETE_A = """\ [build-system] requires = [ "whey",] build-backend = "whey" [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python",] readme = "README.rst" dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.license] file = "LICENSE" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" """ COMPLETE_B = """\ [build-system] requires = [ "whey",] build-backend = "whey" [project] name = "Whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." readme = "README.rst" keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python",] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.license] file = "LICENSE" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" "Home Page" = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" package = "whey" """ whey-0.0.24/tests/requirements.txt000066400000000000000000000004661442026364700172150ustar00rootroot00000000000000git+https://github.com/repo-helper/pyproject-examples coincidence>=0.2.0 coverage>=5.1 coverage-pyver-pragma>=0.2.1 editables>=0.2 importlib-metadata>=3.6.0 iniconfig!=1.1.0,>=1.0.1 pytest>=6.0.0 pytest-cov>=2.8.1 pytest-randomly>=3.7.0 pytest-timeout>=1.4.2 re-assert>=1.1.0 whey-conda>=0.1.0 whey-pth>=0.0.4 whey-0.0.24/tests/test_build.py000066400000000000000000001236431442026364700164440ustar00rootroot00000000000000# stdlib import os import shutil import sys import tempfile from base64 import urlsafe_b64encode from datetime import datetime from typing import TYPE_CHECKING, Any, Dict, List # 3rd party import handy_archives import pytest from coincidence.regressions import AdvancedDataRegressionFixture, AdvancedFileRegressionFixture from coincidence.selectors import min_version, only_version from domdf_python_tools.paths import PathPlus, compare_dirs from pyproject_examples.example_configs import DYNAMIC_REQUIREMENTS, LONG_REQUIREMENTS, MINIMAL_CONFIG from shippinglabel.checksum import get_sha256_hash # this package import whey from tests.example_configs import COMPLETE_A, COMPLETE_B from whey.builder import SDistBuilder, WheelBuilder from whey.config import load_toml if TYPE_CHECKING: # 3rd party from _pytest.capture import CaptureFixture @pytest.fixture() def fixed_whey_version(monkeypatch) -> None: monkeypatch.setattr(whey, "__version__", "0.0.17") def test_build_success( good_config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(good_config) (tmp_pathplus / "spam").mkdir() (tmp_pathplus / "spam" / "__init__.py").write_clean("print('hello world')") now = datetime.now() os.utime(tmp_pathplus / "spam" / "__init__.py", (now.timestamp(), now.timestamp())) data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = zip_file.namelist() assert zip_file.read_text("spam/__init__.py") == "print('hello world')\n" advanced_file_regression.check(zip_file.read_text("spam-2020.0.0.dist-info/METADATA")) # The seconds can vary by 1 second between the mtime and the time in the zip, but this is inconsistent assert zip_file.getinfo("spam/__init__.py").date_time[:5] == now.timetuple()[:5] with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("spam-2020.0.0/spam/__init__.py") == "print('hello world')\n" advanced_file_regression.check(tar.read_text("spam-2020.0.0/PKG-INFO")) advanced_file_regression.check(tar.read_text("spam-2020.0.0/pyproject.toml"), extension=".toml") outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) def check_built_wheel(filename: PathPlus, advanced_file_regression: AdvancedFileRegressionFixture) -> List[str]: assert filename.is_file() with handy_archives.ZipFile(filename) as zip_file: assert zip_file.read_text("whey/__init__.py") == "print('hello world')\n" advanced_file_regression.check(zip_file.read_text("whey-2021.0.0.dist-info/METADATA")) advanced_file_regression.check(zip_file.read_text("whey-2021.0.0.dist-info/RECORD"), extension=".RECORD") contents = zip_file.namelist() with zip_file.open("whey-2021.0.0.dist-info/RECORD", mode='r') as record_fp: for line in record_fp.readlines(): entry_filename, expected_digest, size, *_ = line.decode("UTF-8").strip().split(',') assert entry_filename in contents, entry_filename contents.remove(entry_filename) if "RECORD" not in entry_filename: assert zip_file.getinfo(entry_filename).file_size == int(size) with zip_file.open(entry_filename) as fp: sha256_hash = get_sha256_hash(fp) digest = "sha256=" + urlsafe_b64encode(sha256_hash.digest()).decode("latin1").rstrip('=') assert expected_digest == digest return zip_file.namelist() @pytest.mark.usefixtures("fixed_whey_version") @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), pytest.param(LONG_REQUIREMENTS, id="LONG_REQUIREMENTS"), ] ) def test_build_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel, advanced_file_regression) with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world')\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" advanced_file_regression.check(tar.read_text("whey-2021.0.0/PKG-INFO")) advanced_file_regression.check(tar.read_text("whey-2021.0.0/pyproject.toml"), extension=".toml") outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.usefixtures("fixed_whey_version") @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), pytest.param(LONG_REQUIREMENTS, id="LONG_REQUIREMENTS"), ] ) def test_build_complete_epoch( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", monkeypatch, ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") monkeypatch.setenv("SOURCE_DATE_EPOCH", "1629644172") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel, advanced_file_regression) with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: for filename in data["wheel_content"]: assert zip_file.getinfo(filename).date_time == (2021, 8, 22, 14, 56, 12) outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), pytest.param(LONG_REQUIREMENTS, id="LONG_REQUIREMENTS"), ] ) @pytest.mark.parametrize( "editables_version", [ pytest.param("0.2", marks=only_version("3.6")), pytest.param("0.3", marks=min_version("3.7")), ] ) def test_build_editable( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", editables_version: str ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_editable() assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = zip_file.namelist() data["pth"] = zip_file.read_text("whey.pth") if sys.version_info >= (3, 7): data["code"] = zip_file.read_text("_editable_impl_whey.py").replace(tmp_pathplus.as_posix(), "...") else: data["code"] = zip_file.read_text("_whey.py").replace(tmp_pathplus.as_posix(), "...") advanced_file_regression.check(zip_file.read_text("whey-2021.0.0.dist-info/METADATA")) contents = zip_file.namelist() with zip_file.open("whey-2021.0.0.dist-info/RECORD", mode='r') as record_fp: for line in record_fp.readlines(): entry_filename, expected_digest, size, *_ = line.decode("UTF-8").strip().split(',') assert entry_filename in contents, entry_filename contents.remove(entry_filename) if "RECORD" not in entry_filename: assert zip_file.getinfo(entry_filename).file_size == int(size) with zip_file.open(entry_filename) as fp: sha256_hash = get_sha256_hash(fp) digest = "sha256=" + urlsafe_b64encode(sha256_hash.digest()).decode("latin1").rstrip('=') assert expected_digest == digest outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) NAMESPACE = """\ [build-system] requires = [ "whey",] build-backend = "whey" [project] name = "default_values" version = "0.5.0" description = "Sphinx extension to show default values in documentation." readme = "README.rst" keywords = [ "documentation", "sphinx",] dynamic = [ "classifiers", "requires-python",] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.license] file = "LICENSE" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" package = "sphinxcontrib" """ def test_build_editable_namespace( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(NAMESPACE) (tmp_pathplus / "sphinxcontrib/default_values").mkdir(parents=True) (tmp_pathplus / "sphinxcontrib/default_values" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_editable() assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = zip_file.namelist() assert zip_file.read_text("default_values.pth") == str(tmp_pathplus) + '\n' advanced_file_regression.check(zip_file.read_text("default_values-0.5.0.dist-info/METADATA")) contents = zip_file.namelist() with zip_file.open("default_values-0.5.0.dist-info/RECORD", mode='r') as record_fp: for line in record_fp.readlines(): entry_filename, expected_digest, size, *_ = line.decode("UTF-8").strip().split(',') assert entry_filename in contents, entry_filename contents.remove(entry_filename) if "RECORD" not in entry_filename: assert zip_file.getinfo(entry_filename).file_size == int(size) with zip_file.open(entry_filename) as fp: sha256_hash = get_sha256_hash(fp) digest = "sha256=" + urlsafe_b64encode(sha256_hash.digest()).decode("latin1").rstrip('=') assert expected_digest == digest outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) def test_build_additional_files( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_lines([ COMPLETE_B, '', "additional-files = [", ' "include whey/style.css",', ' "exclude whey/style.css",', ' "include whey/style.css",', ' "recursive-include whey/static *",', ' "recursive-exclude whey/static *.txt",', ']', ]) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "whey" / "style.css").write_clean("This is the style.css file") (tmp_pathplus / "whey" / "static").mkdir() (tmp_pathplus / "whey" / "static" / "foo.py").touch() (tmp_pathplus / "whey" / "static" / "foo.c").touch() (tmp_pathplus / "whey" / "static" / "foo.txt").touch() (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = zip_file.namelist() assert zip_file.read_text("whey/__init__.py") == "print('hello world')\n" assert zip_file.read_text("whey/style.css") == "This is the style.css file\n" advanced_file_regression.check(zip_file.read_text("whey-2021.0.0.dist-info/METADATA")) with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world')\n" assert tar.read_text("whey-2021.0.0/whey/style.css") == "This is the style.css file\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.usefixtures("fixed_whey_version") def test_build_markdown_readme( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(COMPLETE_B.replace(".rst", ".md")) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.md").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel, advanced_file_regression) with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world')\n" assert tar.read_text("whey-2021.0.0/README.md") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) def test_build_missing_dir(tmp_pathplus: PathPlus): (tmp_pathplus / "pyproject.toml").write_clean(MINIMAL_CONFIG) with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) with pytest.raises(FileNotFoundError, match="Package directory 'spam' not found."): wheel_builder.build_wheel() with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) with pytest.raises(FileNotFoundError, match="Package directory 'spam' not found."): sdist_builder.build_sdist() def test_build_empty_dir(tmp_pathplus: PathPlus): (tmp_pathplus / "pyproject.toml").write_clean(MINIMAL_CONFIG) (tmp_pathplus / "spam").mkdir() with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) with pytest.raises(FileNotFoundError, match="No Python source files found in"): wheel_builder.build_wheel() with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) with pytest.raises(FileNotFoundError, match="No Python source files found in"): sdist_builder.build_sdist() def test_build_editable_missing_dir(tmp_pathplus: PathPlus): (tmp_pathplus / "pyproject.toml").write_clean(MINIMAL_CONFIG) with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) with pytest.raises(FileNotFoundError, match="Package directory 'spam' not found."): wheel_builder.build_editable() @pytest.mark.usefixtures("fixed_whey_version") @pytest.mark.parametrize( "config", [ pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), pytest.param(DYNAMIC_REQUIREMENTS, id="DYNAMIC_REQUIREMENTS"), pytest.param(LONG_REQUIREMENTS, id="LONG_REQUIREMENTS"), ] ) def test_build_wheel_from_sdist( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_lines([ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ]) # Build the sdist with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() # unpack sdist into another tmpdir and use that as project_dir (tmp_pathplus / "sdist_unpacked").mkdir() with handy_archives.TarFile.open(tmp_pathplus / sdist) as sdist_tar: sdist_tar.extractall(path=tmp_pathplus / "sdist_unpacked") capsys.readouterr() data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus / "sdist_unpacked/whey-2021.0.0/", config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel, advanced_file_regression) outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.parametrize( "config", [ pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_build_wheel_reproducible( config: str, tmp_pathplus: PathPlus, ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") # Build the wheel twice with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus / "wheel1", verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) wheel = wheel_builder.build_wheel() assert (tmp_pathplus / "wheel1" / wheel).is_file() with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus / "wheel2", verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) wheel = wheel_builder.build_wheel() assert (tmp_pathplus / "wheel2" / wheel).is_file() # extract both shutil.unpack_archive( str(tmp_pathplus / "wheel1" / wheel), extract_dir=tmp_pathplus / "wheel1" / "unpack", format="zip", ) shutil.unpack_archive( str(tmp_pathplus / "wheel1" / wheel), extract_dir=tmp_pathplus / "wheel2" / "unpack", format="zip", ) # (tmp_pathplus / "wheel2" / "unpack" / "foo.txt").touch() assert compare_dirs( tmp_pathplus / "wheel1" / "unpack", tmp_pathplus / "wheel2" / "unpack", ) @pytest.mark.parametrize( "config", [ pytest.param( ["[project]", 'name = "spam_spam"', 'version = "2020.0.0"'], id="underscore_name", ), pytest.param( ["[project]", 'name = "spam-spam"', 'version = "2020.0.0"'], id="hyphen_name_underscore_package_implicit", ), pytest.param([ "[project]", 'name = "spam-spam"', 'version = "2020.0.0"', "[tool.whey]", "package = 'spam_spam'" ], id="hyphen_name_underscore_package_explicit"), ] ) def test_build_underscore_name( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", config: List[str] ): (tmp_pathplus / "pyproject.toml").write_lines(config) (tmp_pathplus / "spam_spam").mkdir() (tmp_pathplus / "spam_spam" / "__init__.py").write_clean("print('hello world')") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) wheel = wheel_builder.build_wheel() assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = zip_file.namelist() assert zip_file.read_text("spam_spam/__init__.py") == "print('hello world')\n" advanced_file_regression.check(zip_file.read_text("spam_spam-2020.0.0.dist-info/METADATA")) with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("spam_spam-2020.0.0/spam_spam/__init__.py") == "print('hello world')\n" advanced_file_regression.check(tar.read_text("spam_spam-2020.0.0/PKG-INFO")) outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) def test_build_stubs_name( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_lines([ "[project]", 'name = "spam_spam-stubs"', 'version = "2020.0.0"', ]) (tmp_pathplus / "spam_spam-stubs").mkdir() (tmp_pathplus / "spam_spam-stubs" / "__init__.pyi").write_clean("print('hello world')") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) wheel = wheel_builder.build_wheel() assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = zip_file.namelist() assert zip_file.read_text("spam_spam-stubs/__init__.pyi") == "print('hello world')\n" advanced_file_regression.check(zip_file.read_text("spam_spam_stubs-2020.0.0.dist-info/METADATA")) with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text( "spam_spam_stubs-2020.0.0/spam_spam-stubs/__init__.pyi" ) == "print('hello world')\n" advanced_file_regression.check(tar.read_text("spam_spam_stubs-2020.0.0/PKG-INFO")) outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) # TODO: test some bad configurations @pytest.mark.usefixtures("fixed_whey_version") @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(f"{COMPLETE_A}\nsource-dir = 'src'", id="COMPLETE_A"), pytest.param(f"{COMPLETE_B}\nsource-dir = 'src'", id="COMPLETE_B"), # pytest.param(LONG_REQUIREMENTS, id="LONG_REQUIREMENTS"), ] ) def test_build_source_dir_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "src/whey").mkdir(parents=True) (tmp_pathplus / "src/whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel, advanced_file_regression) with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/src/whey/__init__.py") == "print('hello world')\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" advanced_file_regression.check(tar.read_text("whey-2021.0.0/PKG-INFO")) advanced_file_regression.check(tar.read_text("whey-2021.0.0/pyproject.toml"), extension=".toml") outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.usefixtures("fixed_whey_version") def test_build_source_dir_different_package( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_lines([ COMPLETE_A, "source-dir = 'src'", "package = 'SpamSpam'", ]) (tmp_pathplus / "src/SpamSpam").mkdir(parents=True) (tmp_pathplus / "src/SpamSpam" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: assert zip_file.read_text("SpamSpam/__init__.py") == "print('hello world')\n" advanced_file_regression.check(zip_file.read_text("whey-2021.0.0.dist-info/METADATA")) advanced_file_regression.check( zip_file.read_text("whey-2021.0.0.dist-info/RECORD"), extension=".RECORD", ) contents = zip_file.namelist() with zip_file.open("whey-2021.0.0.dist-info/RECORD", mode='r') as record_: for line in record_.readlines(): entry_filename, expected_digest, size, *_ = line.decode("UTF-8").strip().split(',') assert entry_filename in contents, entry_filename contents.remove(entry_filename) if "RECORD" not in entry_filename: assert zip_file.getinfo(entry_filename).file_size == int(size) with zip_file.open(entry_filename) as fp: sha256_hash = get_sha256_hash(fp) digest = "sha256=" + urlsafe_b64encode(sha256_hash.digest()).decode("latin1").rstrip('=') assert expected_digest == digest data["wheel_content"] = zip_file.namelist() with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/src/SpamSpam/__init__.py") == "print('hello world')\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" advanced_file_regression.check(tar.read_text("whey-2021.0.0/PKG-INFO")) advanced_file_regression.check(tar.read_text("whey-2021.0.0/pyproject.toml"), extension=".toml") outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.usefixtures("fixed_whey_version") @pytest.mark.parametrize( "config", [ pytest.param(f"{COMPLETE_A}\nsource-dir = 'src'", id="COMPLETE_A"), pytest.param(f"{COMPLETE_B}\nsource-dir = 'src'", id="COMPLETE_B"), # pytest.param(DYNAMIC_REQUIREMENTS, id="DYNAMIC_REQUIREMENTS"), # pytest.param(LONG_REQUIREMENTS, id="LONG_REQUIREMENTS"), ] ) def test_build_wheel_from_sdist_source_dir( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "src/whey").mkdir(parents=True) (tmp_pathplus / "src/whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_lines([ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ]) # Build the sdist with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() # unpack sdist into another tmpdir and use that as project_dir (tmp_pathplus / "sdist_unpacked").mkdir() with handy_archives.TarFile.open(tmp_pathplus / sdist) as sdist_tar: sdist_tar.extractall(path=tmp_pathplus / "sdist_unpacked") capsys.readouterr() data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus / "sdist_unpacked/whey-2021.0.0/", config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel, advanced_file_regression) outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) def test_build_additional_files_source_dir( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_lines([ COMPLETE_B, 'source-dir = "src"', "additional-files = [", ' "include src/whey/style.css",', ' "exclude src/whey/style.css",', ' "include src/whey/style.css",', ' "recursive-include src/whey/static *",', ' "recursive-exclude src/whey/static *.txt",', ']', ]) (tmp_pathplus / "src/whey").mkdir(parents=True) (tmp_pathplus / "src/whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "src/whey" / "style.css").write_clean("This is the style.css file") (tmp_pathplus / "src/whey" / "static").mkdir() (tmp_pathplus / "src/whey" / "static" / "foo.py").touch() (tmp_pathplus / "src/whey" / "static" / "foo.c").touch() (tmp_pathplus / "src/whey" / "static" / "foo.txt").touch() (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = zip_file.namelist() assert zip_file.read_text("whey/__init__.py") == "print('hello world')\n" assert zip_file.read_text("whey/style.css") == "This is the style.css file\n" advanced_file_regression.check(zip_file.read_text("whey-2021.0.0.dist-info/METADATA")) with tempfile.TemporaryDirectory() as tmpdir: sdist_builder = SDistBuilder( project_dir=tmp_pathplus, build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, config=load_toml(tmp_pathplus / "pyproject.toml"), ) sdist = sdist_builder.build_sdist() assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/src/whey/__init__.py") == "print('hello world')\n" assert tar.read_text("whey-2021.0.0/src/whey/style.css") == "This is the style.css file\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.usefixtures("fixed_whey_version") @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), pytest.param(LONG_REQUIREMENTS, id="LONG_REQUIREMENTS"), ] ) def test_custom_wheel_builder( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world')") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} class CustomWheelBuilder(WheelBuilder): @property def generator(self) -> str: return "My Custom Builder v1.2.3" with tempfile.TemporaryDirectory() as tmpdir: wheel_builder = CustomWheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) wheel = wheel_builder.build_wheel() data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel, advanced_file_regression) with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: advanced_file_regression.check(zip_file.read_text("whey-2021.0.0.dist-info/WHEEL"), extension=".WHEEL") outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) whey-0.0.24/tests/test_build_/000077500000000000000000000000001442026364700162205ustar00rootroot00000000000000whey-0.0.24/tests/test_build_/test_build_additional_files.txt000066400000000000000000000027001442026364700244700ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_additional_files.yml000066400000000000000000000036221442026364700244560ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py - whey-2021.0.0/whey/static/foo.c - whey-2021.0.0/whey/static/foo.py - whey-2021.0.0/whey/style.css stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/style.css -> whey/style.css Removing whey/style.css Copying .../whey/style.css -> whey/style.css Copying .../whey/static/foo.c -> whey/static/foo.c Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/static/foo.txt -> whey/static/foo.txt Removing whey/static/foo.txt Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/style.css -> whey/style.css Removing whey/style.css Copying .../whey/style.css -> whey/style.css Copying .../whey/static/foo.c -> whey/static/foo.c Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/static/foo.txt -> whey/static/foo.txt Removing whey/static/foo.txt Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey/static/foo.c - whey/static/foo.py - whey/__init__.py - whey/style.css - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_additional_files_source_dir.txt000066400000000000000000000027001442026364700267060ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_additional_files_source_dir.yml000066400000000000000000000037311442026364700266750ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/src/whey/__init__.py - whey-2021.0.0/src/whey/static/foo.c - whey-2021.0.0/src/whey/static/foo.py - whey-2021.0.0/src/whey/style.css stderr: '' stdout: 'Copying .../src/whey/__init__.py -> whey/__init__.py Copying .../src/whey/static/foo.py -> whey/static/foo.py Copying .../src/whey/style.css -> whey/style.css Copying .../src/whey/style.css -> whey/style.css Copying .../src/whey/static/foo.c -> whey/static/foo.c Copying .../src/whey/static/foo.py -> whey/static/foo.py Copying .../src/whey/static/foo.txt -> whey/static/foo.txt Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../src/whey/__init__.py -> src/whey/__init__.py Copying .../src/whey/static/foo.py -> src/whey/static/foo.py Copying .../src/whey/style.css -> src/whey/style.css Removing src/whey/style.css Copying .../src/whey/style.css -> src/whey/style.css Copying .../src/whey/static/foo.c -> src/whey/static/foo.c Copying .../src/whey/static/foo.py -> src/whey/static/foo.py Copying .../src/whey/static/foo.txt -> src/whey/static/foo.txt Removing src/whey/static/foo.txt Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey/static/foo.c - whey/static/foo.py - whey/static/foo.txt - whey/__init__.py - whey/style.css - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_complete_COMPLETE_A_.RECORD000066400000000000000000000007111442026364700250340ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=8iiyYruvYnQXM7I-Boj7lpKCU2Pz8W1dy2Df1tBKXZ4,1410 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_complete_COMPLETE_A_.toml000066400000000000000000000031371442026364700250360ustar00rootroot00000000000000[build-system] requires = [ "whey",] build-backend = "whey" [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [] readme = "README.rst" dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'",] classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] requires-python = ">=3.6" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.license] file = "LICENSE" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" whey-0.0.24/tests/test_build_/test_build_complete_COMPLETE_A_.txt000066400000000000000000000026021442026364700246760ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_complete_COMPLETE_A_.yml000066400000000000000000000017761442026364700246730ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_complete_COMPLETE_B_.RECORD000066400000000000000000000007111442026364700250350ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=xxqX2zIgwxgUCE1VgQnMOY0DAgSa-ddnpQwzq9PpmMs,1472 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_complete_COMPLETE_B_.toml000066400000000000000000000032461442026364700250400ustar00rootroot00000000000000[build-system] requires = [ "whey",] build-backend = "whey" [project] name = "Whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." readme = "README.rst" keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'",] classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] requires-python = ">=3.6" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.license] file = "LICENSE" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" "Home Page" = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" package = "whey" whey-0.0.24/tests/test_build_/test_build_complete_COMPLETE_B_.txt000066400000000000000000000027001442026364700246760ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_complete_COMPLETE_B_.yml000066400000000000000000000017761442026364700246740ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_complete_LONG_REQUIREMENTS_.RECORD000066400000000000000000000007101442026364700261250ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=aIi772Rlduow__WeM1MGu1-lRRSnZmB5wcGTBk0ei50,658 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_complete_LONG_REQUIREMENTS_.toml000066400000000000000000000015031442026364700261230ustar00rootroot00000000000000[build-system] requires = [ "whey",] build-backend = "whey" [project] name = "Whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." readme = "README.rst" dynamic = [] requires-python = ">=3.6.1" dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'", "typed-ast>=1.4.2; python_version < '3.8' and platform_python_implementation == 'CPython'", ] classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Programming Language :: Python", ] [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.license] file = "LICENSE" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] license-key = "MIT" package = "whey" whey-0.0.24/tests/test_build_/test_build_complete_LONG_REQUIREMENTS_.txt000066400000000000000000000012221442026364700257650ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Requires-Python: >=3.6.1 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: typed-ast>=1.4.2; python_version < "3.8" and platform_python_implementation == "CPython" Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_complete_LONG_REQUIREMENTS_.yml000066400000000000000000000017761442026364700257650ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_complete_epoch_COMPLETE_A_.RECORD000066400000000000000000000007111442026364700262120ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=8iiyYruvYnQXM7I-Boj7lpKCU2Pz8W1dy2Df1tBKXZ4,1410 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_complete_epoch_COMPLETE_A_.txt000066400000000000000000000026021442026364700260540ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_complete_epoch_COMPLETE_A_.yml000066400000000000000000000010621442026364700260350ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_complete_epoch_COMPLETE_B_.RECORD000066400000000000000000000007111442026364700262130ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=xxqX2zIgwxgUCE1VgQnMOY0DAgSa-ddnpQwzq9PpmMs,1472 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_complete_epoch_COMPLETE_B_.txt000066400000000000000000000027001442026364700260540ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_complete_epoch_COMPLETE_B_.yml000066400000000000000000000010621442026364700260360ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_complete_epoch_LONG_REQUIREMENTS_.RECORD000066400000000000000000000007101442026364700273030ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=aIi772Rlduow__WeM1MGu1-lRRSnZmB5wcGTBk0ei50,658 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_complete_epoch_LONG_REQUIREMENTS_.txt000066400000000000000000000012221442026364700271430ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Requires-Python: >=3.6.1 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: typed-ast>=1.4.2; python_version < "3.8" and platform_python_implementation == "CPython" Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_complete_epoch_LONG_REQUIREMENTS_.yml000066400000000000000000000010621442026364700271270ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_editable_0_2_COMPLETE_A_.txt000066400000000000000000000027001442026364700252760ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Private :: Do Not Upload Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: editables Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_editable_0_2_COMPLETE_A_.yml000066400000000000000000000013101442026364700252540ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - _whey.py - whey.pth - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_editable_0_2_COMPLETE_B_.txt000066400000000000000000000027761442026364700253140ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Private :: Do Not Upload Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: editables Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_editable_0_2_COMPLETE_B_.yml000066400000000000000000000013101442026364700252550ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - _whey.py - whey.pth - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_editable_0_2_LONG_REQUIREMENTS_.txt000066400000000000000000000013201442026364700263650ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Private :: Do Not Upload Requires-Python: >=3.6.1 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: typed-ast>=1.4.2; python_version < "3.8" and platform_python_implementation == "CPython" Requires-Dist: editables Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_editable_0_2_LONG_REQUIREMENTS_.yml000066400000000000000000000013101442026364700263460ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - _whey.py - whey.pth - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_editable_0_3_COMPLETE_A_.txt000066400000000000000000000027001442026364700252770ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Private :: Do Not Upload Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: editables Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_editable_0_3_COMPLETE_A_.yml000066400000000000000000000013621442026364700252640ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _editable_impl_whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _editable_impl_whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - _editable_impl_whey.py - whey.pth - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_editable_0_3_COMPLETE_B_.txt000066400000000000000000000027761442026364700253150ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Private :: Do Not Upload Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: editables Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_editable_0_3_COMPLETE_B_.yml000066400000000000000000000013621442026364700252650ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _editable_impl_whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _editable_impl_whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - _editable_impl_whey.py - whey.pth - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_editable_0_3_LONG_REQUIREMENTS_.txt000066400000000000000000000013201442026364700263660ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Private :: Do Not Upload Requires-Python: >=3.6.1 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: typed-ast>=1.4.2; python_version < "3.8" and platform_python_implementation == "CPython" Requires-Dist: editables Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_editable_0_3_LONG_REQUIREMENTS_.yml000066400000000000000000000013621442026364700263560ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _editable_impl_whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _editable_impl_whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - _editable_impl_whey.py - whey.pth - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_editable_namespace.txt000066400000000000000000000026231442026364700247670ustar00rootroot00000000000000Metadata-Version: 2.1 Name: default-values Version: 0.5.0 Summary: Sphinx extension to show default values in documentation. Author-email: Dominic Davis-Foster License: MIT Keywords: documentation,sphinx Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Private :: Do Not Upload Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_editable_namespace.yml000066400000000000000000000011531442026364700247460ustar00rootroot00000000000000stderr: '' stdout: 'Writing default_values-0.5.0.dist-info/LICENSE Writing default_values-0.5.0.dist-info/entry_points.txt Writing default_values.pth Writing default_values-0.5.0.dist-info/METADATA Writing default_values-0.5.0.dist-info/WHEEL Writing default_values-0.5.0.dist-info/RECORD Wheel created at .../default_values-0.5.0-py3-none-any.whl ' wheel_content: - default_values-0.5.0.dist-info/LICENSE - default_values-0.5.0.dist-info/METADATA - default_values-0.5.0.dist-info/WHEEL - default_values-0.5.0.dist-info/entry_points.txt - default_values.pth - default_values-0.5.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_markdown_readme.RECORD000066400000000000000000000007111442026364700244740ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=eyQt4O3RCByHYj4jn2aDomLwANFKl9D9lUWorV_M8xg,1475 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_markdown_readme.txt000066400000000000000000000027031442026364700243400ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/markdown Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_markdown_readme.yml000066400000000000000000000017741442026364700243310ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.md - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.md Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_source_dir_complete_COMPLETE_A_.RECORD000066400000000000000000000007111442026364700272520ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=8iiyYruvYnQXM7I-Boj7lpKCU2Pz8W1dy2Df1tBKXZ4,1410 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_source_dir_complete_COMPLETE_A_.toml000066400000000000000000000031621442026364700272520ustar00rootroot00000000000000[build-system] requires = [ "whey",] build-backend = "whey" [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [] readme = "README.rst" dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'",] classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] requires-python = ">=3.6" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.license] file = "LICENSE" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" source-dir = "src" whey-0.0.24/tests/test_build_/test_build_source_dir_complete_COMPLETE_A_.txt000066400000000000000000000026021442026364700271140ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_source_dir_complete_COMPLETE_A_.yml000066400000000000000000000020161442026364700270750ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/src/whey/__init__.py stderr: '' stdout: 'Copying .../src/whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../src/whey/__init__.py -> src/whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_source_dir_complete_COMPLETE_B_.RECORD000066400000000000000000000007111442026364700272530ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=xxqX2zIgwxgUCE1VgQnMOY0DAgSa-ddnpQwzq9PpmMs,1472 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_source_dir_complete_COMPLETE_B_.toml000066400000000000000000000032711442026364700272540ustar00rootroot00000000000000[build-system] requires = [ "whey",] build-backend = "whey" [project] name = "Whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." readme = "README.rst" keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'",] classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] requires-python = ">=3.6" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.license] file = "LICENSE" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" "Home Page" = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" package = "whey" source-dir = "src" whey-0.0.24/tests/test_build_/test_build_source_dir_complete_COMPLETE_B_.txt000066400000000000000000000027001442026364700271140ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_source_dir_complete_COMPLETE_B_.yml000066400000000000000000000020161442026364700270760ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/src/whey/__init__.py stderr: '' stdout: 'Copying .../src/whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../src/whey/__init__.py -> src/whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_source_dir_different_package.RECORD000066400000000000000000000007151442026364700272000ustar00rootroot00000000000000SpamSpam/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=8iiyYruvYnQXM7I-Boj7lpKCU2Pz8W1dy2Df1tBKXZ4,1410 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_source_dir_different_package.toml000066400000000000000000000032071442026364700271740ustar00rootroot00000000000000[build-system] requires = [ "whey",] build-backend = "whey" [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [] readme = "README.rst" dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'",] classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] requires-python = ">=3.6" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.license] file = "LICENSE" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" source-dir = "src" package = "SpamSpam" whey-0.0.24/tests/test_build_/test_build_source_dir_different_package.txt000066400000000000000000000026021442026364700270360ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_source_dir_different_package.yml000066400000000000000000000020461442026364700270220ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/src/SpamSpam/__init__.py stderr: '' stdout: 'Copying .../src/SpamSpam/__init__.py -> SpamSpam/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../src/SpamSpam/__init__.py -> src/SpamSpam/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - SpamSpam/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_stubs_name.txt000066400000000000000000000000761442026364700233420ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam-spam-stubs Version: 2020.0.0 whey-0.0.24/tests/test_build_/test_build_stubs_name.yml000066400000000000000000000017271442026364700233300ustar00rootroot00000000000000sdist_content: - spam_spam_stubs-2020.0.0/PKG-INFO - spam_spam_stubs-2020.0.0/pyproject.toml - spam_spam_stubs-2020.0.0/spam_spam-stubs/__init__.pyi stderr: '' stdout: 'Copying .../spam_spam-stubs/__init__.pyi -> spam_spam-stubs/__init__.pyi Writing spam_spam_stubs-2020.0.0.dist-info/entry_points.txt Writing spam_spam_stubs-2020.0.0.dist-info/METADATA Writing spam_spam_stubs-2020.0.0.dist-info/WHEEL Writing spam_spam_stubs-2020.0.0.dist-info/RECORD Wheel created at .../spam_spam_stubs-2020.0.0-py3-none-any.whl Copying .../spam_spam-stubs/__init__.pyi -> spam_spam-stubs/__init__.pyi Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam_spam_stubs-2020.0.0.tar.gz ' wheel_content: - spam_spam-stubs/__init__.pyi - spam_spam_stubs-2020.0.0.dist-info/METADATA - spam_spam_stubs-2020.0.0.dist-info/WHEEL - spam_spam_stubs-2020.0.0.dist-info/entry_points.txt - spam_spam_stubs-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_authors_.toml000066400000000000000000000003241442026364700247060ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" dynamic = [] [[project.authors]] email = "hi@pradyunsg.me" [[project.authors]] name = "Tzu-Ping Chung" [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_authors_.txt000066400000000000000000000001211442026364700245450ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Author-email: hi@pradyunsg.me whey-0.0.24/tests/test_build_/test_build_success_authors_.yml000066400000000000000000000014001442026364700245300ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_classifiers_.toml000066400000000000000000000003141442026364700255270ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python",] dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_classifiers_.txt000066400000000000000000000002111442026364700253670ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Classifier: Development Status :: 4 - Beta Classifier: Programming Language :: Python whey-0.0.24/tests/test_build_/test_build_success_classifiers_.yml000066400000000000000000000014001442026364700253520ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_dependencies_.toml000066400000000000000000000003521442026364700256500ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'",] dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_dependencies_.txt000066400000000000000000000003041442026364700255110ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx whey-0.0.24/tests/test_build_/test_build_success_dependencies_.yml000066400000000000000000000014001442026364700254710ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_description_.toml000066400000000000000000000002441442026364700255450ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" description = "Lovely Spam! Wonderful Spam!" dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_description_.txt000066400000000000000000000001311442026364700254040ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Summary: Lovely Spam! Wonderful Spam! whey-0.0.24/tests/test_build_/test_build_success_description_.yml000066400000000000000000000014001442026364700253660ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_entry_points_.toml000066400000000000000000000005541442026364700257630ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" [project.scripts] spam-cli = "spam:main_cli" [project.gui-scripts] spam-gui = "spam:main_gui" [project.entry-points."spam.magical"] tomatoes = "spam:main_tomatoes" [project.entry-points."flake8.extension"] SXL = "flake8_sphinx_links:Plugin" whey-0.0.24/tests/test_build_/test_build_success_entry_points_.txt000066400000000000000000000000631442026364700256220ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 whey-0.0.24/tests/test_build_/test_build_success_entry_points_.yml000066400000000000000000000014001442026364700256000ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_keywords_.toml000066400000000000000000000003011442026364700250630ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" keywords = [ "egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor",] dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_keywords_.txt000066400000000000000000000001521442026364700247330ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Keywords: bacon,egg,Lobster Thermidor,sausage,tomatoes whey-0.0.24/tests/test_build_/test_build_success_keywords_.yml000066400000000000000000000014001442026364700247120ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_maintainers_.toml000066400000000000000000000003021442026364700255270ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" dynamic = [] [[project.maintainers]] name = "Brett Cannon" email = "brett@python.org" [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_maintainers_.txt000066400000000000000000000001411442026364700253740ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Author-email: Brett Cannon whey-0.0.24/tests/test_build_/test_build_success_maintainers_.yml000066400000000000000000000014001442026364700253550ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_minimal_.toml000066400000000000000000000001671442026364700246540ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_minimal_.txt000066400000000000000000000000631442026364700245130ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 whey-0.0.24/tests/test_build_/test_build_success_minimal_.yml000066400000000000000000000014001442026364700244710ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_optional_dependencies_.toml000066400000000000000000000004421442026364700275550ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" [project.optional-dependencies] test = [ "pytest < 5.0.0", "pytest-cov[all]", 'matplotlib>=3.0.0; platform_machine != "aarch64" or python_version > "3.6"', ] whey-0.0.24/tests/test_build_/test_build_success_optional_dependencies_.txt000066400000000000000000000004251442026364700274220ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Requires-Dist: matplotlib>=3.0.0; (platform_machine != "aarch64" or python_version > "3.6") and extra == 'test' Requires-Dist: pytest<5.0.0; extra == 'test' Requires-Dist: pytest-cov[all]; extra == 'test' Provides-Extra: test whey-0.0.24/tests/test_build_/test_build_success_optional_dependencies_.yml000066400000000000000000000014001442026364700273760ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_requires_python_.toml000066400000000000000000000002211442026364700264550ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" requires-python = ">=3.8" dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_requires_python_.txt000066400000000000000000000001121442026364700263200ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Requires-Python: >=3.8 whey-0.0.24/tests/test_build_/test_build_success_requires_python_.yml000066400000000000000000000014001442026364700263030ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_requires_python_complex_.toml000066400000000000000000000002411442026364700302060ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" requires-python = ">=2.7,!=3.0.*,!=3.2.*" dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_requires_python_complex_.txt000066400000000000000000000001321442026364700300510ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Requires-Python: !=3.0.*,!=3.2.*,>=2.7 whey-0.0.24/tests/test_build_/test_build_success_requires_python_complex_.yml000066400000000000000000000014001442026364700300320ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_unicode_.toml000066400000000000000000000003261442026364700246510ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" description = "Factory ⸻ A code generator 🏭" dynamic = [] [[project.authors]] name = "Łukasz Langa" [build-system] requires = [ "whey",] build-backend = "whey" whey-0.0.24/tests/test_build_/test_build_success_unicode_.txt000066400000000000000000000001641442026364700245150ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Summary: Factory ⸻ A code generator 🏭 Author: Łukasz Langa whey-0.0.24/tests/test_build_/test_build_success_unicode_.yml000066400000000000000000000014001442026364700244710ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_success_urls_.toml000066400000000000000000000004261442026364700242110ustar00rootroot00000000000000[project] name = "spam" version = "2020.0.0" dynamic = [] [build-system] requires = [ "whey",] build-backend = "whey" [project.urls] homepage = "example.com" documentation = "readthedocs.org" repository = "github.com" changelog = "github.com/me/spam/blob/master/CHANGELOG.md" whey-0.0.24/tests/test_build_/test_build_success_urls_.txt000066400000000000000000000003361442026364700240550ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Home-page: example.com Project-URL: documentation, readthedocs.org Project-URL: repository, github.com Project-URL: changelog, github.com/me/spam/blob/master/CHANGELOG.md whey-0.0.24/tests/test_build_/test_build_success_urls_.yml000066400000000000000000000014001442026364700240300ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam/__init__.py - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam-2020.0.0.dist-info/RECORD test_build_underscore_name_hyphen_name_underscore_package_explicit_.txt000066400000000000000000000000701442026364700346050ustar00rootroot00000000000000whey-0.0.24/tests/test_build_Metadata-Version: 2.1 Name: spam-spam Version: 2020.0.0 test_build_underscore_name_hyphen_name_underscore_package_explicit_.yml000066400000000000000000000015371442026364700346000ustar00rootroot00000000000000whey-0.0.24/tests/test_build_sdist_content: - spam_spam-2020.0.0/PKG-INFO - spam_spam-2020.0.0/pyproject.toml - spam_spam-2020.0.0/spam_spam/__init__.py stderr: '' stdout: 'Copying .../spam_spam/__init__.py -> spam_spam/__init__.py Writing spam_spam-2020.0.0.dist-info/entry_points.txt Writing spam_spam-2020.0.0.dist-info/METADATA Writing spam_spam-2020.0.0.dist-info/WHEEL Writing spam_spam-2020.0.0.dist-info/RECORD Wheel created at .../spam_spam-2020.0.0-py3-none-any.whl Copying .../spam_spam/__init__.py -> spam_spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam_spam-2020.0.0.tar.gz ' wheel_content: - spam_spam/__init__.py - spam_spam-2020.0.0.dist-info/METADATA - spam_spam-2020.0.0.dist-info/WHEEL - spam_spam-2020.0.0.dist-info/entry_points.txt - spam_spam-2020.0.0.dist-info/RECORD test_build_underscore_name_hyphen_name_underscore_package_implicit_.txt000066400000000000000000000000701442026364700345760ustar00rootroot00000000000000whey-0.0.24/tests/test_build_Metadata-Version: 2.1 Name: spam-spam Version: 2020.0.0 test_build_underscore_name_hyphen_name_underscore_package_implicit_.yml000066400000000000000000000015371442026364700345710ustar00rootroot00000000000000whey-0.0.24/tests/test_build_sdist_content: - spam_spam-2020.0.0/PKG-INFO - spam_spam-2020.0.0/pyproject.toml - spam_spam-2020.0.0/spam_spam/__init__.py stderr: '' stdout: 'Copying .../spam_spam/__init__.py -> spam_spam/__init__.py Writing spam_spam-2020.0.0.dist-info/entry_points.txt Writing spam_spam-2020.0.0.dist-info/METADATA Writing spam_spam-2020.0.0.dist-info/WHEEL Writing spam_spam-2020.0.0.dist-info/RECORD Wheel created at .../spam_spam-2020.0.0-py3-none-any.whl Copying .../spam_spam/__init__.py -> spam_spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam_spam-2020.0.0.tar.gz ' wheel_content: - spam_spam/__init__.py - spam_spam-2020.0.0.dist-info/METADATA - spam_spam-2020.0.0.dist-info/WHEEL - spam_spam-2020.0.0.dist-info/entry_points.txt - spam_spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_underscore_name_underscore_name_.txt000066400000000000000000000000701442026364700277350ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam-spam Version: 2020.0.0 whey-0.0.24/tests/test_build_/test_build_underscore_name_underscore_name_.yml000066400000000000000000000015371442026364700277300ustar00rootroot00000000000000sdist_content: - spam_spam-2020.0.0/PKG-INFO - spam_spam-2020.0.0/pyproject.toml - spam_spam-2020.0.0/spam_spam/__init__.py stderr: '' stdout: 'Copying .../spam_spam/__init__.py -> spam_spam/__init__.py Writing spam_spam-2020.0.0.dist-info/entry_points.txt Writing spam_spam-2020.0.0.dist-info/METADATA Writing spam_spam-2020.0.0.dist-info/WHEEL Writing spam_spam-2020.0.0.dist-info/RECORD Wheel created at .../spam_spam-2020.0.0-py3-none-any.whl Copying .../spam_spam/__init__.py -> spam_spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam_spam-2020.0.0.tar.gz ' wheel_content: - spam_spam/__init__.py - spam_spam-2020.0.0.dist-info/METADATA - spam_spam-2020.0.0.dist-info/WHEEL - spam_spam-2020.0.0.dist-info/entry_points.txt - spam_spam-2020.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_COMPLETE_A_.RECORD000066400000000000000000000007111442026364700265610ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=8iiyYruvYnQXM7I-Boj7lpKCU2Pz8W1dy2Df1tBKXZ4,1410 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_COMPLETE_A_.txt000066400000000000000000000026021442026364700264230ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_COMPLETE_A_.yml000066400000000000000000000011171442026364700264050ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../sdist_unpacked/whey-2021.0.0/whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_COMPLETE_B_.RECORD000066400000000000000000000007111442026364700265620ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=xxqX2zIgwxgUCE1VgQnMOY0DAgSa-ddnpQwzq9PpmMs,1472 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_COMPLETE_B_.txt000066400000000000000000000027001442026364700264230ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_COMPLETE_B_.yml000066400000000000000000000011171442026364700264060ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../sdist_unpacked/whey-2021.0.0/whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_DYNAMIC_REQUIREMENTS_.RECORD000066400000000000000000000007111442026364700302000ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=8iiyYruvYnQXM7I-Boj7lpKCU2Pz8W1dy2Df1tBKXZ4,1410 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_DYNAMIC_REQUIREMENTS_.txt000066400000000000000000000026021442026364700300420ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_DYNAMIC_REQUIREMENTS_.yml000066400000000000000000000011171442026364700300240ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../sdist_unpacked/whey-2021.0.0/whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_LONG_REQUIREMENTS_.RECORD000066400000000000000000000007101442026364700276520ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=aIi772Rlduow__WeM1MGu1-lRRSnZmB5wcGTBk0ei50,658 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_LONG_REQUIREMENTS_.txt000066400000000000000000000012221442026364700275120ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Requires-Python: >=3.6.1 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: typed-ast>=1.4.2; python_version < "3.8" and platform_python_implementation == "CPython" Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_LONG_REQUIREMENTS_.yml000066400000000000000000000011171442026364700274770ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../sdist_unpacked/whey-2021.0.0/whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_source_dir_COMPLETE_A_.RECORD000066400000000000000000000007111442026364700307770ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=8iiyYruvYnQXM7I-Boj7lpKCU2Pz8W1dy2Df1tBKXZ4,1410 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_source_dir_COMPLETE_A_.txt000066400000000000000000000026021442026364700306410ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_source_dir_COMPLETE_A_.yml000066400000000000000000000011231442026364700306200ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../sdist_unpacked/whey-2021.0.0/src/whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_source_dir_COMPLETE_B_.RECORD000066400000000000000000000007111442026364700310000ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=xxqX2zIgwxgUCE1VgQnMOY0DAgSa-ddnpQwzq9PpmMs,1472 whey-2021.0.0.dist-info/WHEEL,sha256=Z8ApXUcOYK5VMz9yebTyUF13KAMNT6RSnd-lLcivEVA,84 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_source_dir_COMPLETE_B_.txt000066400000000000000000000027001442026364700306410ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_build_wheel_from_sdist_source_dir_COMPLETE_B_.yml000066400000000000000000000011231442026364700306210ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../sdist_unpacked/whey-2021.0.0/src/whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_custom_wheel_builder_COMPLETE_A_.RECORD000066400000000000000000000007111442026364700262510ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=8iiyYruvYnQXM7I-Boj7lpKCU2Pz8W1dy2Df1tBKXZ4,1410 whey-2021.0.0.dist-info/WHEEL,sha256=r2SGDgzin6Yt4GzNx_Bg7ya-CuSBkCRIHxIIrSDZ-FM,95 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_custom_wheel_builder_COMPLETE_A_.WHEEL000066400000000000000000000001371442026364700261410ustar00rootroot00000000000000Wheel-Version: 1.0 Generator: My Custom Builder v1.2.3 Root-Is-Purelib: true Tag: py3-none-any whey-0.0.24/tests/test_build_/test_custom_wheel_builder_COMPLETE_A_.txt000066400000000000000000000026021442026364700261130ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_custom_wheel_builder_COMPLETE_A_.yml000066400000000000000000000010621442026364700260740ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_custom_wheel_builder_COMPLETE_B_.RECORD000066400000000000000000000007111442026364700262520ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=xxqX2zIgwxgUCE1VgQnMOY0DAgSa-ddnpQwzq9PpmMs,1472 whey-2021.0.0.dist-info/WHEEL,sha256=r2SGDgzin6Yt4GzNx_Bg7ya-CuSBkCRIHxIIrSDZ-FM,95 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_custom_wheel_builder_COMPLETE_B_.WHEEL000066400000000000000000000001371442026364700261420ustar00rootroot00000000000000Wheel-Version: 1.0 Generator: My Custom Builder v1.2.3 Root-Is-Purelib: true Tag: py3-none-any whey-0.0.24/tests/test_build_/test_custom_wheel_builder_COMPLETE_B_.txt000066400000000000000000000027001442026364700261130ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_custom_wheel_builder_COMPLETE_B_.yml000066400000000000000000000010621442026364700260750ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_build_/test_custom_wheel_builder_LONG_REQUIREMENTS_.RECORD000066400000000000000000000007101442026364700273420ustar00rootroot00000000000000whey/__init__.py,sha256=LVQwFWJ6dxQ2sw6nn9Ds2o34vNd7PVVmHK9aDW6AmIY,21 whey-2021.0.0.dist-info/LICENSE,sha256=5wizT6r_v4VTz5CuAQ2HSwrPhYUFwQypVskUSmY1reQ,20 whey-2021.0.0.dist-info/METADATA,sha256=aIi772Rlduow__WeM1MGu1-lRRSnZmB5wcGTBk0ei50,658 whey-2021.0.0.dist-info/WHEEL,sha256=r2SGDgzin6Yt4GzNx_Bg7ya-CuSBkCRIHxIIrSDZ-FM,95 whey-2021.0.0.dist-info/entry_points.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 whey-2021.0.0.dist-info/RECORD,, whey-0.0.24/tests/test_build_/test_custom_wheel_builder_LONG_REQUIREMENTS_.WHEEL000066400000000000000000000001371442026364700272330ustar00rootroot00000000000000Wheel-Version: 1.0 Generator: My Custom Builder v1.2.3 Root-Is-Purelib: true Tag: py3-none-any whey-0.0.24/tests/test_build_/test_custom_wheel_builder_LONG_REQUIREMENTS_.txt000066400000000000000000000012221442026364700272020ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Requires-Python: >=3.6.1 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: typed-ast>=1.4.2; python_version < "3.8" and platform_python_implementation == "CPython" Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_build_/test_custom_wheel_builder_LONG_REQUIREMENTS_.yml000066400000000000000000000010621442026364700271660ustar00rootroot00000000000000stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - whey/__init__.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey-2021.0.0.dist-info/RECORD whey-0.0.24/tests/test_builder_methods.py000066400000000000000000000041151442026364700205060ustar00rootroot00000000000000# stdlib import sys from typing import TYPE_CHECKING, Any, Dict # 3rd party import pytest from coincidence.regressions import AdvancedDataRegressionFixture from coincidence.selectors import min_version, only_version from domdf_python_tools.paths import PathPlus, TemporaryPathPlus, sort_paths # this package from tests.example_configs import COMPLETE_A from whey.builder import WheelBuilder from whey.config import load_toml if TYPE_CHECKING: # 3rd party from _pytest.capture import CaptureFixture @pytest.mark.parametrize( "editables_version", [ pytest.param("0.2", marks=only_version("3.6")), pytest.param("0.3", marks=min_version("3.7")), ] ) def test_create_editables_files( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", editables_version: str, ): (tmp_pathplus / "pyproject.toml").write_clean(COMPLETE_A) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with TemporaryPathPlus() as tmpdir: wheel_builder = WheelBuilder( project_dir=tmp_pathplus, config=load_toml(tmp_pathplus / "pyproject.toml"), build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) assert list(wheel_builder.create_editables_files()) == ["editables>=0.2"] outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err data["listdir"] = [p.relative_to(tmpdir).as_posix() for p in sort_paths(*tmpdir.iterdir())] data["pth"] = (tmpdir / "whey.pth").read_text() if sys.version_info >= (3, 7): data["code"] = (tmpdir / "_editable_impl_whey.py").read_text().replace(tmp_pathplus.as_posix(), "...") else: data["code"] = (tmpdir / "_whey.py").read_text().replace(tmp_pathplus.as_posix(), "...") advanced_data_regression.check(data) whey-0.0.24/tests/test_builder_methods_/000077500000000000000000000000001442026364700202725ustar00rootroot00000000000000whey-0.0.24/tests/test_builder_methods_/test_create_editables_files_0_2_.yml000066400000000000000000000003741442026364700273200ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' listdir: - _whey.py - whey.pth pth: 'import _whey ' stderr: '' stdout: 'Writing whey.pth Writing _whey.py ' whey-0.0.24/tests/test_builder_methods_/test_create_editables_files_0_3_.yml000066400000000000000000000004461442026364700273210ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' listdir: - _editable_impl_whey.py - whey.pth pth: 'import _editable_impl_whey ' stderr: '' stdout: 'Writing whey.pth Writing _editable_impl_whey.py ' whey-0.0.24/tests/test_cli.py000066400000000000000000000502441442026364700161100ustar00rootroot00000000000000# stdlib import re import textwrap from typing import TYPE_CHECKING, Any, Dict, List, Type # 3rd party import handy_archives import pytest from coincidence.regressions import AdvancedDataRegressionFixture, AdvancedFileRegressionFixture from consolekit.testing import CliRunner, Result from dom_toml.parser import BadConfigError from domdf_python_tools.paths import PathPlus, in_directory from pyproject_examples import bad_pep621_config from pyproject_examples.example_configs import ( AUTHORS, CLASSIFIERS, DEPENDENCIES, ENTRY_POINTS, KEYWORDS, MAINTAINERS, MINIMAL_CONFIG, OPTIONAL_DEPENDENCIES, URLS ) from re_assert import Matches # type: ignore[import] # this package from tests.example_configs import COMPLETE_A, COMPLETE_B from whey.__main__ import main if TYPE_CHECKING: # 3rd party from _pytest.capture import CaptureFixture @pytest.mark.parametrize( "config", [ pytest.param(MINIMAL_CONFIG, id="minimal"), pytest.param(f'{MINIMAL_CONFIG}\ndescription = "Lovely Spam! Wonderful Spam!"', id="description"), pytest.param(f'{MINIMAL_CONFIG}\nrequires-python = ">=3.8"', id="requires-python"), pytest.param( f'{MINIMAL_CONFIG}\nrequires-python = ">=2.7,!=3.0.*,!=3.2.*"', id="requires-python_complex" ), pytest.param(KEYWORDS, id="keywords"), pytest.param(AUTHORS, id="authors"), pytest.param(MAINTAINERS, id="maintainers"), pytest.param(CLASSIFIERS, id="classifiers"), pytest.param(DEPENDENCIES, id="dependencies"), pytest.param(OPTIONAL_DEPENDENCIES, id="optional-dependencies"), pytest.param(URLS, id="urls"), pytest.param(ENTRY_POINTS, id="entry_points"), ] ) def test_cli_build_success( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "spam").mkdir() (tmp_pathplus / "spam" / "__init__.py").write_clean("print('hello world)") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke(main, args=["--verbose", "--no-colour", "--out-dir", str(tmp_pathplus)]) assert result.exit_code == 0 wheel = "spam-2020.0.0-py3-none-any.whl" assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) assert zip_file.read_text("spam/__init__.py") == "print('hello world)\n" sdist = "spam-2020.0.0.tar.gz" assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("spam-2020.0.0/spam/__init__.py") == "print('hello world)\n" data["stdout"] = result.stdout.rstrip().replace(tmp_pathplus.as_posix(), "...") advanced_data_regression.check(data) def check_built_wheel(filename: PathPlus) -> List[str]: assert (filename).is_file() with handy_archives.ZipFile(filename) as zip_file: assert zip_file.read_text("whey/__init__.py") == "print('hello world)\n" return sorted(zip_file.namelist()) def check_built_sdist(filename: PathPlus) -> List[str]: assert (filename).is_file() with handy_archives.TarFile.open(filename) as tar: assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world)\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" return sorted(tar.getnames()) @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_build_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke(main, args=["--verbose", "--no-colour", "--out-dir", str(tmp_pathplus)]) assert result.exit_code == 0 wheel = "whey-2021.0.0-py3-none-any.whl" data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel) sdist = "whey-2021.0.0.tar.gz" data["sdist_content"] = check_built_sdist(tmp_pathplus / sdist) data["stdout"] = result.stdout.rstrip().replace(tmp_pathplus.as_posix(), "...") advanced_data_regression.check(data) @pytest.mark.parametrize( "config", [ pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_build_sdist_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke( main, args=["--sdist", "--verbose", "--no-colour", "--out-dir", str(tmp_pathplus)] ) assert result.exit_code == 0 sdist = "whey-2021.0.0.tar.gz" data["sdist_content"] = check_built_sdist(tmp_pathplus / sdist) data["stdout"] = result.stdout.rstrip().replace(tmp_pathplus.as_posix(), "...") advanced_data_regression.check(data) @pytest.mark.parametrize( "config", [ pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_build_wheel_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke( main, args=["--wheel", "--verbose", "--no-colour", "--out-dir", str(tmp_pathplus)] ) assert result.exit_code == 0 wheel = "whey-2021.0.0-py3-none-any.whl" data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel) data["stdout"] = result.stdout.rstrip().replace(tmp_pathplus.as_posix(), "...") advanced_data_regression.check(data) @pytest.mark.parametrize( "config", [ pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_build_wheel_via_builder_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke( main, args=["--builder", "whey_wheel", "--verbose", "--no-colour", "--out-dir", str(tmp_pathplus)] ) assert result.exit_code == 0 wheel = "whey-2021.0.0-py3-none-any.whl" data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel) data["stdout"] = result.stdout.rstrip().replace(tmp_pathplus.as_posix(), "...") advanced_data_regression.check(data) @pytest.mark.parametrize( "config", [ pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_build_binary_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", ): # TODO: e.g. conda, RPM, DEB (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke( main, args=["--binary", "--verbose", "--no-colour", "--out-dir", str(tmp_pathplus)] ) assert result.exit_code == 0 wheel = "whey-2021.0.0-py3-none-any.whl" data["wheel_content"] = check_built_wheel(tmp_pathplus / wheel) data["stdout"] = result.stdout.rstrip().replace(tmp_pathplus.as_posix(), "...") advanced_data_regression.check(data) def test_build_additional_files( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_lines([ COMPLETE_B, '', "additional-files = [", ' "include whey/style.css",', ' "exclude whey/style.css",', ' "include whey/style.css",', ' "recursive-include whey/static *",', ' "recursive-exclude whey/static *.txt",', ']', ]) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "whey" / "style.css").write_clean("This is the style.css file") (tmp_pathplus / "whey" / "static").mkdir() (tmp_pathplus / "whey" / "static" / "foo.py").touch() (tmp_pathplus / "whey" / "static" / "foo.c").touch() (tmp_pathplus / "whey" / "static" / "foo.txt").touch() (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke(main, args=["--verbose", "--no-colour", "--out-dir", str(tmp_pathplus)]) assert result.exit_code == 0 wheel = "whey-2021.0.0-py3-none-any.whl" assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) assert zip_file.read_text("whey/__init__.py") == "print('hello world)\n" assert zip_file.read_text("whey/style.css") == "This is the style.css file\n" sdist = "whey-2021.0.0.tar.gz" assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world)\n" assert tar.read_text("whey-2021.0.0/whey/style.css") == "This is the style.css file\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" data["stdout"] = result.stdout.rstrip().replace(tmp_pathplus.as_posix(), "...") advanced_data_regression.check(data) @pytest.mark.parametrize( "config, match", [ pytest.param( '[project]\nname = "spam"', textwrap.dedent( """\ BadConfigError: The 'project.version' field must be provided. Use '--traceback' to view the full traceback. Aborted!""" ), id="no_version" ), pytest.param( '[project]\n\nversion = "2020.0.0"', textwrap.dedent( """\ BadConfigError: The 'project.name' field must be provided. Use '--traceback' to view the full traceback. Aborted!""" ), id="no_name" ), pytest.param( '[project]\ndynamic = ["name"]', textwrap.dedent( """\ BadConfigError: The 'project.name' field may not be dynamic. Use '--traceback' to view the full traceback. Aborted!""" ), id="dynamic_name" ), pytest.param( '[project]\nname = "???????12345=============☃"\nversion = "2020.0.0"', re.escape( textwrap.dedent( """\ BadConfigError: The value '???????12345=============☃' for 'project.name' is invalid. Documentation: https://whey.readthedocs.io/en/latest/configuration.html#tconf-project.name Use '--traceback' to view the full traceback. Aborted!""" ) ), id="bad_name" ), pytest.param( '[project]\nname = "spam"\nversion = "???????12345=============☃"', re.escape( textwrap.dedent( """\ InvalidVersion: '???????12345=============☃' Note: versions must follow PEP 440 Documentation: https://peps.python.org/pep-0440/ Use '--traceback' to view the full traceback. Aborted!""" ) ), id="bad_version" ), pytest.param( f'{MINIMAL_CONFIG}\nrequires-python = "???????12345=============☃"', re.escape( textwrap.dedent( """\ InvalidSpecifier: '???????12345=============☃' Note: specifiers must follow PEP 508 Documentation: https://peps.python.org/pep-0508/ Use '--traceback' to view the full traceback. Aborted!""" ) ), id="bad_requires_python" ), pytest.param( f'{MINIMAL_CONFIG}\nauthors = [{{name = "Bob, Alice"}}]', r"BadConfigError: The 'project.authors\[0\].name' key cannot contain commas.\n Documentation: https://whey.readthedocs.io/en/latest/configuration.html#tconf-project.authors\n Use '--traceback' to view the full traceback.\nAborted!", id="author_comma" ), pytest.param( f'{MINIMAL_CONFIG}\nmaintainers = [{{name = "Bob, Alice"}}]', r"BadConfigError: The 'project.maintainers\[0\].name' key cannot contain commas.\n Documentation: https://whey.readthedocs.io/en/latest/configuration.html#tconf-project.maintainers\n Use '--traceback' to view the full traceback.\nAborted!", id="maintainer_comma" ), pytest.param( f'{MINIMAL_CONFIG}\nkeywords = [1, 2, 3, 4, 5]', r"TypeError: Invalid type for 'project.keywords\[0\]': expected , got \n Documentation: https://whey.readthedocs.io/en/latest/configuration.html#tconf-project.keywords\n Use '--traceback' to view the full traceback.\nAborted!", id="keywords_wrong_type" ), pytest.param( f'{MINIMAL_CONFIG}\nclassifiers = [1, 2, 3, 4, 5]', r"TypeError: Invalid type for 'project.classifiers\[0\]': expected , got \n Documentation: https://whey.readthedocs.io/en/latest/configuration.html#tconf-project.classifiers\n Use '--traceback' to view the full traceback.\nAborted!", id="classifiers_wrong_type" ), pytest.param( f'{MINIMAL_CONFIG}\ndependencies = [1, 2, 3, 4, 5]', r"TypeError: Invalid type for 'project.dependencies\[0\]': expected , got \n Documentation: https://whey.readthedocs.io/en/latest/configuration.html#tconf-project.dependencies\n Use '--traceback' to view the full traceback.\nAborted!", id="dependencies_wrong_type" ), pytest.param( f'{MINIMAL_CONFIG}\nreadme = "README.rst"', "No such file or directory: 'README.rst'\nAborted!", id="missing_readme_file", ), pytest.param( f'{MINIMAL_CONFIG}\nlicense = {{file = "LICENSE.txt"}}', "No such file or directory: 'LICENSE.txt'\nAborted!", id="missing_license_file", ), ] ) def test_bad_config( config: str, match: str, tmp_pathplus: PathPlus, ): (tmp_pathplus / "pyproject.toml").write_clean(config) with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke( main, args=["--sdist", "--verbose", "--no-colour", "--out-dir", str(tmp_pathplus)], ) assert result.exit_code == 1 _Matches(match).assert_matches(result.stdout.rstrip()) # assert re.match(match, result.stdout.rstrip()) # Based on https://pypi.org/project/re-assert/ # Copyright (c) 2019 Anthony Sottile # MIT Licensed class _Matches(Matches): def _fail_message(self, fail: str) -> str: # binary search to find the longest substring match pos, bound = 0, len(fail) while pos < bound: pivot = pos + (bound - pos + 1) // 2 match = self._pattern.match(fail[:pivot], partial=True) if match: pos = pivot else: bound = pivot - 1 retv = [f' regex: {self._pattern.pattern}', " failed to match at:", ''] for line in fail.splitlines(True): line_noeol = line.rstrip('\r\n') retv.append(f'> {line_noeol}') if 0 <= pos <= len(line_noeol): indent = ''.join(c if c.isspace() else ' ' for c in line[:pos]) retv.append(f' {indent}^') pos = -1 else: pos -= len(line) if pos >= 0: retv.append('>') retv.append(" ^") return '\n'.join(retv) @pytest.mark.parametrize( "config, exception, match", [ pytest.param( '[project]\nname = "spam"', BadConfigError, "The 'project.version' field must be provided.", id="no_version" ), *bad_pep621_config, ] ) def test_bad_config_show_traceback( config: str, exception: Type[Exception], match: str, tmp_pathplus: PathPlus, ): (tmp_pathplus / "pyproject.toml").write_clean(config) with in_directory(tmp_pathplus): runner = CliRunner() with pytest.raises(exception, match=match): runner.invoke( main, args=["--sdist", "--verbose", "--no-colour", "--out-dir", str(tmp_pathplus), "-T"], ) @pytest.mark.parametrize( "config", [ pytest.param(MINIMAL_CONFIG, id="default"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nsdist = "whey_sdist"', id="sdist"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nwheel = "whey_wheel"', id="wheel"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nwheel = "whey_pth_wheel"', id="whey_pth"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nbinary = "whey_wheel"', id="binary_wheel"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nbinary = "whey_conda"', id="binary_conda"), pytest.param( f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nsdist = "whey_sdist"\nwheel = "whey_wheel"', id="sdist_and_wheel", ), ] ) @pytest.mark.parametrize( "args", [ pytest.param([], id="none"), pytest.param(["--sdist"], id="sdist"), pytest.param(["--wheel"], id="wheel"), pytest.param(["--binary"], id="binary"), pytest.param(["--binary", "--sdist"], id="binary_and_sdist"), pytest.param(["--builder", "whey_conda"], id="whey_conda"), pytest.param(["--builder", "whey_conda", "--sdist"], id="whey_conda_and_sdist"), pytest.param( ["--builder", "whey_pth_wheel", "--builder", "whey_conda"], id="whey_conda_and_whey_pth", ), ] ) def test_show_builders( config: str, tmp_pathplus: PathPlus, advanced_file_regression: AdvancedFileRegressionFixture, args: List[str] ): (tmp_pathplus / "pyproject.toml").write_clean(config) with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke( main, args=[*args, "--show-builders", "--no-colour"], ) result.check_stdout(advanced_file_regression) assert result.exit_code == 0 def test_show_builders_error( tmp_pathplus: PathPlus, advanced_file_regression: AdvancedFileRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_clean(MINIMAL_CONFIG) with in_directory(tmp_pathplus): runner = CliRunner() result: Result = runner.invoke( main, args=["--builder", "foo", "--show-builders", "--no-colour"], ) result.check_stdout(advanced_file_regression) assert result.exit_code == 2 whey-0.0.24/tests/test_cli_/000077500000000000000000000000001442026364700156705ustar00rootroot00000000000000whey-0.0.24/tests/test_cli_/test_build_additional_files.yml000066400000000000000000000040201442026364700241170ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py - whey-2021.0.0/whey/static/foo.c - whey-2021.0.0/whey/static/foo.py - whey-2021.0.0/whey/style.css stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../whey/__init__.py\ \ -> whey/__init__.py\nCopying .../whey/static/foo.py -> whey/static/foo.py\nCopying\ \ .../whey/style.css -> whey/style.css\nRemoving whey/style.css\nCopying .../whey/style.css\ \ -> whey/style.css\nCopying .../whey/static/foo.c -> whey/static/foo.c\nCopying\ \ .../whey/static/foo.py -> whey/static/foo.py\nCopying .../whey/static/foo.txt\ \ -> whey/static/foo.txt\nRemoving whey/static/foo.txt\nWriting whey-2021.0.0.dist-info/LICENSE\n\ Writing whey-2021.0.0.dist-info/entry_points.txt\nWriting whey-2021.0.0.dist-info/METADATA\n\ Writing whey-2021.0.0.dist-info/WHEEL\nWriting whey-2021.0.0.dist-info/RECORD\n\ Wheel created at .../whey-2021.0.0-py3-none-any.whl\nCopying .../whey/__init__.py\ \ -> whey/__init__.py\nCopying .../whey/static/foo.py -> whey/static/foo.py\nCopying\ \ .../whey/style.css -> whey/style.css\nRemoving whey/style.css\nCopying .../whey/style.css\ \ -> whey/style.css\nCopying .../whey/static/foo.c -> whey/static/foo.c\nCopying\ \ .../whey/static/foo.py -> whey/static/foo.py\nCopying .../whey/static/foo.txt\ \ -> whey/static/foo.txt\nRemoving whey/static/foo.txt\nWriting LICENSE\nCopying\ \ .../pyproject.toml -> pyproject.toml\nCopying .../requirements.txt -> requirements.txt\n\ Writing README.rst\nWriting PKG-INFO\nSource distribution created at .../whey-2021.0.0.tar.gz" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py - whey/static/foo.c - whey/static/foo.py - whey/style.css whey-0.0.24/tests/test_cli_/test_build_binary_complete_COMPLETE_A_.yml000066400000000000000000000011751442026364700257000ustar00rootroot00000000000000stdout: "Using the following builder:\n binary: whey.builder.WheelBuilder\n\nBuilding\ \ ...\nCopying .../whey/__init__.py -> whey/__init__.py\nWriting whey-2021.0.0.dist-info/LICENSE\n\ Writing whey-2021.0.0.dist-info/entry_points.txt\nWriting whey-2021.0.0.dist-info/METADATA\n\ Writing whey-2021.0.0.dist-info/WHEEL\nWriting whey-2021.0.0.dist-info/RECORD\n\ Wheel created at .../whey-2021.0.0-py3-none-any.whl" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_cli_/test_build_binary_complete_COMPLETE_B_.yml000066400000000000000000000011751442026364700257010ustar00rootroot00000000000000stdout: "Using the following builder:\n binary: whey.builder.WheelBuilder\n\nBuilding\ \ ...\nCopying .../whey/__init__.py -> whey/__init__.py\nWriting whey-2021.0.0.dist-info/LICENSE\n\ Writing whey-2021.0.0.dist-info/entry_points.txt\nWriting whey-2021.0.0.dist-info/METADATA\n\ Writing whey-2021.0.0.dist-info/WHEEL\nWriting whey-2021.0.0.dist-info/RECORD\n\ Wheel created at .../whey-2021.0.0-py3-none-any.whl" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_cli_/test_build_complete_COMPLETE_A_.yml000066400000000000000000000021571442026364700243350ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../whey/__init__.py\ \ -> whey/__init__.py\nWriting whey-2021.0.0.dist-info/LICENSE\nWriting whey-2021.0.0.dist-info/entry_points.txt\n\ Writing whey-2021.0.0.dist-info/METADATA\nWriting whey-2021.0.0.dist-info/WHEEL\n\ Writing whey-2021.0.0.dist-info/RECORD\nWheel created at .../whey-2021.0.0-py3-none-any.whl\n\ Copying .../whey/__init__.py -> whey/__init__.py\nWriting LICENSE\nCopying .../pyproject.toml\ \ -> pyproject.toml\nCopying .../requirements.txt -> requirements.txt\nWriting README.rst\n\ Writing PKG-INFO\nSource distribution created at .../whey-2021.0.0.tar.gz" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_cli_/test_build_complete_COMPLETE_B_.yml000066400000000000000000000021571442026364700243360ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../whey/__init__.py\ \ -> whey/__init__.py\nWriting whey-2021.0.0.dist-info/LICENSE\nWriting whey-2021.0.0.dist-info/entry_points.txt\n\ Writing whey-2021.0.0.dist-info/METADATA\nWriting whey-2021.0.0.dist-info/WHEEL\n\ Writing whey-2021.0.0.dist-info/RECORD\nWheel created at .../whey-2021.0.0-py3-none-any.whl\n\ Copying .../whey/__init__.py -> whey/__init__.py\nWriting LICENSE\nCopying .../pyproject.toml\ \ -> pyproject.toml\nCopying .../requirements.txt -> requirements.txt\nWriting README.rst\n\ Writing PKG-INFO\nSource distribution created at .../whey-2021.0.0.tar.gz" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_cli_/test_build_sdist_complete_COMPLETE_A_.yml000066400000000000000000000010511442026364700255330ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stdout: "Using the following builder:\n sdist: whey.builder.SDistBuilder\n\nBuilding\ \ ...\nCopying .../whey/__init__.py -> whey/__init__.py\nWriting LICENSE\nCopying\ \ .../pyproject.toml -> pyproject.toml\nCopying .../requirements.txt -> requirements.txt\n\ Writing README.rst\nWriting PKG-INFO\nSource distribution created at .../whey-2021.0.0.tar.gz" whey-0.0.24/tests/test_cli_/test_build_sdist_complete_COMPLETE_B_.yml000066400000000000000000000010511442026364700255340ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stdout: "Using the following builder:\n sdist: whey.builder.SDistBuilder\n\nBuilding\ \ ...\nCopying .../whey/__init__.py -> whey/__init__.py\nWriting LICENSE\nCopying\ \ .../pyproject.toml -> pyproject.toml\nCopying .../requirements.txt -> requirements.txt\n\ Writing README.rst\nWriting PKG-INFO\nSource distribution created at .../whey-2021.0.0.tar.gz" whey-0.0.24/tests/test_cli_/test_build_wheel_complete_COMPLETE_A_.yml000066400000000000000000000011741442026364700255170ustar00rootroot00000000000000stdout: "Using the following builder:\n wheel: whey.builder.WheelBuilder\n\nBuilding\ \ ...\nCopying .../whey/__init__.py -> whey/__init__.py\nWriting whey-2021.0.0.dist-info/LICENSE\n\ Writing whey-2021.0.0.dist-info/entry_points.txt\nWriting whey-2021.0.0.dist-info/METADATA\n\ Writing whey-2021.0.0.dist-info/WHEEL\nWriting whey-2021.0.0.dist-info/RECORD\n\ Wheel created at .../whey-2021.0.0-py3-none-any.whl" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_cli_/test_build_wheel_complete_COMPLETE_B_.yml000066400000000000000000000011741442026364700255200ustar00rootroot00000000000000stdout: "Using the following builder:\n wheel: whey.builder.WheelBuilder\n\nBuilding\ \ ...\nCopying .../whey/__init__.py -> whey/__init__.py\nWriting whey-2021.0.0.dist-info/LICENSE\n\ Writing whey-2021.0.0.dist-info/entry_points.txt\nWriting whey-2021.0.0.dist-info/METADATA\n\ Writing whey-2021.0.0.dist-info/WHEEL\nWriting whey-2021.0.0.dist-info/RECORD\n\ Wheel created at .../whey-2021.0.0-py3-none-any.whl" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_cli_/test_build_wheel_via_builder_complete_COMPLETE_A_.yml000066400000000000000000000012001442026364700300520ustar00rootroot00000000000000stdout: "Using the following builder:\n whey_wheel: whey.builder.WheelBuilder\n\ \nBuilding ...\nCopying .../whey/__init__.py -> whey/__init__.py\nWriting whey-2021.0.0.dist-info/LICENSE\n\ Writing whey-2021.0.0.dist-info/entry_points.txt\nWriting whey-2021.0.0.dist-info/METADATA\n\ Writing whey-2021.0.0.dist-info/WHEEL\nWriting whey-2021.0.0.dist-info/RECORD\n\ Wheel created at .../whey-2021.0.0-py3-none-any.whl" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_cli_/test_build_wheel_via_builder_complete_COMPLETE_B_.yml000066400000000000000000000012001442026364700300530ustar00rootroot00000000000000stdout: "Using the following builder:\n whey_wheel: whey.builder.WheelBuilder\n\ \nBuilding ...\nCopying .../whey/__init__.py -> whey/__init__.py\nWriting whey-2021.0.0.dist-info/LICENSE\n\ Writing whey-2021.0.0.dist-info/entry_points.txt\nWriting whey-2021.0.0.dist-info/METADATA\n\ Writing whey-2021.0.0.dist-info/WHEEL\nWriting whey-2021.0.0.dist-info/RECORD\n\ Wheel created at .../whey-2021.0.0-py3-none-any.whl" wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_authors_.yml000066400000000000000000000015671442026364700250450ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_classifiers_.yml000066400000000000000000000015671442026364700256670ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_dependencies_.yml000066400000000000000000000015671442026364700260060ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_description_.yml000066400000000000000000000015671442026364700257030ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_entry_points_.yml000066400000000000000000000015671442026364700261150ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_keywords_.yml000066400000000000000000000015671442026364700252270ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_maintainers_.yml000066400000000000000000000015671442026364700256720ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_minimal_.yml000066400000000000000000000015671442026364700250060ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_optional_dependencies_.yml000066400000000000000000000015671442026364700277130ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_requires_python_.yml000066400000000000000000000015671442026364700266200ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_requires_python_complex_.yml000066400000000000000000000015671442026364700303470ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_cli_build_success_urls_.yml000066400000000000000000000015671442026364700243450ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stdout: "Using the following builders:\n sdist: whey.builder.SDistBuilder\n \ \ wheel: whey.builder.WheelBuilder\n\nBuilding ...\nCopying .../spam/__init__.py\ \ -> spam/__init__.py\nWriting spam-2020.0.0.dist-info/entry_points.txt\nWriting\ \ spam-2020.0.0.dist-info/METADATA\nWriting spam-2020.0.0.dist-info/WHEEL\nWriting\ \ spam-2020.0.0.dist-info/RECORD\nWheel created at .../spam-2020.0.0-py3-none-any.whl\n\ Copying .../spam/__init__.py -> spam/__init__.py\nCopying .../pyproject.toml ->\ \ pyproject.toml\nWriting PKG-INFO\nSource distribution created at .../spam-2020.0.0.tar.gz" wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_cli_/test_show_builders_binary_and_sdist_binary_conda_.txt000066400000000000000000000001471442026364700306060ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder binary: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_and_sdist_binary_wheel_.txt000066400000000000000000000001511442026364700306210ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_and_sdist_default_.txt000066400000000000000000000001511442026364700275750ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_and_sdist_sdist_.txt000066400000000000000000000001511442026364700272770ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_and_sdist_sdist_and_wheel_.txt000066400000000000000000000001511442026364700313050ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_and_sdist_wheel_.txt000066400000000000000000000001511442026364700272550ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_and_sdist_whey_pth_.txt000066400000000000000000000001511442026364700300000ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_binary_conda_.txt000066400000000000000000000001011442026364700265440ustar00rootroot00000000000000Using the following builder: binary: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_binary_wheel_.txt000066400000000000000000000001031442026364700265660ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_default_.txt000066400000000000000000000001031442026364700255420ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_sdist_.txt000066400000000000000000000001031442026364700252440ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_sdist_and_wheel_.txt000066400000000000000000000001031442026364700272520ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_wheel_.txt000066400000000000000000000001031442026364700252220ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_binary_whey_pth_.txt000066400000000000000000000001031442026364700257450ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_error.txt000066400000000000000000000002201442026364700235440ustar00rootroot00000000000000Usage: main [OPTIONS] [PROJECT] Try 'main -h' for help. Error: Unknown builder 'foo'. Is it registered as an entry point under 'whey.builder'? whey-0.0.24/tests/test_cli_/test_show_builders_none_binary_conda_.txt000066400000000000000000000001501442026364700262230ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_none_binary_wheel_.txt000066400000000000000000000001501442026364700262430ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_none_default_.txt000066400000000000000000000001501442026364700252170ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_none_sdist_.txt000066400000000000000000000001501442026364700247210ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_none_sdist_and_wheel_.txt000066400000000000000000000001501442026364700267270ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_none_wheel_.txt000066400000000000000000000001501442026364700246770ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_none_whey_pth_.txt000066400000000000000000000001471442026364700254300ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_sdist_binary_conda_.txt000066400000000000000000000001021442026364700264070ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_cli_/test_show_builders_sdist_binary_wheel_.txt000066400000000000000000000001021442026364700264270ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_cli_/test_show_builders_sdist_default_.txt000066400000000000000000000001021442026364700254030ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_cli_/test_show_builders_sdist_sdist_.txt000066400000000000000000000001021442026364700251050ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_cli_/test_show_builders_sdist_sdist_and_wheel_.txt000066400000000000000000000001021442026364700271130ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_cli_/test_show_builders_sdist_wheel_.txt000066400000000000000000000001021442026364700250630ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_cli_/test_show_builders_sdist_whey_pth_.txt000066400000000000000000000001021442026364700256060ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_cli_/test_show_builders_wheel_binary_conda_.txt000066400000000000000000000001021442026364700263650ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_wheel_binary_wheel_.txt000066400000000000000000000001021442026364700264050ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_wheel_default_.txt000066400000000000000000000001021442026364700253610ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_wheel_sdist_.txt000066400000000000000000000001021442026364700250630ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_wheel_sdist_and_wheel_.txt000066400000000000000000000001021442026364700270710ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_wheel_wheel_.txt000066400000000000000000000001021442026364700250410ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_wheel_whey_pth_.txt000066400000000000000000000001011442026364700255630ustar00rootroot00000000000000Using the following builder: wheel: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_sdist_binary_conda_.txt000066400000000000000000000001531442026364700314370ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_sdist_binary_wheel_.txt000066400000000000000000000001531442026364700314570ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_sdist_default_.txt000066400000000000000000000001531442026364700304330ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_sdist_sdist_.txt000066400000000000000000000001531442026364700301350ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_sdist_sdist_and_wheel_.txt000066400000000000000000000001531442026364700321430ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_sdist_wheel_.txt000066400000000000000000000001531442026364700301130ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_sdist_whey_pth_.txt000066400000000000000000000001531442026364700306360ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_whey_pth_binary_conda_.txt000066400000000000000000000001631442026364700321410ustar00rootroot00000000000000Using the following builders: whey_pth_wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_whey_pth_binary_wheel_.txt000066400000000000000000000001631442026364700321610ustar00rootroot00000000000000Using the following builders: whey_pth_wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_whey_pth_default_.txt000066400000000000000000000001631442026364700311350ustar00rootroot00000000000000Using the following builders: whey_pth_wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_whey_pth_sdist_.txt000066400000000000000000000001631442026364700306370ustar00rootroot00000000000000Using the following builders: whey_pth_wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_whey_pth_sdist_and_wheel_.txt000066400000000000000000000001631442026364700326450ustar00rootroot00000000000000Using the following builders: whey_pth_wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_whey_pth_wheel_.txt000066400000000000000000000001631442026364700306150ustar00rootroot00000000000000Using the following builders: whey_pth_wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_and_whey_pth_whey_pth_.txt000066400000000000000000000001631442026364700313400ustar00rootroot00000000000000Using the following builders: whey_pth_wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_binary_conda_.txt000066400000000000000000000001051442026364700274040ustar00rootroot00000000000000Using the following builder: whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_binary_wheel_.txt000066400000000000000000000001051442026364700274240ustar00rootroot00000000000000Using the following builder: whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_default_.txt000066400000000000000000000001051442026364700264000ustar00rootroot00000000000000Using the following builder: whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_sdist_.txt000066400000000000000000000001051442026364700261020ustar00rootroot00000000000000Using the following builder: whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_sdist_and_wheel_.txt000066400000000000000000000001051442026364700301100ustar00rootroot00000000000000Using the following builder: whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_wheel_.txt000066400000000000000000000001051442026364700260600ustar00rootroot00000000000000Using the following builder: whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_cli_/test_show_builders_whey_conda_whey_pth_.txt000066400000000000000000000001051442026364700266030ustar00rootroot00000000000000Using the following builder: whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_config.py000066400000000000000000000644511442026364700166130ustar00rootroot00000000000000# stdlib from textwrap import dedent from typing import Any, Dict, List, Optional, Type, Union, cast # 3rd party import dom_toml import pytest from coincidence.regressions import AdvancedDataRegressionFixture from dom_toml.parser import BadConfigError from domdf_python_tools.paths import PathPlus, in_directory from packaging.markers import Marker from packaging.requirements import InvalidRequirement from packaging.version import Version from pyproject_examples import bad_pep621_config from pyproject_examples.example_configs import ( AUTHORS, CLASSIFIERS, DEPENDENCIES, ENTRY_POINTS, KEYWORDS, MAINTAINERS, MINIMAL_CONFIG, OPTIONAL_DEPENDENCIES, UNICODE, URLS ) from pyproject_parser.classes import License, Readme from pyproject_parser.type_hints import Author, Dynamic from shippinglabel.requirements import ComparableRequirement from typing_extensions import TypedDict # this package from whey.builder import AbstractBuilder from whey.config import PEP621Parser, backfill_classifiers, load_toml COMPLETE_PROJECT_A = """\ [project] name = "spam" version = "2020.0.0" description = "Lovely Spam! Wonderful Spam!" requires-python = ">=3.8" keywords = ["egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor"] authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-ping Chung"} ] maintainers = [ {name = "Brett Cannon", email = "brett@python.org"} ] classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python" ] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.optional-dependencies] test = [ "pytest < 5.0.0", "pytest-cov[all]" ] [project.urls] homepage = "example.com" documentation = "readthedocs.org" repository = "github.com" changelog = "github.com/me/spam/blob/master/CHANGELOG.md" [project.scripts] spam-cli = "spam:main_cli" [project.gui-scripts] spam-gui = "spam:main_gui" [project.entry-points."spam.magical"] tomatoes = "spam:main_tomatoes" """ COMPLETE_A = """\ [build-system] requires = [ "whey",] build-backend = "whey" [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python",] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" """ COMPLETE_B = """\ [build-system] requires = [ "whey",] build-backend = "whey" [project] name = "Whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python",] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" package = "whey" additional-files = [ "include whey/style.css", ] """ def check_config( config: Dict[str, Any], data_regression: AdvancedDataRegressionFixture, ) -> None: assert "builders" in config builders = config.pop("builders") assert all(isinstance(name, str) for name in builders) assert all(issubclass(name, AbstractBuilder) for name in builders.values()) if "requires-python" in config and config["requires-python"] is not None: config["requires-python"] = str(config["requires-python"]) if "version" in config and config["version"] is not None: config["version"] = str(config["version"]) data_regression.check(config) @pytest.mark.parametrize( "toml_config", [ pytest.param(MINIMAL_CONFIG, id="minimal"), pytest.param(f'{MINIMAL_CONFIG}\ndescription = "Lovely Spam! Wonderful Spam!"', id="description"), pytest.param(f'{MINIMAL_CONFIG}\nrequires-python = ">=3.8"', id="requires-python"), pytest.param( f'{MINIMAL_CONFIG}\nrequires-python = ">=2.7,!=3.0.*,!=3.2.*"', id="requires-python_complex" ), pytest.param(KEYWORDS, id="keywords"), pytest.param(AUTHORS, id="authors"), pytest.param(MAINTAINERS, id="maintainers"), pytest.param(CLASSIFIERS, id="classifiers"), pytest.param(DEPENDENCIES, id="dependencies"), pytest.param(OPTIONAL_DEPENDENCIES, id="optional-dependencies"), pytest.param(URLS, id="urls"), pytest.param(ENTRY_POINTS, id="entry_points"), pytest.param(UNICODE, id="unicode"), pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_parse_valid_config( toml_config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_clean(toml_config) config = load_toml(tmp_pathplus / "pyproject.toml") if "dependencies" in config: config["dependencies"] = list(map(str, config["dependencies"])) if "optional-dependencies" in config: config["optional-dependencies"] = { k: list(map(str, v)) for k, v in config["optional-dependencies"].items() } check_config(config, advanced_data_regression) ProjectDictPureClasses = TypedDict( "ProjectDictPureClasses", { "name": str, "version": Union[Version, str, None], "description": Optional[str], "readme": Optional[Readme], "requires-python": Union[Marker, str, None], "license": Optional[License], "authors": List[Author], "maintainers": List[Author], "keywords": List[str], "classifiers": List[str], "urls": Dict[str, str], "scripts": Dict[str, str], "gui-scripts": Dict[str, str], "entry-points": Dict[str, Dict[str, str]], "dependencies": Union[List[ComparableRequirement], List[str]], "optional-dependencies": Union[Dict[str, List[ComparableRequirement]], Dict[str, List[str]]], "dynamic": List[Dynamic], } ) @pytest.mark.parametrize( "toml_config", [ pytest.param(MINIMAL_CONFIG, id="minimal"), pytest.param(f'{MINIMAL_CONFIG}\ndescription = "Lovely Spam! Wonderful Spam!"', id="description"), pytest.param(f'{MINIMAL_CONFIG}\nrequires-python = ">=3.8"', id="requires-python"), pytest.param( f'{MINIMAL_CONFIG}\nrequires-python = ">=2.7,!=3.0.*,!=3.2.*"', id="requires-python_complex" ), pytest.param(KEYWORDS, id="keywords"), pytest.param(AUTHORS, id="authors"), pytest.param(MAINTAINERS, id="maintainers"), pytest.param(CLASSIFIERS, id="classifiers"), pytest.param(DEPENDENCIES, id="dependencies"), pytest.param(OPTIONAL_DEPENDENCIES, id="optional-dependencies"), pytest.param(URLS, id="urls"), pytest.param(ENTRY_POINTS, id="entry_points"), pytest.param(UNICODE, id="unicode"), pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_pep621_class_valid_config( toml_config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_clean(toml_config) with in_directory(tmp_pathplus): config = cast( ProjectDictPureClasses, PEP621Parser().parse(dom_toml.load(tmp_pathplus / "pyproject.toml")["project"]), ) if "dependencies" in config: config["dependencies"] = list(map(str, config["dependencies"])) if "optional-dependencies" in config: config["optional-dependencies"] = { k: list(map(str, v)) for k, v in config["optional-dependencies"].items() } if "requires-python" in config and config["requires-python"] is not None: config["requires-python"] = str(config["requires-python"]) if "version" in config and config["version"] is not None: config["version"] = str(config["version"]) advanced_data_regression.check(config) @pytest.mark.parametrize("filename", ["README.rst", "README.md", "INTRODUCTION.md", "readme.txt"]) def test_parse_valid_config_readme( filename: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_lines([ "[project]", 'name = "spam"', 'version = "2020.0.0"', f'readme = {filename!r}', ]) (tmp_pathplus / filename).write_text("This is the readme.") config = load_toml(tmp_pathplus / "pyproject.toml") check_config(config, advanced_data_regression) @pytest.mark.parametrize( "readme", [ pytest.param('readme = {file = "README.rst"}', id="rst_file"), pytest.param('readme = {file = "README.md"}', id="md_file"), pytest.param('readme = {file = "README.txt"}', id="txt_file"), pytest.param( 'readme = {text = "This is the inline README README.", content-type = "text/x-rst"}', id="text_content_type_rst" ), pytest.param( 'readme = {text = "This is the inline markdown README.", content-type = "text/markdown"}', id="text_content_type_md" ), pytest.param( 'readme = {text = "This is the inline README.", content-type = "text/plain"}', id="text_content_type_plain" ), ] ) def test_parse_valid_config_readme_dict( readme: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_lines([ "[project]", 'name = "spam"', 'version = "2020.0.0"', readme, ]) (tmp_pathplus / "README.rst").write_text("This is the reStructuredText README.") (tmp_pathplus / "README.md").write_text("This is the markdown README.") (tmp_pathplus / "README.txt").write_text("This is the plaintext README.") (tmp_pathplus / "README").write_text("This is the README.") config = load_toml(tmp_pathplus / "pyproject.toml") check_config(config, advanced_data_regression) _bad_readmes = pytest.mark.parametrize( "readme, expected, exception", [ pytest.param( "readme = {}", "The 'project.readme' table cannot be empty.", BadConfigError, id="empty" ), pytest.param( "readme = {fil = 'README.md'}", "Unknown format for 'project.readme': {'fil': 'README.md'}", BadConfigError, id="unknown_key", ), pytest.param( 'readme = {text = "This is the inline README."}', "The 'project.readme.content-type' key must be provided when 'project.readme.text' is given.", BadConfigError, id="text_only" ), pytest.param( 'readme = {content-type = "text/x-rst"}', "The 'project.readme.content-type' key cannot be provided on its own; " "Please provide the 'project.readme.text' key too.", BadConfigError, id="content_type_only" ), pytest.param( 'readme = {charset = "cp1252"}', "The 'project.readme.charset' key cannot be provided on its own; " "Please provide the 'project.readme.text' key too.", BadConfigError, id="charset_only" ), pytest.param( 'readme = {charset = "cp1252", content-type = "text/x-rst"}', "The 'project.readme.content-type' key cannot be provided on its own; " "Please provide the 'project.readme.text' key too.", BadConfigError, id="content_type_charset" ), pytest.param( 'readme = {text = "This is the inline README", content-type = "application/x-abiword"}', "Unrecognised value for 'project.readme.content-type': 'application/x-abiword'", BadConfigError, id="bad_content_type" ), pytest.param( 'readme = {file = "README"}', "Unsupported extension for 'README'", ValueError, id="no_extension" ), pytest.param( 'readme = {file = "README.doc"}', "Unsupported extension for 'README.doc'", ValueError, id="bad_extension" ), pytest.param( 'readme = {file = "README.doc", text = "This is the README"}', "The 'project.readme.file' and 'project.readme.text' keys are mutually exclusive.", BadConfigError, id="file_and_readme" ), ] ) @_bad_readmes def test_bad_config_readme_dict( readme: str, expected: str, exception: Type[Exception], tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_lines([ "[project]", 'name = "spam"', 'version = "2020.0.0"', readme, ]) with pytest.raises(exception, match=expected): load_toml(tmp_pathplus / "pyproject.toml") @_bad_readmes def test_pep621parser_class_bad_config( readme: str, expected: str, exception: Type[Exception], tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_lines([ "[project]", 'name = "spam"', 'version = "2020.0.0"', readme, ]) with in_directory(tmp_pathplus), pytest.raises(exception, match=expected): PEP621Parser().parse(dom_toml.load(tmp_pathplus / "pyproject.toml")["project"]) def test_parse_builders( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): toml_config = dedent( """ [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python",] [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" [tool.whey.builders] sdist = "whey_sdist" wheel = "whey_wheel" """ ) (tmp_pathplus / "pyproject.toml").write_clean(toml_config) config = load_toml(tmp_pathplus / "pyproject.toml") check_config(config, advanced_data_regression) def test_parse_dynamic_requirements( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): toml_config = dedent( """ [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python", "dependencies",] [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" """ ) (tmp_pathplus / "pyproject.toml").write_clean(toml_config) (tmp_pathplus / "requirements.txt").write_lines([ "apeye>=0.7.0", "click>=7.1.2", "consolekit>=1.0.1", "domdf-python-tools>=2.5.2", "email-validator>=1.1.2", "first>=2.0.2", "natsort>=7.1.1", "packaging>=20.9", "readme-renderer[md]>=28.0", "shippinglabel>=0.10.0", "toml>=0.10.2", ]) config = load_toml(tmp_pathplus / "pyproject.toml") if "dependencies" in config: config["dependencies"] = list(map(str, config["dependencies"])) check_config(config, advanced_data_regression) def test_parse_dynamic_requirements_invalid(tmp_pathplus: PathPlus, ): toml_config = dedent( """ [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python", "dependencies",] [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" """ ) (tmp_pathplus / "pyproject.toml").write_clean(toml_config) (tmp_pathplus / "requirements.txt").write_lines([ "apeye>=0.7.0", "# a comment", "click>=7.1.2", "consolekit>=1.0.1", "not a requirement", ]) with pytest.raises(InvalidRequirement, match="not a requirement"): load_toml(tmp_pathplus / "pyproject.toml") @pytest.mark.parametrize("filename", ["LICENSE.rst", "LICENSE.md", "LICENSE.txt", "LICENSE"]) def test_parse_valid_config_license( filename: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_lines([ f'[project]', f'name = "spam"', f'version = "2020.0.0"', f'license = {{file = "{filename}"}}', ]) (tmp_pathplus / filename).write_text("This is the license.") config = load_toml(tmp_pathplus / "pyproject.toml") check_config(config, advanced_data_regression) def test_parse_valid_config_license_text( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_lines([ f'[project]', f'name = "spam"', f'version = "2020.0.0"', f'license = {{text = "This is the MIT License"}}', ]) config = load_toml(tmp_pathplus / "pyproject.toml") check_config(config, advanced_data_regression) @pytest.mark.parametrize( "license_key, expected", [ pytest.param( "license = {}", "The 'project.license' table should contain one of 'text' or 'file'.", id="empty" ), pytest.param( 'license = {text = "MIT", file = "LICENSE.txt"}', "The 'project.license.file' and 'project.license.text' keys are mutually exclusive.", id="double_license" ), ] ) def test_bad_config_license( license_key: str, expected: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, ): (tmp_pathplus / "pyproject.toml").write_lines([ f'[project]', f'name = "spam"', f'version = "2020.0.0"', license_key, ]) with pytest.raises(BadConfigError, match=expected): load_toml(tmp_pathplus / "pyproject.toml") @pytest.mark.parametrize( "config, expects, match", [ pytest.param('', KeyError, "'project' table not found in '.*'", id="no_config"), pytest.param( '[project]\nname = "spam"', BadConfigError, "The 'project.version' field must be provided.", id="no_version" ), *bad_pep621_config, ] ) def test_parse_config_errors(config: str, expects: Type[Exception], match: str, tmp_pathplus: PathPlus): (tmp_pathplus / "pyproject.toml").write_clean(config) with pytest.raises(expects, match=match): load_toml(tmp_pathplus / "pyproject.toml") @pytest.mark.parametrize( "config, expects, match", [ pytest.param( '[project]\nname = "spam"', BadConfigError, "The 'project.version' field must be provided.", id="no_version" ), *bad_pep621_config, ] ) def test_pep621parser_class_errors(config: str, expects: Type[Exception], match: str, tmp_pathplus: PathPlus): (tmp_pathplus / "pyproject.toml").write_clean(config) with in_directory(tmp_pathplus), pytest.raises(expects, match=match): PEP621Parser().parse(dom_toml.load(tmp_pathplus / "pyproject.toml")["project"]) @pytest.mark.parametrize("filename", ["README", "README.rtf"]) def test_parse_config_readme_errors(filename: str, tmp_pathplus: PathPlus): config = dedent(f""" [project] name = "spam" version = "2020.0.0" readme = "{filename}" """) (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / filename).write_text("This is the readme.") with pytest.raises(ValueError, match=f"Unsupported extension for '{filename}'"): load_toml(tmp_pathplus / "pyproject.toml") _backfill_base_dict: Dict[str, Any] = { "base-classifiers": [], "source-dir": '.', "license-key": None, "platforms": None, "python-versions": None, "python-implementations": None, } @pytest.mark.parametrize( "config", [ pytest.param(_backfill_base_dict, id="defaults"), pytest.param({**_backfill_base_dict, "platforms": ["Windows"]}, id="Windows"), pytest.param({**_backfill_base_dict, "platforms": ["macOS"]}, id="macOS"), pytest.param({**_backfill_base_dict, "platforms": ["Linux"]}, id="Linux"), pytest.param({**_backfill_base_dict, "platforms": ["BSD"]}, id="BSD"), pytest.param( {**_backfill_base_dict, "platforms": ["Windows", "Linux"]}, id="Multiple Platforms_1", ), pytest.param( {**_backfill_base_dict, "platforms": ["macOS", "Linux"]}, id="Multiple Platforms_2", ), pytest.param( {**_backfill_base_dict, "platforms": ["Windows", "macOS", "Linux"]}, id="All Platforms", ), pytest.param({**_backfill_base_dict, "python-versions": ["3.6"]}, id="py36"), pytest.param({**_backfill_base_dict, "python-versions": ["3.7"]}, id="py37"), pytest.param({**_backfill_base_dict, "python-versions": ["3.8"]}, id="py38"), pytest.param({**_backfill_base_dict, "python-versions": ["3.9"]}, id="py39"), pytest.param( {**_backfill_base_dict, "python-versions": ["3.6", "3.8", "3.9"]}, id="multiple_py_versions", ), pytest.param( {**_backfill_base_dict, "python-implementations": ["CPython"]}, id="CPython", ), pytest.param( {**_backfill_base_dict, "python-implementations": ["PyPy"]}, id="PyPy", ), pytest.param( {**_backfill_base_dict, "python-implementations": ["CPython", "PyPy"]}, id="Multiple Implementations", ), pytest.param( {**_backfill_base_dict, "python-implementations": ["GraalPython"]}, id="GraalPython", ), pytest.param({**_backfill_base_dict, "license-key": "MIT"}, id="MIT License"), pytest.param({**_backfill_base_dict, "license-key": "GPLv2"}, id="GPLv2"), pytest.param( {**_backfill_base_dict, "license-key": "LGPL-3.0-or-later"}, id="LGPL-3.0-or-later", ), ] ) def test_backfill_classifiers(config: Dict[str, str], advanced_data_regression: AdvancedDataRegressionFixture): advanced_data_regression.check(backfill_classifiers(config)) @pytest.mark.parametrize( "config, match", [ pytest.param( f"{MINIMAL_CONFIG}\ndynamic = ['version']", "Unsupported dynamic field 'version'.\nnote: whey only supports .* as dynamic fields.", id="version" ), pytest.param( f"{MINIMAL_CONFIG}\ndynamic = ['optional-dependencies']", "Unsupported dynamic field 'optional-dependencies'.\nnote: whey only supports .* as dynamic fields.", id="optional-dependencies" ), pytest.param( f"{MINIMAL_CONFIG}\ndynamic = ['authors']", "Unsupported dynamic field 'authors'.\nnote: whey only supports .* as dynamic fields.", id="authors" ), pytest.param( f"{MINIMAL_CONFIG}\ndynamic = ['keywords']", "Unsupported dynamic field 'keywords'.\nnote: whey only supports .* as dynamic fields.", id="keywords" ), pytest.param( f"{MINIMAL_CONFIG}\ndependencies = ['foo']\ndynamic = ['dependencies']", "'dependencies' was listed in 'project.dynamic' but a value was given.", id="dynamic_but_given" ), ] ) def test_bad_config_dynamic( config: str, match: str, tmp_pathplus: PathPlus, ): (tmp_pathplus / "pyproject.toml").write_clean(config) with pytest.raises(BadConfigError, match=match): load_toml(tmp_pathplus / "pyproject.toml") @pytest.mark.parametrize( "config, exception, match", [ pytest.param( "package = 1234", TypeError, "Invalid type for 'tool.whey.package': expected , got ", id="package-int" ), pytest.param( "package = ['spam', 'eggs']", TypeError, "Invalid type for 'tool.whey.package': expected , got ", id="package-list" ), pytest.param( "source-dir = 1234", TypeError, "Invalid type for 'tool.whey.source-dir': expected , got ", id="source-dir-int" ), pytest.param( "source-dir = ['spam', 'eggs']", TypeError, "Invalid type for 'tool.whey.source-dir': expected , got ", id="source-dir-list" ), pytest.param( "license-key = 1234", TypeError, "Invalid type for 'tool.whey.license-key': expected , got ", id="license-key-int" ), pytest.param( "license-key = ['MIT', 'Apache2']", TypeError, "Invalid type for 'tool.whey.license-key': expected , got ", id="license-key-list" ), pytest.param( "license-key = {file = 'LICENSE'}", TypeError, "Invalid type for 'tool.whey.license-key': expected , got ", id="license-key-dict" ), # pytest.param( # "additional-files = 'include foo.bar'", # TypeError, # "Invalid type for 'tool.whey.additional-files': expected , got ", # id="additional-files-dict" # ), pytest.param( "python-versions = ['2.7']", BadConfigError, r"Invalid value for 'tool.whey.python-versions\[0\]': whey only supports Python 3-only projects.", id="python-versions-2.7-string" ), pytest.param( "python-versions = [2.7]", BadConfigError, r"Invalid value for 'tool.whey.python-versions\[0\]': whey only supports Python 3-only projects.", id="python-versions-2.7-float" ), pytest.param( "python-versions = ['1.6']", BadConfigError, r"Invalid value for 'tool.whey.python-versions\[0\]': whey only supports Python 3-only projects.", id="python-versions-1.6-string" ), ] ) def test_bad_config_whey_table( config: str, exception: Type[Exception], match: str, tmp_pathplus: PathPlus, ): (tmp_pathplus / "pyproject.toml").write_clean(f"{MINIMAL_CONFIG}\n[tool.whey]\n{config}") with pytest.raises(exception, match=match): load_toml(tmp_pathplus / "pyproject.toml") whey-0.0.24/tests/test_config_/000077500000000000000000000000001442026364700163665ustar00rootroot00000000000000whey-0.0.24/tests/test_config_/test_backfill_classifiers_All_Platforms_.yml000066400000000000000000000001121442026364700272560ustar00rootroot00000000000000- 'Operating System :: OS Independent' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_BSD_.yml000066400000000000000000000000431442026364700251320ustar00rootroot00000000000000- 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_CPython_.yml000066400000000000000000000001431442026364700261070ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: Implementation :: CPython' whey-0.0.24/tests/test_config_/test_backfill_classifiers_GPLv2_.yml000066400000000000000000000001501442026364700254130ustar00rootroot00000000000000- 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_GraalPython_.yml000066400000000000000000000001471442026364700267570ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: Implementation :: GraalPython' whey-0.0.24/tests/test_config_/test_backfill_classifiers_LGPL_3_0_or_later_.yml000066400000000000000000000001721442026364700276130ustar00rootroot00000000000000- 'License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_Linux_.yml000066400000000000000000000001121442026364700256160ustar00rootroot00000000000000- 'Operating System :: POSIX :: Linux' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_MIT_License_.yml000066400000000000000000000001161442026364700266160ustar00rootroot00000000000000- 'License :: OSI Approved :: MIT License' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_Multiple_Implementations_.yml000066400000000000000000000002401442026364700315440ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: Implementation :: CPython' - 'Programming Language :: Python :: Implementation :: PyPy' whey-0.0.24/tests/test_config_/test_backfill_classifiers_Multiple_Platforms_1_.yml000066400000000000000000000001671442026364700305730ustar00rootroot00000000000000- 'Operating System :: Microsoft :: Windows' - 'Operating System :: POSIX :: Linux' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_Multiple_Platforms_2_.yml000066400000000000000000000001501442026364700305640ustar00rootroot00000000000000- 'Operating System :: MacOS' - 'Operating System :: POSIX :: Linux' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_PyPy_.yml000066400000000000000000000001401442026364700254210ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: Implementation :: PyPy' whey-0.0.24/tests/test_config_/test_backfill_classifiers_Windows_.yml000066400000000000000000000001201442026364700261500ustar00rootroot00000000000000- 'Operating System :: Microsoft :: Windows' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_defaults_.yml000066400000000000000000000000431442026364700263310ustar00rootroot00000000000000- 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_macOS_.yml000066400000000000000000000001011442026364700255170ustar00rootroot00000000000000- 'Operating System :: MacOS' - 'Programming Language :: Python' whey-0.0.24/tests/test_config_/test_backfill_classifiers_multiple_py_versions_.yml000066400000000000000000000003211442026364700310140ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.6' - 'Programming Language :: Python :: 3.8' - 'Programming Language :: Python :: 3.9' whey-0.0.24/tests/test_config_/test_backfill_classifiers_py36_.yml000066400000000000000000000001751442026364700253310ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.6' whey-0.0.24/tests/test_config_/test_backfill_classifiers_py37_.yml000066400000000000000000000001751442026364700253320ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.7' whey-0.0.24/tests/test_config_/test_backfill_classifiers_py38_.yml000066400000000000000000000001751442026364700253330ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.8' whey-0.0.24/tests/test_config_/test_backfill_classifiers_py39_.yml000066400000000000000000000001751442026364700253340ustar00rootroot00000000000000- 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.9' whey-0.0.24/tests/test_config_/test_parse_builders.yml000066400000000000000000000021651442026364700231570ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: - 'Development Status :: 4 - Beta' - 'License :: OSI Approved :: MIT License' - 'Operating System :: OS Independent' - 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.6' - 'Programming Language :: Python :: 3.7' - 'Programming Language :: Python :: 3.8' - 'Programming Language :: Python :: 3.9' - 'Programming Language :: Python :: 3.10' - 'Programming Language :: Python :: Implementation :: CPython' - 'Programming Language :: Python :: Implementation :: PyPy' dependencies: [] description: A simple Python wheel builder for simple projects. dynamic: - classifiers - requires-python entry-points: {} gui-scripts: {} keywords: - build - distribution - packaging - pep517 - pep621 - sdist - wheel license: null license-key: MIT maintainers: [] name: whey optional-dependencies: {} package: whey platforms: - Windows - macOS - Linux python-implementations: - CPython - PyPy python-versions: - '3.6' - '3.7' - '3.8' - '3.9' - '3.10' readme: null requires-python: '>=3.6' scripts: {} source-dir: . urls: {} version: 2021.0.0 whey-0.0.24/tests/test_config_/test_parse_dynamic_requirements.yml000066400000000000000000000025351442026364700255760ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: - 'Development Status :: 4 - Beta' - 'License :: OSI Approved :: MIT License' - 'Operating System :: OS Independent' - 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.6' - 'Programming Language :: Python :: 3.7' - 'Programming Language :: Python :: 3.8' - 'Programming Language :: Python :: 3.9' - 'Programming Language :: Python :: 3.10' - 'Programming Language :: Python :: Implementation :: CPython' - 'Programming Language :: Python :: Implementation :: PyPy' dependencies: - apeye>=0.7.0 - click>=7.1.2 - consolekit>=1.0.1 - domdf-python-tools>=2.5.2 - email-validator>=1.1.2 - first>=2.0.2 - natsort>=7.1.1 - packaging>=20.9 - readme-renderer[md]>=28.0 - shippinglabel>=0.10.0 - toml>=0.10.2 description: A simple Python wheel builder for simple projects. dynamic: - classifiers - requires-python - dependencies entry-points: {} gui-scripts: {} keywords: - build - distribution - packaging - pep517 - pep621 - sdist - wheel license: null license-key: MIT maintainers: [] name: whey optional-dependencies: {} package: whey platforms: - Windows - macOS - Linux python-implementations: - CPython - PyPy python-versions: - '3.6' - '3.7' - '3.8' - '3.9' - '3.10' readme: null requires-python: '>=3.6' scripts: {} source-dir: . urls: {} version: 2021.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_COMPLETE_A_.yml000066400000000000000000000027421442026364700256620ustar00rootroot00000000000000additional-files: [] authors: - email: dominic@davis-foster.co.uk name: Dominic Davis-Foster classifiers: - 'Development Status :: 4 - Beta' - 'License :: OSI Approved :: MIT License' - 'Operating System :: OS Independent' - 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.6' - 'Programming Language :: Python :: 3.7' - 'Programming Language :: Python :: 3.8' - 'Programming Language :: Python :: 3.9' - 'Programming Language :: Python :: 3.10' - 'Programming Language :: Python :: Implementation :: CPython' - 'Programming Language :: Python :: Implementation :: PyPy' dependencies: - django>2.1; os_name != "nt" - django>2.0; os_name == "nt" - gidgethub[httpx]>4.0.0 - httpx description: A simple Python wheel builder for simple projects. dynamic: - classifiers - requires-python entry-points: {} gui-scripts: {} keywords: - build - distribution - packaging - pep517 - pep621 - sdist - wheel license: null license-key: MIT maintainers: [] name: whey optional-dependencies: {} package: whey platforms: - Windows - macOS - Linux python-implementations: - CPython - PyPy python-versions: - '3.6' - '3.7' - '3.8' - '3.9' - '3.10' readme: null requires-python: '>=3.6' scripts: {} source-dir: . urls: Documentation: https://whey.readthedocs.io/en/latest Homepage: https://whey.readthedocs.io/en/latest Issue Tracker: https://github.com/repo-helper/whey/issues Source Code: https://github.com/repo-helper/whey version: 2021.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_COMPLETE_B_.yml000066400000000000000000000027701442026364700256640ustar00rootroot00000000000000additional-files: - include whey/style.css authors: - email: dominic@davis-foster.co.uk name: Dominic Davis-Foster classifiers: - 'Development Status :: 4 - Beta' - 'License :: OSI Approved :: MIT License' - 'Operating System :: OS Independent' - 'Programming Language :: Python' - 'Programming Language :: Python :: 3 :: Only' - 'Programming Language :: Python :: 3.6' - 'Programming Language :: Python :: 3.7' - 'Programming Language :: Python :: 3.8' - 'Programming Language :: Python :: 3.9' - 'Programming Language :: Python :: 3.10' - 'Programming Language :: Python :: Implementation :: CPython' - 'Programming Language :: Python :: Implementation :: PyPy' dependencies: - django>2.1; os_name != "nt" - django>2.0; os_name == "nt" - gidgethub[httpx]>4.0.0 - httpx description: A simple Python wheel builder for simple projects. dynamic: - classifiers - requires-python entry-points: {} gui-scripts: {} keywords: - build - distribution - packaging - pep517 - pep621 - sdist - wheel license: null license-key: MIT maintainers: [] name: whey optional-dependencies: {} package: whey platforms: - Windows - macOS - Linux python-implementations: - CPython - PyPy python-versions: - '3.6' - '3.7' - '3.8' - '3.9' - '3.10' readme: null requires-python: '>=3.6' scripts: {} source-dir: . urls: Documentation: https://whey.readthedocs.io/en/latest Homepage: https://whey.readthedocs.io/en/latest Issue Tracker: https://github.com/repo-helper/whey/issues Source Code: https://github.com/repo-helper/whey version: 2021.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_COMPLETE_PROJECT_A_.yml000066400000000000000000000017721442026364700270520ustar00rootroot00000000000000additional-files: [] authors: - email: hi@pradyunsg.me name: null - email: null name: Tzu-ping Chung classifiers: - 'Development Status :: 4 - Beta' - 'Programming Language :: Python' dependencies: - django>2.1; os_name != "nt" - django>2.0; os_name == "nt" - gidgethub[httpx]>4.0.0 - httpx description: Lovely Spam! Wonderful Spam! dynamic: [] entry-points: spam.magical: tomatoes: spam:main_tomatoes gui-scripts: spam-gui: spam:main_gui keywords: - bacon - egg - Lobster Thermidor - sausage - tomatoes license: null license-key: null maintainers: - email: brett@python.org name: Brett Cannon name: spam optional-dependencies: test: - pytest<5.0.0 - pytest-cov[all] package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: '>=3.8' scripts: spam-cli: spam:main_cli source-dir: . urls: changelog: github.com/me/spam/blob/master/CHANGELOG.md documentation: readthedocs.org homepage: example.com repository: github.com version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_authors_.yml000066400000000000000000000007241442026364700256750ustar00rootroot00000000000000additional-files: [] authors: - email: hi@pradyunsg.me name: null - email: null name: Tzu-Ping Chung classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_classifiers_.yml000066400000000000000000000007171442026364700265210ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: - 'Development Status :: 4 - Beta' - 'Programming Language :: Python' dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_dependencies_.yml000066400000000000000000000007461442026364700266420ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: - django>2.1; os_name != "nt" - django>2.0; os_name == "nt" - gidgethub[httpx]>4.0.0 - httpx description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_description_.yml000066400000000000000000000006441442026364700265340ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: Lovely Spam! Wonderful Spam! dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_entry_points_.yml000066400000000000000000000010401442026364700267350ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: flake8.extension: SXL: flake8_sphinx_links:Plugin spam.magical: tomatoes: spam:main_tomatoes gui-scripts: spam-gui: spam:main_gui keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: spam-cli: spam:main_cli source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_keywords_.yml000066400000000000000000000007001442026364700260510ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: - bacon - egg - Lobster Thermidor - sausage - tomatoes license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_license_LICENSE_.yml000066400000000000000000000006641442026364700267770ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: file: LICENSE text: This is the license. license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_license_LICENSE_md_.yml000066400000000000000000000006671442026364700274620ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: file: LICENSE.md text: This is the license. license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_license_LICENSE_rst_.yml000066400000000000000000000006701442026364700276640ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: file: LICENSE.rst text: This is the license. license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_license_LICENSE_txt_.yml000066400000000000000000000006701442026364700276730ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: file: LICENSE.txt text: This is the license. license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_license_text.yml000066400000000000000000000006471442026364700265430ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: text: This is the MIT License license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_maintainers_.yml000066400000000000000000000006701442026364700265220ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: - email: brett@python.org name: Brett Cannon name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_minimal_.yml000066400000000000000000000006141442026364700256340ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_optional_dependencies_.yml000066400000000000000000000010051442026364700305340ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: test: - matplotlib>=3.0.0; platform_machine != "aarch64" or python_version > "3.6" - pytest<5.0.0 - pytest-cov[all] package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_INTRODUCTION_md_.yml000066400000000000000000000007311442026364700301240ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/markdown file: INTRODUCTION.md text: This is the readme. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_README_md_.yml000066400000000000000000000007231442026364700271410ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/markdown file: README.md text: This is the readme. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_README_rst_.yml000066400000000000000000000007211442026364700273470ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/x-rst file: README.rst text: This is the readme. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_dict_md_file_.yml000066400000000000000000000007341442026364700301300ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/markdown file: README.md text: This is the markdown README. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_dict_rst_file_.yml000066400000000000000000000007421442026364700303370ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/x-rst file: README.rst text: This is the reStructuredText README. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_dict_text_content_type_md_.yml000066400000000000000000000007211442026364700327640ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/markdown text: This is the inline markdown README. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_dict_text_content_type_plain_.yml000066400000000000000000000007051442026364700334710ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/plain text: This is the inline README. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_dict_text_content_type_rst_.yml000066400000000000000000000007141442026364700331760ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/x-rst text: This is the inline README README. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_dict_txt_file_.yml000066400000000000000000000007331442026364700303460ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/plain file: README.txt text: This is the plaintext README. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_readme_readme_txt_.yml000066400000000000000000000007211442026364700276560ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: content_type: text/plain file: readme.txt text: This is the readme. requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_requires_python_.yml000066400000000000000000000006171442026364700274510ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: '>=3.8' scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_requires_python_complex_.yml000066400000000000000000000006371442026364700312020ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: '!=3.0.*,!=3.2.*,>=2.7' scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_unicode_.yml000066400000000000000000000007121442026364700256330ustar00rootroot00000000000000additional-files: [] authors: - email: null name: Łukasz Langa classifiers: [] dependencies: [] description: Factory ⸻ A code generator 🏭 dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: {} version: 2020.0.0 whey-0.0.24/tests/test_config_/test_parse_valid_config_urls_.yml000066400000000000000000000010241442026364700251670ustar00rootroot00000000000000additional-files: [] authors: [] classifiers: [] dependencies: [] description: null dynamic: [] entry-points: {} gui-scripts: {} keywords: [] license: null license-key: null maintainers: [] name: spam optional-dependencies: {} package: spam platforms: null python-implementations: null python-versions: null readme: null requires-python: null scripts: {} source-dir: . urls: changelog: github.com/me/spam/blob/master/CHANGELOG.md documentation: readthedocs.org homepage: example.com repository: github.com version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_COMPLETE_A_.yml000066400000000000000000000011501442026364700267420ustar00rootroot00000000000000authors: - email: dominic@davis-foster.co.uk name: Dominic Davis-Foster dependencies: - django>2.1; os_name != "nt" - django>2.0; os_name == "nt" - gidgethub[httpx]>4.0.0 - httpx description: A simple Python wheel builder for simple projects. dynamic: - classifiers - requires-python keywords: - build - distribution - packaging - pep517 - pep621 - sdist - wheel name: whey urls: Documentation: https://whey.readthedocs.io/en/latest Homepage: https://whey.readthedocs.io/en/latest Issue Tracker: https://github.com/repo-helper/whey/issues Source Code: https://github.com/repo-helper/whey version: 2021.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_COMPLETE_B_.yml000066400000000000000000000011501442026364700267430ustar00rootroot00000000000000authors: - email: dominic@davis-foster.co.uk name: Dominic Davis-Foster dependencies: - django>2.1; os_name != "nt" - django>2.0; os_name == "nt" - gidgethub[httpx]>4.0.0 - httpx description: A simple Python wheel builder for simple projects. dynamic: - classifiers - requires-python keywords: - build - distribution - packaging - pep517 - pep621 - sdist - wheel name: whey urls: Documentation: https://whey.readthedocs.io/en/latest Homepage: https://whey.readthedocs.io/en/latest Issue Tracker: https://github.com/repo-helper/whey/issues Source Code: https://github.com/repo-helper/whey version: 2021.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_COMPLETE_PROJECT_A_.yml000066400000000000000000000015311442026364700301330ustar00rootroot00000000000000authors: - email: hi@pradyunsg.me name: null - email: null name: Tzu-ping Chung classifiers: - 'Development Status :: 4 - Beta' - 'Programming Language :: Python' dependencies: - django>2.1; os_name != "nt" - django>2.0; os_name == "nt" - gidgethub[httpx]>4.0.0 - httpx description: Lovely Spam! Wonderful Spam! dynamic: [] entry-points: spam.magical: tomatoes: spam:main_tomatoes gui-scripts: spam-gui: spam:main_gui keywords: - bacon - egg - Lobster Thermidor - sausage - tomatoes maintainers: - email: brett@python.org name: Brett Cannon name: spam optional-dependencies: test: - pytest<5.0.0 - pytest-cov[all] requires-python: '>=3.8' scripts: spam-cli: spam:main_cli urls: changelog: github.com/me/spam/blob/master/CHANGELOG.md documentation: readthedocs.org homepage: example.com repository: github.com version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_authors_.yml000066400000000000000000000001751442026364700267650ustar00rootroot00000000000000authors: - email: hi@pradyunsg.me name: null - email: null name: Tzu-Ping Chung dynamic: [] name: spam version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_classifiers_.yml000066400000000000000000000001741442026364700276060ustar00rootroot00000000000000classifiers: - 'Development Status :: 4 - Beta' - 'Programming Language :: Python' dynamic: [] name: spam version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_dependencies_.yml000066400000000000000000000002241442026364700277210ustar00rootroot00000000000000dependencies: - django>2.1; os_name != "nt" - django>2.0; os_name == "nt" - gidgethub[httpx]>4.0.0 - httpx dynamic: [] name: spam version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_description_.yml000066400000000000000000000001231442026364700276140ustar00rootroot00000000000000description: Lovely Spam! Wonderful Spam! dynamic: [] name: spam version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_entry_points_.yml000066400000000000000000000003521442026364700300320ustar00rootroot00000000000000dynamic: [] entry-points: flake8.extension: SXL: flake8_sphinx_links:Plugin spam.magical: tomatoes: spam:main_tomatoes gui-scripts: spam-gui: spam:main_gui name: spam scripts: spam-cli: spam:main_cli version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_keywords_.yml000066400000000000000000000001521442026364700271420ustar00rootroot00000000000000dynamic: [] keywords: - bacon - egg - Lobster Thermidor - sausage - tomatoes name: spam version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_maintainers_.yml000066400000000000000000000001451442026364700276070ustar00rootroot00000000000000dynamic: [] maintainers: - email: brett@python.org name: Brett Cannon name: spam version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_minimal_.yml000066400000000000000000000000511442026364700267170ustar00rootroot00000000000000dynamic: [] name: spam version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_optional_dependencies_.yml000066400000000000000000000002741442026364700316330ustar00rootroot00000000000000dynamic: [] name: spam optional-dependencies: test: - matplotlib>=3.0.0; platform_machine != "aarch64" or python_version > "3.6" - pytest<5.0.0 - pytest-cov[all] version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_requires_python_.yml000066400000000000000000000001021442026364700305260ustar00rootroot00000000000000dynamic: [] name: spam requires-python: '>=3.8' version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_requires_python_complex_.yml000066400000000000000000000001221442026364700322570ustar00rootroot00000000000000dynamic: [] name: spam requires-python: '!=3.0.*,!=3.2.*,>=2.7' version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_unicode_.yml000066400000000000000000000002051442026364700267200ustar00rootroot00000000000000authors: - email: null name: Łukasz Langa description: Factory ⸻ A code generator 🏭 dynamic: [] name: spam version: 2020.0.0 whey-0.0.24/tests/test_config_/test_pep621_class_valid_config_urls_.yml000066400000000000000000000002721442026364700262630ustar00rootroot00000000000000dynamic: [] name: spam urls: changelog: github.com/me/spam/blob/master/CHANGELOG.md documentation: readthedocs.org homepage: example.com repository: github.com version: 2020.0.0 whey-0.0.24/tests/test_foreman.py000066400000000000000000000201571442026364700167700ustar00rootroot00000000000000# stdlib import tempfile from typing import TYPE_CHECKING, Any, Dict # 3rd party import handy_archives import pytest from coincidence.regressions import AdvancedDataRegressionFixture, check_file_regression from domdf_python_tools.paths import PathPlus from pyproject_examples.example_configs import LONG_REQUIREMENTS, MINIMAL_CONFIG from pytest_regressions.file_regression import FileRegressionFixture # this package from tests.example_configs import COMPLETE_A, COMPLETE_B from whey.foreman import Foreman if TYPE_CHECKING: # 3rd party from _pytest.capture import CaptureFixture def test_build_success( good_config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, file_regression: FileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(good_config) (tmp_pathplus / "spam").mkdir() (tmp_pathplus / "spam" / "__init__.py").write_clean("print('hello world)") data: Dict[str, Any] = {} foreman = Foreman(project_dir=tmp_pathplus) with tempfile.TemporaryDirectory() as tmpdir: wheel = foreman.build_wheel( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) assert zip_file.read_text("spam/__init__.py") == "print('hello world)\n" check_file_regression(zip_file.read_text("spam-2020.0.0.dist-info/METADATA"), file_regression) with tempfile.TemporaryDirectory() as tmpdir: sdist = foreman.build_sdist( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("spam-2020.0.0/spam/__init__.py") == "print('hello world)\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), pytest.param(LONG_REQUIREMENTS, id="LONG_REQUIREMENTS"), ] ) def test_build_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, file_regression: FileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} foreman = Foreman(project_dir=tmp_pathplus) with tempfile.TemporaryDirectory() as tmpdir: wheel = foreman.build_binary( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) assert zip_file.read_text("whey/__init__.py") == "print('hello world)\n" check_file_regression(zip_file.read_text("whey-2021.0.0.dist-info/METADATA"), file_regression) with tempfile.TemporaryDirectory() as tmpdir: sdist = foreman.build_sdist( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world)\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) def test_build_additional_files( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, file_regression: FileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_lines([ COMPLETE_B, '', "additional-files = [", ' "include whey/style.css",', ' "exclude whey/style.css",', ' "include whey/style.css",', ' "recursive-include whey/static *",', ' "recursive-exclude whey/static *.txt",', ']', ]) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "whey" / "style.css").write_clean("This is the style.css file") (tmp_pathplus / "whey" / "static").mkdir() (tmp_pathplus / "whey" / "static" / "foo.py").touch() (tmp_pathplus / "whey" / "static" / "foo.c").touch() (tmp_pathplus / "whey" / "static" / "foo.txt").touch() (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} foreman = Foreman(project_dir=tmp_pathplus) with tempfile.TemporaryDirectory() as tmpdir: wheel = foreman.build_wheel( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) assert zip_file.read_text("whey/__init__.py") == "print('hello world)\n" check_file_regression(zip_file.read_text("whey-2021.0.0.dist-info/METADATA"), file_regression) sdist = foreman.build_sdist(out_dir=tmp_pathplus, verbose=True, colour=False) assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world)\n" assert tar.read_text("whey-2021.0.0/whey/style.css") == "This is the style.css file\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) def test_build_missing_dir(tmp_pathplus: PathPlus): (tmp_pathplus / "pyproject.toml").write_clean(MINIMAL_CONFIG) foreman = Foreman(project_dir=tmp_pathplus) with tempfile.TemporaryDirectory() as tmpdir: with pytest.raises(FileNotFoundError, match="Package directory 'spam' not found."): foreman.build_wheel( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) with tempfile.TemporaryDirectory() as tmpdir: with pytest.raises(FileNotFoundError, match="Package directory 'spam' not found."): foreman.build_sdist( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) def test_build_empty_dir(tmp_pathplus: PathPlus): (tmp_pathplus / "pyproject.toml").write_clean(MINIMAL_CONFIG) (tmp_pathplus / "spam").mkdir() foreman = Foreman(project_dir=tmp_pathplus) with tempfile.TemporaryDirectory() as tmpdir: with pytest.raises(FileNotFoundError, match="No Python source files found in"): foreman.build_wheel( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) with tempfile.TemporaryDirectory() as tmpdir: with pytest.raises(FileNotFoundError, match="No Python source files found in"): foreman.build_sdist( build_dir=tmpdir, out_dir=tmp_pathplus, verbose=True, colour=False, ) # TODO: test with whey-pth to test the entry point extension mechanism whey-0.0.24/tests/test_foreman_/000077500000000000000000000000001442026364700165505ustar00rootroot00000000000000whey-0.0.24/tests/test_foreman_/test_build_additional_files.txt000066400000000000000000000027001442026364700250200ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_foreman_/test_build_additional_files.yml000066400000000000000000000036221442026364700250060ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py - whey-2021.0.0/whey/static/foo.c - whey-2021.0.0/whey/static/foo.py - whey-2021.0.0/whey/style.css stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/style.css -> whey/style.css Removing whey/style.css Copying .../whey/style.css -> whey/style.css Copying .../whey/static/foo.c -> whey/static/foo.c Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/static/foo.txt -> whey/static/foo.txt Removing whey/static/foo.txt Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/style.css -> whey/style.css Removing whey/style.css Copying .../whey/style.css -> whey/style.css Copying .../whey/static/foo.c -> whey/static/foo.c Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/static/foo.txt -> whey/static/foo.txt Removing whey/static/foo.txt Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py - whey/static/foo.c - whey/static/foo.py - whey/style.css whey-0.0.24/tests/test_foreman_/test_build_complete_COMPLETE_A_.txt000066400000000000000000000026021442026364700252260ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_foreman_/test_build_complete_COMPLETE_A_.yml000066400000000000000000000017761442026364700252230ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_foreman_/test_build_complete_COMPLETE_B_.txt000066400000000000000000000027001442026364700252260ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Keywords: build,distribution,packaging,pep517,pep621,sdist,wheel Home-page: https://whey.readthedocs.io/en/latest Project-URL: Home Page, https://whey.readthedocs.io/en/latest Project-URL: Documentation, https://whey.readthedocs.io/en/latest Project-URL: Issue Tracker, https://github.com/repo-helper/whey/issues Project-URL: Source Code, https://github.com/repo-helper/whey Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.6 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_foreman_/test_build_complete_COMPLETE_B_.yml000066400000000000000000000017761442026364700252240ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_foreman_/test_build_complete_LONG_REQUIREMENTS_.txt000066400000000000000000000012221442026364700263150ustar00rootroot00000000000000Metadata-Version: 2.1 Name: whey Version: 2021.0.0 Summary: A simple Python wheel builder for simple projects. Author-email: Dominic Davis-Foster License: MIT Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Requires-Python: >=3.6.1 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx Requires-Dist: typed-ast>=1.4.2; python_version < "3.8" and platform_python_implementation == "CPython" Description-Content-Type: text/x-rst Spam Spam Spam Spam whey-0.0.24/tests/test_foreman_/test_build_complete_LONG_REQUIREMENTS_.yml000066400000000000000000000017761442026364700263150ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_authors_.txt000066400000000000000000000001211442026364700250750ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Author-email: hi@pradyunsg.me whey-0.0.24/tests/test_foreman_/test_build_success_authors_.yml000066400000000000000000000014001442026364700250600ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_classifiers_.txt000066400000000000000000000002111442026364700257170ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Classifier: Development Status :: 4 - Beta Classifier: Programming Language :: Python whey-0.0.24/tests/test_foreman_/test_build_success_classifiers_.yml000066400000000000000000000014001442026364700257020ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_dependencies_.txt000066400000000000000000000003041442026364700260410ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Requires-Dist: django>2.1; os_name != "nt" Requires-Dist: django>2.0; os_name == "nt" Requires-Dist: gidgethub[httpx]>4.0.0 Requires-Dist: httpx whey-0.0.24/tests/test_foreman_/test_build_success_dependencies_.yml000066400000000000000000000014001442026364700260210ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_description_.txt000066400000000000000000000001311442026364700257340ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Summary: Lovely Spam! Wonderful Spam! whey-0.0.24/tests/test_foreman_/test_build_success_description_.yml000066400000000000000000000014001442026364700257160ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_entry_points_.txt000066400000000000000000000000631442026364700261520ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 whey-0.0.24/tests/test_foreman_/test_build_success_entry_points_.yml000066400000000000000000000014001442026364700261300ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_keywords_.txt000066400000000000000000000001521442026364700252630ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Keywords: bacon,egg,Lobster Thermidor,sausage,tomatoes whey-0.0.24/tests/test_foreman_/test_build_success_keywords_.yml000066400000000000000000000014001442026364700252420ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_maintainers_.txt000066400000000000000000000001411442026364700257240ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Author-email: Brett Cannon whey-0.0.24/tests/test_foreman_/test_build_success_maintainers_.yml000066400000000000000000000014001442026364700257050ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_minimal_.txt000066400000000000000000000000631442026364700250430ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 whey-0.0.24/tests/test_foreman_/test_build_success_minimal_.yml000066400000000000000000000014001442026364700250210ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_optional_dependencies_.txt000066400000000000000000000004251442026364700277520ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Requires-Dist: matplotlib>=3.0.0; (platform_machine != "aarch64" or python_version > "3.6") and extra == 'test' Requires-Dist: pytest<5.0.0; extra == 'test' Requires-Dist: pytest-cov[all]; extra == 'test' Provides-Extra: test whey-0.0.24/tests/test_foreman_/test_build_success_optional_dependencies_.yml000066400000000000000000000014001442026364700277260ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_requires_python_.txt000066400000000000000000000001121442026364700266500ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Requires-Python: >=3.8 whey-0.0.24/tests/test_foreman_/test_build_success_requires_python_.yml000066400000000000000000000014001442026364700266330ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_requires_python_complex_.txt000066400000000000000000000001321442026364700304010ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Requires-Python: !=3.0.*,!=3.2.*,>=2.7 whey-0.0.24/tests/test_foreman_/test_build_success_requires_python_complex_.yml000066400000000000000000000014001442026364700303620ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_unicode_.txt000066400000000000000000000001641442026364700250450ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Summary: Factory ⸻ A code generator 🏭 Author: Łukasz Langa whey-0.0.24/tests/test_foreman_/test_build_success_unicode_.yml000066400000000000000000000014001442026364700250210ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_foreman_/test_build_success_urls_.txt000066400000000000000000000003361442026364700244050ustar00rootroot00000000000000Metadata-Version: 2.1 Name: spam Version: 2020.0.0 Home-page: example.com Project-URL: documentation, readthedocs.org Project-URL: repository, github.com Project-URL: changelog, github.com/me/spam/blob/master/CHANGELOG.md whey-0.0.24/tests/test_foreman_/test_build_success_urls_.yml000066400000000000000000000014001442026364700243600ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend.py000066400000000000000000000270111442026364700200250ustar00rootroot00000000000000# stdlib import sys from typing import TYPE_CHECKING, Any, Dict, Optional # 3rd party import handy_archives import pytest from coincidence.regressions import AdvancedDataRegressionFixture from coincidence.selectors import min_version, only_version from domdf_python_tools.paths import PathPlus, in_directory from pyproject_examples.example_configs import ( AUTHORS, CLASSIFIERS, DEPENDENCIES, ENTRY_POINTS, KEYWORDS, MAINTAINERS, MINIMAL_CONFIG, OPTIONAL_DEPENDENCIES, URLS ) # this package import whey from whey.__main__ import main # noqa: F401 if TYPE_CHECKING: # 3rd party from _pytest.capture import CaptureFixture COMPLETE_PROJECT_A = """\ [project] name = "spam" version = "2020.0.0" description = "Lovely Spam! Wonderful Spam!" requires-python = ">=3.8" keywords = ["egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor"] authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-ping Chung"} ] maintainers = [ {name = "Brett Cannon", email = "brett@python.org"} ] classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python" ] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.optional-dependencies] test = [ "pytest < 5.0.0", "pytest-cov[all]" ] [project.urls] homepage = "example.com" documentation = "readthedocs.org" repository = "github.com" changelog = "github.com/me/spam/blob/master/CHANGELOG.md" [project.scripts] spam-cli = "spam:main_cli" [project.gui-scripts] spam-gui = "spam:main_gui" [project.entry-points."spam.magical"] tomatoes = "spam:main_tomatoes" """ COMPLETE_A = """\ [build-system] requires = [ "whey",] build-backend = "whey" [project] name = "whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python",] readme = "README.rst" dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.license] file = "LICENSE" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" """ COMPLETE_B = """\ [build-system] requires = [ "whey",] build-backend = "whey" [project] name = "Whey" version = "2021.0.0" description = "A simple Python wheel builder for simple projects." readme = "README.rst" keywords = [ "pep517", "pep621", "build", "sdist", "wheel", "packaging", "distribution",] dynamic = [ "classifiers", "requires-python",] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.license] file = "LICENSE" [[project.authors]] email = "dominic@davis-foster.co.uk" name = "Dominic Davis-Foster" [project.urls] Homepage = "https://whey.readthedocs.io/en/latest" Documentation = "https://whey.readthedocs.io/en/latest" "Issue Tracker" = "https://github.com/repo-helper/whey/issues" "Source Code" = "https://github.com/repo-helper/whey" [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta",] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "MIT" package = "whey" """ @pytest.mark.parametrize( "config", [ pytest.param(MINIMAL_CONFIG, id="minimal"), pytest.param(f'{MINIMAL_CONFIG}\ndescription = "Lovely Spam! Wonderful Spam!"', id="description"), pytest.param(f'{MINIMAL_CONFIG}\nrequires-python = ">=3.8"', id="requires-python"), pytest.param( f'{MINIMAL_CONFIG}\nrequires-python = ">=2.7,!=3.0.*,!=3.2.*"', id="requires-python_complex" ), pytest.param(KEYWORDS, id="keywords"), pytest.param(AUTHORS, id="authors"), pytest.param(MAINTAINERS, id="maintainers"), pytest.param(CLASSIFIERS, id="classifiers"), pytest.param(DEPENDENCIES, id="dependencies"), pytest.param(OPTIONAL_DEPENDENCIES, id="optional-dependencies"), pytest.param(URLS, id="urls"), pytest.param(ENTRY_POINTS, id="entry_points"), ] ) def test_cli_build_success( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "spam").mkdir() (tmp_pathplus / "spam" / "__init__.py").write_clean("print('hello world)") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): wheel = whey.build_wheel(tmp_pathplus) assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) assert zip_file.read_text("spam/__init__.py") == "print('hello world)\n" with in_directory(tmp_pathplus): sdist = whey.build_sdist(tmp_pathplus) assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("spam-2020.0.0/spam/__init__.py") == "print('hello world)\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.parametrize("verbosity", [None, '0', '1']) @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) def test_build_complete( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", verbosity: Optional[str], monkeypatch ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} if verbosity is not None: monkeypatch.setenv("WHEY_VERBOSE", verbosity) with in_directory(tmp_pathplus): wheel = whey.build_wheel(tmp_pathplus) assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) assert zip_file.read_text("whey/__init__.py") == "print('hello world)\n" with in_directory(tmp_pathplus): sdist = whey.build_sdist(tmp_pathplus) assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world)\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.parametrize( "config", [ # pytest.param(COMPLETE_PROJECT_A, id="COMPLETE_PROJECT_A"), pytest.param(COMPLETE_A, id="COMPLETE_A"), pytest.param(COMPLETE_B, id="COMPLETE_B"), ] ) @pytest.mark.parametrize( "editables_version", [ pytest.param("0.2", marks=only_version("3.6")), pytest.param("0.3", marks=min_version("3.7")), ] ) def test_build_editable( config: str, tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", editables_version: str ): (tmp_pathplus / "pyproject.toml").write_clean(config) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} with in_directory(tmp_pathplus): wheel = whey.build_editable(tmp_pathplus) assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) data["pth"] = zip_file.read_text("whey.pth") if sys.version_info >= (3, 7): data["code"] = zip_file.read_text("_editable_impl_whey.py").replace(tmp_pathplus.as_posix(), "...") else: data["code"] = zip_file.read_text("_whey.py").replace(tmp_pathplus.as_posix(), "...") outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) @pytest.mark.parametrize("verbosity", [None, '0', '1']) def test_build_additional_files( tmp_pathplus: PathPlus, advanced_data_regression: AdvancedDataRegressionFixture, capsys: "CaptureFixture[str]", verbosity: Optional[str], monkeypatch ): (tmp_pathplus / "pyproject.toml").write_lines([ COMPLETE_B, '', "additional-files = [", ' "include whey/style.css",', ' "exclude whey/style.css",', ' "include whey/style.css",', ' "recursive-include whey/static *",', ' "recursive-exclude whey/static *.txt",', ']', ]) (tmp_pathplus / "whey").mkdir() (tmp_pathplus / "whey" / "__init__.py").write_clean("print('hello world)") (tmp_pathplus / "whey" / "style.css").write_clean("This is the style.css file") (tmp_pathplus / "whey" / "static").mkdir() (tmp_pathplus / "whey" / "static" / "foo.py").touch() (tmp_pathplus / "whey" / "static" / "foo.c").touch() (tmp_pathplus / "whey" / "static" / "foo.txt").touch() (tmp_pathplus / "README.rst").write_clean("Spam Spam Spam Spam") (tmp_pathplus / "LICENSE").write_clean("This is the license") (tmp_pathplus / "requirements.txt").write_clean("domdf_python_tools") data: Dict[str, Any] = {} if verbosity is not None: monkeypatch.setenv("WHEY_VERBOSE", verbosity) with in_directory(tmp_pathplus): wheel = whey.build_wheel(tmp_pathplus) assert (tmp_pathplus / wheel).is_file() with handy_archives.ZipFile(tmp_pathplus / wheel) as zip_file: data["wheel_content"] = sorted(zip_file.namelist()) assert zip_file.read_text("whey/__init__.py") == "print('hello world)\n" with in_directory(tmp_pathplus): sdist = whey.build_sdist(tmp_pathplus) assert (tmp_pathplus / sdist).is_file() with handy_archives.TarFile.open(tmp_pathplus / sdist) as tar: data["sdist_content"] = sorted(tar.getnames()) assert tar.read_text("whey-2021.0.0/whey/__init__.py") == "print('hello world)\n" assert tar.read_text("whey-2021.0.0/whey/style.css") == "This is the style.css file\n" assert tar.read_text("whey-2021.0.0/README.rst") == "Spam Spam Spam Spam\n" assert tar.read_text("whey-2021.0.0/LICENSE") == "This is the license\n" assert tar.read_text("whey-2021.0.0/requirements.txt") == "domdf_python_tools\n" outerr = capsys.readouterr() data["stdout"] = outerr.out.replace(tmp_pathplus.as_posix(), "...") data["stderr"] = outerr.err advanced_data_regression.check(data) whey-0.0.24/tests/test_pep517_backend_/000077500000000000000000000000001442026364700176115ustar00rootroot00000000000000whey-0.0.24/tests/test_pep517_backend_/test_build_additional_files_0_.yml000066400000000000000000000012651442026364700264260ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py - whey-2021.0.0/whey/static/foo.c - whey-2021.0.0/whey/static/foo.py - whey-2021.0.0/whey/style.css stderr: '' stdout: 'Wheel created at .../whey-2021.0.0-py3-none-any.whl Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py - whey/static/foo.c - whey/static/foo.py - whey/style.css whey-0.0.24/tests/test_pep517_backend_/test_build_additional_files_1_.yml000066400000000000000000000036221442026364700264260ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py - whey-2021.0.0/whey/static/foo.c - whey-2021.0.0/whey/static/foo.py - whey-2021.0.0/whey/style.css stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/style.css -> whey/style.css Removing whey/style.css Copying .../whey/style.css -> whey/style.css Copying .../whey/static/foo.c -> whey/static/foo.c Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/static/foo.txt -> whey/static/foo.txt Removing whey/static/foo.txt Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/style.css -> whey/style.css Removing whey/style.css Copying .../whey/style.css -> whey/style.css Copying .../whey/static/foo.c -> whey/static/foo.c Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/static/foo.txt -> whey/static/foo.txt Removing whey/static/foo.txt Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py - whey/static/foo.c - whey/static/foo.py - whey/style.css whey-0.0.24/tests/test_pep517_backend_/test_build_additional_files_None_.yml000066400000000000000000000036221442026364700271650ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py - whey-2021.0.0/whey/static/foo.c - whey-2021.0.0/whey/static/foo.py - whey-2021.0.0/whey/style.css stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/style.css -> whey/style.css Removing whey/style.css Copying .../whey/style.css -> whey/style.css Copying .../whey/static/foo.c -> whey/static/foo.c Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/static/foo.txt -> whey/static/foo.txt Removing whey/static/foo.txt Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/style.css -> whey/style.css Removing whey/style.css Copying .../whey/style.css -> whey/style.css Copying .../whey/static/foo.c -> whey/static/foo.c Copying .../whey/static/foo.py -> whey/static/foo.py Copying .../whey/static/foo.txt -> whey/static/foo.txt Removing whey/static/foo.txt Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py - whey/static/foo.c - whey/static/foo.py - whey/style.css whey-0.0.24/tests/test_pep517_backend_/test_build_complete_COMPLETE_A_0_.yml000066400000000000000000000010271442026364700264700ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Wheel created at .../whey-2021.0.0-py3-none-any.whl Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_build_complete_COMPLETE_A_1_.yml000066400000000000000000000017761442026364700265040ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_build_complete_COMPLETE_A_None_.yml000066400000000000000000000017761442026364700272430ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_build_complete_COMPLETE_B_0_.yml000066400000000000000000000010271442026364700264710ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Wheel created at .../whey-2021.0.0-py3-none-any.whl Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_build_complete_COMPLETE_B_1_.yml000066400000000000000000000017761442026364700265050ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_build_complete_COMPLETE_B_None_.yml000066400000000000000000000017761442026364700272440ustar00rootroot00000000000000sdist_content: - whey-2021.0.0/LICENSE - whey-2021.0.0/PKG-INFO - whey-2021.0.0/README.rst - whey-2021.0.0/pyproject.toml - whey-2021.0.0/requirements.txt - whey-2021.0.0/whey/__init__.py stderr: '' stdout: 'Copying .../whey/__init__.py -> whey/__init__.py Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl Copying .../whey/__init__.py -> whey/__init__.py Writing LICENSE Copying .../pyproject.toml -> pyproject.toml Copying .../requirements.txt -> requirements.txt Writing README.rst Writing PKG-INFO Source distribution created at .../whey-2021.0.0.tar.gz ' wheel_content: - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_build_editable_0_2_COMPLETE_A_.yml000066400000000000000000000013101442026364700266450ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - _whey.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey.pth whey-0.0.24/tests/test_pep517_backend_/test_build_editable_0_2_COMPLETE_B_.yml000066400000000000000000000013101442026364700266460ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - _whey.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey.pth whey-0.0.24/tests/test_pep517_backend_/test_build_editable_0_3_COMPLETE_A_.yml000066400000000000000000000013621442026364700266550ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _editable_impl_whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _editable_impl_whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - _editable_impl_whey.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey.pth whey-0.0.24/tests/test_pep517_backend_/test_build_editable_0_3_COMPLETE_B_.yml000066400000000000000000000013621442026364700266560ustar00rootroot00000000000000code: 'from editables.redirector import RedirectingFinder as F F.install() F.map_module(''whey'', ''.../whey/__init__.py'') ' pth: 'import _editable_impl_whey ' stderr: '' stdout: 'Writing whey-2021.0.0.dist-info/LICENSE Writing whey-2021.0.0.dist-info/entry_points.txt Writing whey.pth Writing _editable_impl_whey.py Writing whey-2021.0.0.dist-info/METADATA Writing whey-2021.0.0.dist-info/WHEEL Writing whey-2021.0.0.dist-info/RECORD Wheel created at .../whey-2021.0.0-py3-none-any.whl ' wheel_content: - _editable_impl_whey.py - whey-2021.0.0.dist-info/LICENSE - whey-2021.0.0.dist-info/METADATA - whey-2021.0.0.dist-info/RECORD - whey-2021.0.0.dist-info/WHEEL - whey-2021.0.0.dist-info/entry_points.txt - whey.pth whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_authors_.yml000066400000000000000000000014001442026364700267500ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_classifiers_.yml000066400000000000000000000014001442026364700275720ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_dependencies_.yml000066400000000000000000000014001442026364700277110ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_description_.yml000066400000000000000000000014001442026364700276060ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_entry_points_.yml000066400000000000000000000014001442026364700300200ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_keywords_.yml000066400000000000000000000014001442026364700271320ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_maintainers_.yml000066400000000000000000000014001442026364700275750ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_minimal_.yml000066400000000000000000000014001442026364700267110ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_optional_dependencies_.yml000066400000000000000000000014001442026364700316160ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_requires_python_.yml000066400000000000000000000014001442026364700305230ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_requires_python_complex_.yml000066400000000000000000000014001442026364700322520ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_pep517_backend_/test_cli_build_success_urls_.yml000066400000000000000000000014001442026364700262500ustar00rootroot00000000000000sdist_content: - spam-2020.0.0/PKG-INFO - spam-2020.0.0/pyproject.toml - spam-2020.0.0/spam/__init__.py stderr: '' stdout: 'Copying .../spam/__init__.py -> spam/__init__.py Writing spam-2020.0.0.dist-info/entry_points.txt Writing spam-2020.0.0.dist-info/METADATA Writing spam-2020.0.0.dist-info/WHEEL Writing spam-2020.0.0.dist-info/RECORD Wheel created at .../spam-2020.0.0-py3-none-any.whl Copying .../spam/__init__.py -> spam/__init__.py Copying .../pyproject.toml -> pyproject.toml Writing PKG-INFO Source distribution created at .../spam-2020.0.0.tar.gz ' wheel_content: - spam-2020.0.0.dist-info/METADATA - spam-2020.0.0.dist-info/RECORD - spam-2020.0.0.dist-info/WHEEL - spam-2020.0.0.dist-info/entry_points.txt - spam/__init__.py whey-0.0.24/tests/test_utils.py000066400000000000000000000064671442026364700165110ustar00rootroot00000000000000# stdlib from typing import TYPE_CHECKING, Dict, Type # 3rd party import click import pytest from coincidence.regressions import AdvancedDataRegressionFixture, AdvancedFileRegressionFixture from domdf_python_tools.paths import PathPlus from pyproject_examples import MINIMAL_CONFIG from whey_conda import CondaBuilder from whey_pth import PthWheelBuilder # this package from whey.builder import AbstractBuilder, SDistBuilder, WheelBuilder from whey.foreman import Foreman from whey.utils import parse_custom_builders, print_builder_names if TYPE_CHECKING: # 3rd party from _pytest.capture import CaptureFixture @pytest.mark.parametrize( "config", [ pytest.param(MINIMAL_CONFIG, id="default"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nsdist = "whey_sdist"', id="sdist"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nwheel = "whey_wheel"', id="wheel"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nwheel = "whey_pth_wheel"', id="whey_pth"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nbinary = "whey_wheel"', id="binary_wheel"), pytest.param(f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nbinary = "whey_conda"', id="binary_conda"), pytest.param( f'{MINIMAL_CONFIG}\n[tool.whey.builders]\nsdist = "whey_sdist"\nwheel = "whey_wheel"', id="sdist_and_wheel", ), ] ) @pytest.mark.parametrize( "builders", [ pytest.param({"sdist": True}, id="sdist_true"), pytest.param({"wheel": True}, id="wheel_true"), pytest.param({"binary": True}, id="binary_true"), pytest.param({"sdist": True, "wheel": True}, id="sdist_and_wheel"), pytest.param({"binary": False, "wheel": True}, id="true_and_false"), ] ) @pytest.mark.parametrize( "custom_builders", [ pytest.param({}, id="none"), pytest.param({"whey_conda": CondaBuilder}, id="whey_conda"), pytest.param({"whey_pth": PthWheelBuilder}, id="whey_pth"), ] ) def test_print_builder_names( tmp_pathplus: PathPlus, config: str, builders: Dict[str, bool], custom_builders: Dict[str, Type[AbstractBuilder]], advanced_file_regression: AdvancedFileRegressionFixture, capsys: "CaptureFixture[str]", ): (tmp_pathplus / "pyproject.toml").write_clean(config) foreman = Foreman(project_dir=tmp_pathplus) print_builder_names(foreman, custom_builders, **builders) advanced_file_regression.check(capsys.readouterr().out) def test_parse_custom_builders(advanced_data_regression: AdvancedDataRegressionFixture, ): assert parse_custom_builders(None) == {} assert parse_custom_builders([]) == {} assert parse_custom_builders(()) == {} assert parse_custom_builders(iter([])) == {} assert parse_custom_builders(_ for _ in ()) == {} assert parse_custom_builders(["whey_sdist"]) == {"whey_sdist": SDistBuilder} assert parse_custom_builders(["whey_wheel"]) == {"whey_wheel": WheelBuilder} assert parse_custom_builders(["whey_conda"]) == {"whey_conda": CondaBuilder} assert parse_custom_builders(["whey_pth_wheel"]) == {"whey_pth_wheel": PthWheelBuilder} expected = {"whey_conda": CondaBuilder, "whey_pth_wheel": PthWheelBuilder} assert parse_custom_builders(["whey_conda", "whey_pth_wheel"]) == expected with pytest.raises( click.BadArgumentUsage, match=f"Unknown builder 'foo'. \nIs it registered as an entry point under 'whey.builder'?" ): parse_custom_builders(["foo"]) whey-0.0.24/tests/test_utils_/000077500000000000000000000000001442026364700162615ustar00rootroot00000000000000whey-0.0.24/tests/test_utils_/test_print_builder_names_none_binary_true_binary_conda_.txt000066400000000000000000000001011442026364700323670ustar00rootroot00000000000000Using the following builder: binary: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_binary_true_binary_wheel_.txt000066400000000000000000000001031442026364700324110ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_binary_true_default_.txt000066400000000000000000000001031442026364700313650ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_binary_true_sdist_.txt000066400000000000000000000001031442026364700310670ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_binary_true_sdist_and_wheel_.txt000066400000000000000000000001031442026364700330750ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_binary_true_wheel_.txt000066400000000000000000000001031442026364700310450ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_binary_true_whey_pth_.txt000066400000000000000000000001031442026364700315700ustar00rootroot00000000000000Using the following builder: binary: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_and_wheel_binary_conda_.txt000066400000000000000000000001501442026364700332040ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_and_wheel_binary_wheel_.txt000066400000000000000000000001501442026364700332240ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_and_wheel_default_.txt000066400000000000000000000001501442026364700322000ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_and_wheel_sdist_.txt000066400000000000000000000001501442026364700317020ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_and_wheel_sdist_and_wheel_.txt000066400000000000000000000001501442026364700337100ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_and_wheel_wheel_.txt000066400000000000000000000001501442026364700316600ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_and_wheel_whey_pth_.txt000066400000000000000000000001471442026364700324110ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_true_binary_conda_.txt000066400000000000000000000001021442026364700322320ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_true_binary_wheel_.txt000066400000000000000000000001021442026364700322520ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_true_default_.txt000066400000000000000000000001021442026364700312260ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_true_sdist_.txt000066400000000000000000000001021442026364700307300ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_true_sdist_and_wheel_.txt000066400000000000000000000001021442026364700327360ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_true_wheel_.txt000066400000000000000000000001021442026364700307060ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_sdist_true_whey_pth_.txt000066400000000000000000000001021442026364700314310ustar00rootroot00000000000000Using the following builder: sdist: whey.builder.SDistBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_true_and_false_binary_conda_.txt000066400000000000000000000001021442026364700330200ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_true_and_false_binary_wheel_.txt000066400000000000000000000001021442026364700330400ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_true_and_false_default_.txt000066400000000000000000000001021442026364700320140ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_true_and_false_sdist_.txt000066400000000000000000000001021442026364700315160ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_true_and_false_sdist_and_wheel_.txt000066400000000000000000000001021442026364700335240ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_true_and_false_wheel_.txt000066400000000000000000000001021442026364700314740ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_true_and_false_whey_pth_.txt000066400000000000000000000001011442026364700322160ustar00rootroot00000000000000Using the following builder: wheel: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_wheel_true_binary_conda_.txt000066400000000000000000000001021442026364700322100ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_wheel_true_binary_wheel_.txt000066400000000000000000000001021442026364700322300ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_wheel_true_default_.txt000066400000000000000000000001021442026364700312040ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_wheel_true_sdist_.txt000066400000000000000000000001021442026364700307060ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_wheel_true_sdist_and_wheel_.txt000066400000000000000000000001021442026364700327140ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_wheel_true_wheel_.txt000066400000000000000000000001021442026364700306640ustar00rootroot00000000000000Using the following builder: wheel: whey.builder.WheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_none_wheel_true_whey_pth_.txt000066400000000000000000000001011442026364700314060ustar00rootroot00000000000000Using the following builder: wheel: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_binary_true_binary_conda_.txt000066400000000000000000000001521442026364700335560ustar00rootroot00000000000000Using the following builders: binary: whey_conda.CondaBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_binary_true_binary_wheel_.txt000066400000000000000000000001541442026364700336000ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_binary_true_default_.txt000066400000000000000000000001541442026364700325540ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_binary_true_sdist_.txt000066400000000000000000000001541442026364700322560ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_binary_true_sdist_and_wheel_.txt000066400000000000000000000001541442026364700342640ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_binary_true_wheel_.txt000066400000000000000000000001541442026364700322340ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_binary_true_whey_pth_.txt000066400000000000000000000001541442026364700327570ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_and_wheel_binary_conda_.txt000066400000000000000000000002201442026364700343630ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_and_wheel_binary_wheel_.txt000066400000000000000000000002201442026364700344030ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_and_wheel_default_.txt000066400000000000000000000002201442026364700333570ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_and_wheel_sdist_.txt000066400000000000000000000002201442026364700330610ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder test_print_builder_names_whey_conda_sdist_and_wheel_sdist_and_wheel_.txt000066400000000000000000000002201442026364700350100ustar00rootroot00000000000000whey-0.0.24/tests/test_utils_Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_and_wheel_wheel_.txt000066400000000000000000000002201442026364700330370ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_and_wheel_whey_pth_.txt000066400000000000000000000002171442026364700335700ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_true_binary_conda_.txt000066400000000000000000000001531442026364700334210ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_true_binary_wheel_.txt000066400000000000000000000001531442026364700334410ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_true_default_.txt000066400000000000000000000001531442026364700324150ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_true_sdist_.txt000066400000000000000000000001531442026364700321170ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_true_sdist_and_wheel_.txt000066400000000000000000000001531442026364700341250ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_true_wheel_.txt000066400000000000000000000001531442026364700320750ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_sdist_true_whey_pth_.txt000066400000000000000000000001531442026364700326200ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_true_and_false_binary_conda_.txt000066400000000000000000000001531442026364700342070ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_true_and_false_binary_wheel_.txt000066400000000000000000000001531442026364700342270ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_true_and_false_default_.txt000066400000000000000000000001531442026364700332030ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_true_and_false_sdist_.txt000066400000000000000000000001531442026364700327050ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder test_print_builder_names_whey_conda_true_and_false_sdist_and_wheel_.txt000066400000000000000000000001531442026364700346340ustar00rootroot00000000000000whey-0.0.24/tests/test_utils_Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_true_and_false_wheel_.txt000066400000000000000000000001531442026364700326630ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_true_and_false_whey_pth_.txt000066400000000000000000000001521442026364700334050ustar00rootroot00000000000000Using the following builders: wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_wheel_true_binary_conda_.txt000066400000000000000000000001531442026364700333770ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_wheel_true_binary_wheel_.txt000066400000000000000000000001531442026364700334170ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_wheel_true_default_.txt000066400000000000000000000001531442026364700323730ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_wheel_true_sdist_.txt000066400000000000000000000001531442026364700320750ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_wheel_true_sdist_and_wheel_.txt000066400000000000000000000001531442026364700341030ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_wheel_true_wheel_.txt000066400000000000000000000001531442026364700320530ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_conda_wheel_true_whey_pth_.txt000066400000000000000000000001521442026364700325750ustar00rootroot00000000000000Using the following builders: wheel: whey_pth.PthWheelBuilder whey_conda: whey_conda.CondaBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_binary_true_binary_conda_.txt000066400000000000000000000001511442026364700332640ustar00rootroot00000000000000Using the following builders: binary: whey_conda.CondaBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_binary_true_binary_wheel_.txt000066400000000000000000000001531442026364700333060ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_binary_true_default_.txt000066400000000000000000000001531442026364700322620ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_binary_true_sdist_.txt000066400000000000000000000001531442026364700317640ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_binary_true_sdist_and_wheel_.txt000066400000000000000000000001531442026364700337720ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_binary_true_wheel_.txt000066400000000000000000000001531442026364700317420ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_binary_true_whey_pth_.txt000066400000000000000000000001531442026364700324650ustar00rootroot00000000000000Using the following builders: binary: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_and_wheel_binary_conda_.txt000066400000000000000000000002171442026364700341000ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_and_wheel_binary_wheel_.txt000066400000000000000000000002171442026364700341200ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_and_wheel_default_.txt000066400000000000000000000002171442026364700330740ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_and_wheel_sdist_.txt000066400000000000000000000002171442026364700325760ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_and_wheel_sdist_and_wheel_.txt000066400000000000000000000002171442026364700346040ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_and_wheel_wheel_.txt000066400000000000000000000002171442026364700325540ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_and_wheel_whey_pth_.txt000066400000000000000000000002161442026364700332760ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder wheel: whey_pth.PthWheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_true_binary_conda_.txt000066400000000000000000000001521442026364700331270ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_true_binary_wheel_.txt000066400000000000000000000001521442026364700331470ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_true_default_.txt000066400000000000000000000001521442026364700321230ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_true_sdist_.txt000066400000000000000000000001521442026364700316250ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_true_sdist_and_wheel_.txt000066400000000000000000000001521442026364700336330ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_true_wheel_.txt000066400000000000000000000001521442026364700316030ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_sdist_true_whey_pth_.txt000066400000000000000000000001521442026364700323260ustar00rootroot00000000000000Using the following builders: sdist: whey.builder.SDistBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_true_and_false_binary_conda_.txt000066400000000000000000000001521442026364700337150ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_true_and_false_binary_wheel_.txt000066400000000000000000000001521442026364700337350ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_true_and_false_default_.txt000066400000000000000000000001521442026364700327110ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_true_and_false_sdist_.txt000066400000000000000000000001521442026364700324130ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_true_and_false_sdist_and_wheel_.txt000066400000000000000000000001521442026364700344210ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_true_and_false_wheel_.txt000066400000000000000000000001521442026364700323710ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_true_and_false_whey_pth_.txt000066400000000000000000000001511442026364700331130ustar00rootroot00000000000000Using the following builders: wheel: whey_pth.PthWheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_wheel_true_binary_conda_.txt000066400000000000000000000001521442026364700331050ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_wheel_true_binary_wheel_.txt000066400000000000000000000001521442026364700331250ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_wheel_true_default_.txt000066400000000000000000000001521442026364700321010ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_wheel_true_sdist_.txt000066400000000000000000000001521442026364700316030ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_wheel_true_sdist_and_wheel_.txt000066400000000000000000000001521442026364700336110ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_wheel_true_wheel_.txt000066400000000000000000000001521442026364700315610ustar00rootroot00000000000000Using the following builders: wheel: whey.builder.WheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tests/test_utils_/test_print_builder_names_whey_pth_wheel_true_whey_pth_.txt000066400000000000000000000001511442026364700323030ustar00rootroot00000000000000Using the following builders: wheel: whey_pth.PthWheelBuilder whey_pth: whey_pth.PthWheelBuilder whey-0.0.24/tox.ini000066400000000000000000000154361442026364700141050ustar00rootroot00000000000000# This file is managed by 'repo_helper'. # You may add new sections, but any changes made to the following sections will be lost: # * tox # * envlists # * testenv # * testenv:.package # * testenv:py312-dev # * testenv:docs # * testenv:build # * testenv:lint # * testenv:perflint # * testenv:mypy # * testenv:pyup # * testenv:coverage # * flake8 # * coverage:run # * coverage:report # * check-wheel-contents # * pytest [tox] envlist = py36 py37 py38 py39 py310 py311 py312-dev pypy36 pypy37 pypy38 pypy39 mypy build skip_missing_interpreters = True isolated_build = True requires = pip>=21,!=22.2 tox-envlist>=0.2.1 tox~=3.0 virtualenv!=20.16.0 [envlists] test = py36 py37 py38 py39 py310 py311 py312-dev pypy36 pypy37 pypy38 pypy39 qa = mypy, lint cov = py38, coverage [testenv] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 SETUPTOOLS_USE_DISTUTILS=stdlib deps = -r{toxinidir}/tests/requirements.txt extras = all commands = python --version python -m pytest --cov=whey -r aR tests/ {posargs} [testenv:.package] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 [testenv:py312-dev] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 [testenv:docs] setenv = SHOW_TODOS = 1 passenv = SPHINX_BUILDER basepython = python3.8 changedir = {toxinidir}/doc-source extras = all deps = -r{toxinidir}/doc-source/requirements.txt commands = sphinx-build -M {env:SPHINX_BUILDER:html} . ./build {posargs} [testenv:build] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 skip_install = True changedir = {toxinidir} deps = build[virtualenv]>=0.3.1 check-wheel-contents>=0.1.0 twine>=3.2.0 commands = python -m build --sdist --wheel "{toxinidir}" twine check dist/*.tar.gz dist/*.whl check-wheel-contents dist/ [testenv:lint] basepython = python3.8 changedir = {toxinidir} ignore_errors = True skip_install = True deps = flake8>=3.8.2,<5 flake8-2020>=1.6.0 flake8-builtins>=1.5.3 flake8-docstrings>=1.5.0 flake8-dunder-all>=0.1.1 flake8-encodings>=0.1.0 flake8-github-actions>=0.1.0 flake8-noqa>=1.1.0,<=1.2.2 flake8-pyi>=20.10.0,<=22.8.0 flake8-pytest-style>=1.3.0 flake8-quotes>=3.3.0 flake8-slots>=0.1.0 flake8-sphinx-links>=0.0.4 flake8-strftime>=0.1.1 flake8-typing-imports>=1.10.0 git+https://github.com/domdfcoding/flake8-rst-docstrings-sphinx.git git+https://github.com/domdfcoding/flake8-rst-docstrings.git git+https://github.com/python-formate/flake8-unused-arguments.git@magic-methods git+https://github.com/python-formate/flake8-missing-annotations.git pydocstyle>=6.0.0 pygments>=2.7.1 importlib_metadata<4.5.0; python_version<'3.8' commands = python3 -m flake8_rst_docstrings_sphinx whey tests --allow-toolbox {posargs} [testenv:perflint] basepython = python3.8 changedir = {toxinidir} ignore_errors = True skip_install = True deps = perflint commands = python3 -m perflint whey {posargs} [testenv:mypy] basepython = python3.8 ignore_errors = True changedir = {toxinidir} extras = all deps = mypy==0.971 -r{toxinidir}/tests/requirements.txt -r{toxinidir}/stubs.txt commands = mypy whey tests {posargs} [testenv:pyup] basepython = python3.8 skip_install = True ignore_errors = True changedir = {toxinidir} deps = pyupgrade-directories extras = all commands = pyup_dirs whey tests --py36-plus --recursive [testenv:coverage] basepython = python3.8 skip_install = True ignore_errors = True whitelist_externals = /bin/bash passenv = COV_PYTHON_VERSION COV_PLATFORM COV_PYTHON_IMPLEMENTATION * changedir = {toxinidir} deps = coverage>=5 coverage_pyver_pragma>=0.2.1 commands = /bin/bash -c "rm -rf htmlcov" coverage html /bin/bash -c "DISPLAY=:0 firefox 'htmlcov/index.html'" [flake8] max-line-length = 120 select = E111 E112 E113 E121 E122 E125 E127 E128 E129 E131 E133 E201 E202 E203 E211 E222 E223 E224 E225 E225 E226 E227 E228 E231 E241 E242 E251 E261 E262 E265 E271 E272 E303 E304 E306 E402 E502 E703 E711 E712 E713 E714 E721 W291 W292 W293 W391 W504 YTT101 YTT102 YTT103 YTT201 YTT202 YTT203 YTT204 YTT301 YTT302 YTT303 STRFTIME001 STRFTIME002 SXL001 PT001 PT002 PT003 PT006 PT007 PT008 PT009 PT010 PT011 PT012 PT013 PT014 PT015 PT016 PT017 PT018 PT019 PT020 PT021 RST201 RST202 RST203 RST204 RST205 RST206 RST207 RST208 RST210 RST211 RST212 RST213 RST214 RST215 RST216 RST217 RST218 RST219 RST299 RST301 RST302 RST303 RST304 RST305 RST306 RST399 RST401 RST499 RST900 RST901 RST902 RST903 Q001 Q002 Q003 A001 A002 A003 TYP001 TYP002 TYP003 TYP004 TYP005 TYP006 ENC001 ENC002 ENC003 ENC004 ENC011 ENC012 ENC021 ENC022 ENC023 ENC024 ENC025 ENC026 Y001,Y002 Y003 Y004 Y005 Y006 Y007 Y008 Y009 Y010 Y011 Y012 Y013 Y014 Y015 Y090 Y091 NQA001 NQA002 NQA003 NQA004 NQA005 NQA102 NQA103 E301 E302 E305 D100 D101 D102 D103 D104 D106 D201 D204 D207 D208 D209 D210 D211 D212 D213 D214 D215 D300 D301 D400 D402 D403 D404 D415 D417 DALL000 SLOT000 SLOT001 SLOT002 extend-exclude = doc-source,old,build,dist,__pkginfo__.py,setup.py,venv rst-directives = TODO autosummary-widths envvar extras-require license license-info rst-roles = choosealicense core-meta pep621 tconf per-file-ignores = tests/*: D100 D101 D102 D103 D104 D106 D201 D204 D207 D208 D209 D210 D211 D212 D213 D214 D215 D300 D301 D400 D402 D403 D404 D415 D417 DALL000 SLOT000 SLOT001 SLOT002 */*.pyi: E301 E302 E305 D100 D101 D102 D103 D104 D106 D201 D204 D207 D208 D209 D210 D211 D212 D213 D214 D215 D300 D301 D400 D402 D403 D404 D415 D417 DALL000 SLOT000 SLOT001 SLOT002 pytest-parametrize-names-type = csv inline-quotes = " multiline-quotes = """ docstring-quotes = """ count = True min_python_version = 3.6.1 unused-arguments-ignore-abstract-functions = True unused-arguments-ignore-overload-functions = True unused-arguments-ignore-magic-methods = True unused-arguments-ignore-variadic-names = True [coverage:run] plugins = coverage_pyver_pragma [coverage:report] fail_under = 95 exclude_lines = raise AssertionError raise NotImplementedError if 0: if False: if TYPE_CHECKING: if typing.TYPE_CHECKING: if __name__ == .__main__.: [check-wheel-contents] ignore = W002 toplevel = whey package = whey [pytest] addopts = --color yes --durations 25 timeout = 300 filterwarnings = error ignore::DeprecationWarning:certifi ignore:can't resolve package from __spec__ or __package__, falling back on __name__ and __path__:ImportWarning ignore:Module already imported so cannot be rewritten. coincidence:pytest.PytestAssertRewriteWarning always:module 'sre_constants' is deprecated:DeprecationWarning always:pkg_resources is deprecated as an API:DeprecationWarning whey-0.0.24/whey/000077500000000000000000000000001442026364700135355ustar00rootroot00000000000000whey-0.0.24/whey/__init__.py000066400000000000000000000111071442026364700156460ustar00rootroot00000000000000#!/usr/bin/env python3 # # __init__.py """ A simple Python wheel builder for simple projects. """ # # Copyright © 2021 Dominic Davis-Foster # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib import os __author__: str = "Dominic Davis-Foster" __copyright__: str = "2021 Dominic Davis-Foster" __license__: str = "MIT License" __version__: str = "0.0.24" __email__: str = "dominic@davis-foster.co.uk" __all__ = ("build_sdist", "build_wheel") def build_wheel(wheel_directory, config_settings=None, metadata_directory=None) -> str: # noqa: MAN001 """ :pep:`517` hook to build a wheel binary distribution. .. seealso:: https://www.python.org/dev/peps/pep-0517/#build-wheel :param wheel_directory: :param config_settings: :param metadata_directory: :returns: The filename of the created archive. """ # 3rd party from consolekit.tracebacks import handle_tracebacks from domdf_python_tools.paths import PathPlus, TemporaryPathPlus # this package from whey.foreman import Foreman from whey.utils import WheyBackendTBHandler show_traceback = bool(int(os.getenv("WHEY_TRACEBACK", 0))) verbose = bool(int(os.getenv("WHEY_VERBOSE", 1))) with TemporaryPathPlus() as tmpdir, handle_tracebacks(show_traceback, WheyBackendTBHandler): foreman = Foreman(project_dir=PathPlus.cwd()) return foreman.build_wheel(build_dir=tmpdir, out_dir=wheel_directory, verbose=verbose) def build_sdist(sdist_directory, config_settings=None) -> str: # noqa: MAN001 """ :pep:`517` hook to build a source distribution. .. seealso:: https://www.python.org/dev/peps/pep-0517/#build-sdist :param sdist_directory: :param config_settings: :returns: The filename of the created archive. """ # 3rd party from consolekit.tracebacks import handle_tracebacks from domdf_python_tools.paths import PathPlus, TemporaryPathPlus # this package from whey.foreman import Foreman from whey.utils import WheyBackendTBHandler show_traceback = bool(int(os.getenv("WHEY_TRACEBACK", 0))) verbose = bool(int(os.getenv("WHEY_VERBOSE", 1))) with TemporaryPathPlus() as tmpdir, handle_tracebacks(show_traceback, WheyBackendTBHandler): foreman = Foreman(project_dir=PathPlus.cwd()) return foreman.build_sdist(build_dir=tmpdir, out_dir=sdist_directory, verbose=verbose) def get_requires_for_build_sdist(config_settings=None): # pragma: no cover # noqa: MAN001,MAN002 return [] def get_requires_for_build_editable(config_settings=None): # pragma: no cover # noqa: MAN001,MAN002 return ["editables>=0.2"] def build_editable(wheel_directory, config_settings=None, metadata_directory=None): # noqa: MAN001,MAN002 """ :pep:`517` hook to build an editable wheel. .. seealso:: :pep:`660` :param wheel_directory: :param config_settings: :param metadata_directory: """ # stdlib from typing import Type, cast # 3rd party from consolekit.tracebacks import handle_tracebacks from domdf_python_tools.paths import PathPlus, TemporaryPathPlus # this package from whey.builder import WheelBuilder from whey.foreman import Foreman from whey.utils import WheyBackendTBHandler show_traceback = bool(int(os.getenv("WHEY_TRACEBACK", 0))) verbose = bool(int(os.getenv("WHEY_VERBOSE", 1))) with TemporaryPathPlus() as tmpdir, handle_tracebacks(show_traceback, WheyBackendTBHandler): foreman = Foreman(project_dir=PathPlus.cwd()) builder_cls: Type[WheelBuilder] = cast(Type[WheelBuilder], foreman.get_builder("wheel")) builder = builder_cls( foreman.project_dir, foreman.config, build_dir=tmpdir, out_dir=wheel_directory, verbose=verbose, ) return builder.build_editable() whey-0.0.24/whey/__main__.py000066400000000000000000000110241442026364700156250ustar00rootroot00000000000000#!/usr/bin/env python3 # # __main__.py """ A simple Python wheel builder for simple projects. """ # # Copyright © 2021 Dominic Davis-Foster # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib import sys # 3rd party import click from consolekit import click_command from consolekit.options import ( DescribedArgument, auto_default_argument, auto_default_option, colour_option, flag_option ) from consolekit.tracebacks import handle_tracebacks if False: # TYPE_CHECKING: # pylint: disable=using-constant-test # stdlib from typing import Iterable, Optional # 3rd party from consolekit.terminal_colours import ColourTrilean from domdf_python_tools.typing import PathLike __all__ = ("main", ) @flag_option( "-T", "--traceback", "show_traceback", help="Show the complete traceback on error.", envvar="WHEY_TRACEBACK", ) @colour_option() @flag_option("-S", "--show-builders", help="Show the builders which will be used, and exit.") @flag_option("-v", "--verbose", help="Enable verbose output.", envvar="WHEY_VERBOSE") @auto_default_option( "-o", "--out-dir", type=click.STRING, help="The output directory.", metavar="DIRECTORY", ) @auto_default_option( "--build-dir", type=click.STRING, help="The temporary build directory.", metavar="DIRECTORY", ) @auto_default_option( "-B", "--builder", type=click.STRING, help="The builder to build with.", multiple=True, metavar="BUILDER", ) @flag_option("-b", "--binary", help="Build a binary distribution.") @flag_option("-w", "--wheel", help="Build a wheel.") @flag_option("-s", "--sdist", help="Build a source distribution.") @auto_default_argument( "project", type=click.STRING, cls=DescribedArgument, description="The path to the project to build.", ) @click_command() def main( project: "PathLike" = '.', build_dir: "Optional[str]" = None, out_dir: "Optional[str]" = None, sdist: bool = False, wheel: bool = False, binary: bool = False, builder: "Optional[Iterable[str]]" = None, verbose: bool = False, colour: "ColourTrilean" = None, show_traceback: bool = False, show_builders: bool = False, ) -> None: """ Build a wheel for the given project. """ # 3rd party from domdf_python_tools.paths import PathPlus # this package from whey.foreman import Foreman from whey.utils import WheyTracebackHandler, parse_custom_builders, print_builder_names if not any((binary, sdist, wheel, builder)): wheel = True sdist = True project = PathPlus(project).resolve() with handle_tracebacks(show_traceback, WheyTracebackHandler): foreman = Foreman(project_dir=project) custom_builders = parse_custom_builders(builder) if verbose or show_builders: print_builder_names(foreman, custom_builders, sdist=sdist, wheel=wheel, binary=binary) if show_builders: sys.exit(0) click.echo(f"Building {foreman.project_dir.as_posix()}") if wheel: foreman.build_wheel( build_dir=build_dir, out_dir=out_dir, verbose=verbose, colour=colour, ) if sdist: foreman.build_sdist( build_dir=build_dir, out_dir=out_dir, verbose=verbose, colour=colour, ) if binary: foreman.build_binary( build_dir=build_dir, out_dir=out_dir, verbose=verbose, colour=colour, ) for custom_builder in custom_builders.values(): custom_builder( foreman.project_dir, foreman.config, build_dir=build_dir, out_dir=out_dir, verbose=verbose, colour=colour, ).build() if __name__ == "__main__": sys.exit(main()) whey-0.0.24/whey/_editable.py000066400000000000000000000050321442026364700160170ustar00rootroot00000000000000#!/usr/bin/env python # # _editable.py """ Internal plumbing for editable installs. """ # # Copyright © 2021 Dominic Davis-Foster # # `map` method adapted from https://github.com/pfmoore/editables # Copyright © 2020 Paul Moore # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib from pathlib import Path from typing import Dict, List # 3rd party import editables # type: ignore[import] # nodep from domdf_python_tools.typing import PathLike __all__ = ("EditableProject", ) class EditableProject(editables.EditableProject): # noqa: D101 project_name: str project_dir: Path redirections: Dict[str, str] path_entries: List[Path] def map(self, name: str, target: PathLike) -> None: # noqa: A003,D102 # pylint: disable=redefined-builtin if '.' in name: raise editables.EditableException(f"Cannot map {name} as it is not a top-level package") abs_target = self.make_absolute(target) if abs_target.is_dir(): abs_target = abs_target / "__init__.py" if abs_target.is_file(): self.redirections[name] = abs_target.as_posix() else: raise editables.EditableException(f"{target} is not a valid Python package or module") def map_or_add_to_path(self, name: str, pkgdir: Path) -> None: """ ``.map`` a conventional package, or ``.add_to_path`` a :pep:`420` namespace package. :param name: The package name. :param pkgdir: The package directory. """ if (pkgdir / "__init__.py").is_file(): self.map(name, pkgdir) else: # namespace package self.add_to_path(pkgdir.parent) whey-0.0.24/whey/builder.py000066400000000000000000000653311442026364700155450ustar00rootroot00000000000000#!/usr/bin/env python # # builder.py """ The actual wheel builder. """ # # Copyright © 2020-2021 Dominic Davis-Foster # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib import os import pathlib import re import shutil import tarfile from abc import ABC, abstractmethod from datetime import datetime from email.headerregistry import Address from functools import partial from posixpath import join as posixpath_join from typing import Any, Dict, Iterator, Mapping, Optional from warnings import warn as warnings_warn # 3rd party import click import dom_toml import handy_archives from consolekit.terminal_colours import ColourTrilean, Fore, resolve_color_default from dist_meta import entry_points, metadata, wheel from dist_meta.metadata_mapping import MetadataMapping from domdf_python_tools.paths import PathPlus, sort_paths, traverse_to_file from domdf_python_tools.typing import PathLike from domdf_python_tools.words import word_join from shippinglabel.checksum import get_record_entry from shippinglabel.requirements import ComparableRequirement, combine_requirements __all__ = ("AbstractBuilder", "SDistBuilder", "WheelBuilder") archive_name_sub_re = re.compile( r"[^\w\d.]+", re.UNICODE, ) class AbstractBuilder(ABC): """ Abstract base class for builders of Python distributions using metadata read from ``pyproject.toml``. :param project_dir: The project to build the distribution for. :param build_dir: The (temporary) build directory. :default build_dir: :file:`{}/build/` :param out_dir: The output directory. :default out_dir: :file:`{}/dist/` :param verbose: Whether to enable verbose output. :param colour: Whether to use coloured output. .. autosummary-widths:: 1/2 .. autoclasssumm:: AbstractBuilder :autosummary-sections: Attributes .. latex:clearpage:: .. autosummary-widths:: 7/16 .. autoclasssumm:: AbstractBuilder :autosummary-sections: Methods """ def __init__( self, project_dir: PathPlus, config: Mapping[str, Any], build_dir: Optional[PathLike] = None, out_dir: Optional[PathLike] = None, *args, verbose: bool = False, colour: ColourTrilean = None, **kwargs, ): # Walk up the tree until a "pyproject.toml" file is found. #: The pyproject.toml directory self.project_dir: PathPlus = traverse_to_file(PathPlus(project_dir), "pyproject.toml") #: Configuration parsed from ``pyproject.toml``. self.config: Dict[str, Any] = dict(config) #: The archive name, without the tag self.archive_name = archive_name_sub_re.sub( '_', self.config["name"], ) + f"-{self.config['version']}" #: The (temporary) build directory. self.build_dir = PathPlus(build_dir or self.default_build_dir) self.clear_build_dir() #: The output directory. self.out_dir = PathPlus(out_dir or self.default_out_dir) self.out_dir.maybe_make(parents=True) #: Whether to enable verbose output. self.verbose = verbose #: Whether to use coloured output. self.colour = resolve_color_default(colour) self._echo = partial(click.echo, color=self.colour) @property def default_build_dir(self) -> PathPlus: # pragma: no cover """ Provides a default for the ``build_dir`` argument. """ return self.project_dir / "build" @property def default_out_dir(self) -> PathPlus: # pragma: no cover """ Provides a default for the ``out_dir`` argument. """ return self.project_dir / "dist" @property def code_directory(self) -> str: """ The directory containing the code in the build directory. """ return self.config["source-dir"] def clear_build_dir(self) -> None: """ Clear the build directory of any residue from previous builds. """ if self.build_dir.is_dir(): shutil.rmtree(self.build_dir) self.build_dir.maybe_make(parents=True) def iter_source_files(self) -> Iterator[PathPlus]: """ Iterate over the files in the source directory. """ pkgdir = self.project_dir / self.config["source-dir"] / self.config["package"] if not pkgdir.is_dir(): message = f"Package directory {self.config['package']!r} not found" if self.config["source-dir"]: raise FileNotFoundError(f"{message} in {self.config['source-dir']!r}.") else: raise FileNotFoundError(f"{message}.") found_file = False for py_pattern in {"**/*.py", "**/*.pyi", "**/*.pyx", "**/py.typed"}: for py_file in pkgdir.rglob(py_pattern): if "__pycache__" not in py_file.parts: found_file = True yield py_file if not found_file: raise FileNotFoundError(f"No Python source files found in {pkgdir}") def copy_source(self) -> None: """ Copy source files into the build directory. """ for py_file in self.iter_source_files(): target = self.build_dir / py_file.relative_to(self.project_dir / self.code_directory) target.parent.maybe_make(parents=True) target.write_clean(py_file.read_text()) shutil.copystat(py_file, target) # pylint: disable=dotted-import-in-loop self.report_copied(py_file, target) def _echo_if_v(self, *args, **kwargs) -> None: if self.verbose: self._echo(*args, **kwargs) def report_copied(self, source: pathlib.Path, target: pathlib.Path) -> None: """ Report that a file has been copied into the build directory. The format is:: Copying {source} -> {target.relative_to(self.build_dir)} .. latex:vspace:: -5px :param source: The source file :param target: The file in the build directory. """ self._echo_if_v( f"Copying {source.resolve().as_posix()} -> {target.relative_to(self.build_dir).as_posix()}" ) def report_removed(self, removed_file: pathlib.Path) -> None: """ Reports the removal of a file from the build directory. The format is:: Removing {removed_file.relative_to(self.build_dir)} .. latex:vspace:: -5px :param removed_file: """ self._echo_if_v(f"Removing {removed_file.relative_to(self.build_dir).as_posix()}") def report_written(self, written_file: pathlib.Path) -> None: """ Report that a file has been written to the build directory. The format is:: Writing {written_file.relative_to(self.build_dir)} .. latex:vspace:: -5px :param written_file: """ self._echo_if_v(f"Writing {written_file.relative_to(self.build_dir).as_posix()}") def copy_additional_files(self) -> None: """ Copy additional files to the build directory, as specified in the ``additional-files`` key. """ self.parse_additional_files(*self.config["additional-files"]) def parse_additional_files(self, *entries: str) -> None: # pylint: disable=useless-return r""" Copy additional files to the build directory, by parsing `MANIFEST.in`_-style entries. .. _MANIFEST.in: https://packaging.python.org/guides/using-manifest-in/ :param \*entries: """ def copy_file(filename: PathPlus) -> None: target = self.build_dir / filename.relative_to(self.project_dir / self.code_directory) target.parent.maybe_make(parents=True) shutil.copy2(src=filename, dst=target) self.report_copied(filename, target) for entry in entries: # pylint: disable=loop-invariant-statement parts = entry.split(' ') if parts[0] == "include": for include_pat in parts[1:]: for include_file in sorted(self.project_dir.glob(include_pat)): if include_file.is_file(): copy_file(filename=include_file) elif parts[0] == "exclude": for exclude_pat in parts[1:]: for exclude_file in sorted(self.build_dir.glob(exclude_pat)): if exclude_file.is_file(): exclude_file.unlink() self.report_removed(exclude_file) elif parts[0] == "recursive-include": for include_file in sort_paths(*(self.project_dir / parts[1]).rglob(parts[2])): if "__pycache__" in include_file.parts: continue if include_file.is_file(): copy_file(filename=include_file) elif parts[0] == "recursive-exclude": for exclude_file in sort_paths(*(self.build_dir / parts[1]).rglob(parts[2])): if exclude_file.is_file(): exclude_file.unlink() self.report_removed(exclude_file) else: # pragma: no cover warnings_warn(f"Unsupported command in 'additional-files': {entry}") # # elif parts[0] == "global-include": # for include_pat in parts[1:]: # for include_file in self.project_dir.rglob(include_pat): # if include_file.is_file(): # copy_file(filename=include_file) # # elif parts[0] == "global-exclude": # for exclude_pat in parts[1:]: # for exclude_file in self.project_dir.rglob(exclude_pat): # if exclude_file.is_file(): # exclude_file.unlink() # self.report_removed(exclude_file) # # elif parts[0] == "graft": # for graft_dir in self.project_dir.rglob(parts[1]): # for graft_file in graft_dir.rglob("*.*"): # if graft_file.is_file(): # copy_file(graft_file) # # elif parts[0] == "prune": # for prune_dir in self.project_dir.rglob(parts[1]): # for prune_file in prune_dir.rglob("*.*"): # if prune_file.is_file(): # prune_file.unlink() # self.report_removed(exclude_file) # pylint: enable=loop-invariant-statement return def write_license(self, dest_dir: PathPlus, dest_filename: str = "LICENSE") -> None: """ Write the ``LICENSE`` file. :param dest_dir: The directory to write the file into. :param dest_filename: The name of the file to write in ``dest_dir``. """ if self.config.get("license", None) is not None: target = dest_dir / dest_filename target.parent.maybe_make(parents=True) target.write_clean(self.config["license"].text) self.report_written(target) def parse_authors(self) -> Dict[str, str]: """ Parse the :tconf:`project.authors` and :tconf:`~project.maintainers` fields into :core-meta:`Author`, :core-meta:`Maintainer-Email` etc. :return: A mapping of field names to values. Possible field names are ``Author``, ``Author-Email``, ``Maintainer``, and ``Maintainer-Email``. """ # noqa: D400 author = [] author_email = [] maintainer = [] maintainer_email = [] for entry in self.config["authors"]: if entry["name"] and entry["email"]: address = Address(entry["name"], addr_spec=entry["email"]) author_email.append(str(address)) elif entry["email"]: author_email.append(entry["email"]) elif entry["name"]: author.append(entry["name"]) for entry in self.config["maintainers"]: if entry["name"] and entry["email"]: address = Address(entry["name"], addr_spec=entry["email"]) author_email.append(str(address)) elif entry["email"]: maintainer_email.append(entry["email"]) elif entry["name"]: maintainer.append(entry["name"]) # TODO: I'm not quite sure how PEP 621 expects a name for one author and the email for another to be handled. output = {} if author_email: output["Author-email"] = ", ".join(author_email) elif author: output["Author"] = word_join(author) if maintainer_email: output["Maintainer-email"] = ", ".join(maintainer_email) elif maintainer: output["Maintainer"] = word_join(maintainer) return output def get_metadata_map(self) -> MetadataMapping: """ Generate the content of the ``METADATA`` / ``PKG-INFO`` file. """ metadata_mapping = MetadataMapping() # TODO: metadata 2.2 # Need to translate pep621 dynamic into core metadata field names metadata_mapping["Metadata-Version"] = "2.1" metadata_mapping["Name"] = self.config["name"] metadata_mapping["Version"] = str(self.config["version"]) def add_not_none(key: str, field: str) -> None: if self.config[key] is not None: metadata_mapping[field] = self.config[key] def add_multiple(key: str, field: str) -> None: for value in self.config[key]: metadata_mapping[field] = str(value) # pylint: disable=loop-invariant-statement metadata_mapping.update(self.parse_authors()) add_not_none("description", "Summary") add_not_none("license-key", "License") add_multiple("classifiers", "Classifier") add_multiple("dependencies", "Requires-Dist") if self.config["keywords"]: metadata_mapping["Keywords"] = ','.join(self.config["keywords"]) seen_hp = False # pylint: disable=loop-invariant-statement for category, url in self.config["urls"].items(): if category.lower() in {"homepage", "home page"} and not seen_hp: metadata_mapping["Home-page"] = url seen_hp = True else: metadata_mapping["Project-URL"] = f"{category}, {url}" for platform in (self.config.get("platforms", None) or ()): metadata_mapping["Platform"] = platform if self.config["requires-python"]: metadata_mapping["Requires-Python"] = str(self.config["requires-python"]) for extra, requirements in self.config["optional-dependencies"].items(): metadata_mapping["Provides-Extra"] = extra for requirement in requirements: requirement = ComparableRequirement(str(requirement)) if requirement.marker: requirement.marker = f"({requirement.marker!s}) and extra == {extra!r}" else: requirement.marker = f"extra == {extra!r}" metadata_mapping["Requires-Dist"] = str(requirement) # pylint: enable=loop-invariant-statement # TODO: # https://packaging.python.org/specifications/core-metadata/#requires-external-multiple-use # https://packaging.python.org/specifications/core-metadata/#provides-dist-multiple-use # https://packaging.python.org/specifications/core-metadata/#obsoletes-dist-multiple-use if self.config["readme"] is not None: metadata_mapping["Description"] = self.config["readme"].text metadata_mapping["Description-Content-Type"] = self.config["readme"].content_type return metadata_mapping def write_metadata(self, metadata_file: PathPlus, metadata_mapping: MetadataMapping) -> None: """ Write `Core Metadata`_ to the given file. .. _Core Metadata: https://packaging.python.org/specifications/core-metadata :param metadata_file: """ metadata_file.write_text(metadata.dumps(metadata_mapping)) self.report_written(metadata_file) def call_additional_hooks(self) -> None: """ Subclasses may call this method to give *their* subclasses an opportunity to run custom code. For example, the wheel builder calls this as the final step before adding files to the archive, giving an opportunity for subclasses of :class:`~.WheelBuilder` to include additional steps without having to override the entire :meth:`~.WheelBuilder.build_wheel` method. """ @abstractmethod def build(self) -> str: """ Build the distribution. :returns: The filename of the created archive. """ raise NotImplementedError class SDistBuilder(AbstractBuilder): """ Builds source distributions using metadata read from ``pyproject.toml``. :param project_dir: The project to build the distribution for. :param build_dir: The (temporary) build directory. :default build_dir: :file:`{}/build/sdist` :param out_dir: The output directory. :default out_dir: :file:`{}/dist` :param verbose: Enable verbose output. """ @property def default_build_dir(self) -> PathPlus: # pragma: no cover """ Provides a default for the ``build_dir`` argument. """ return self.project_dir / "build" / "sdist" @property def code_directory(self) -> str: """ The directory containing the code in the build and project directories. """ return '' def create_sdist_archive(self) -> str: """ Create the sdist archive. :return: The filename of the created archive. """ self.out_dir.maybe_make(parents=True) sdist_filename = self.out_dir / f"{self.archive_name}.tar.gz" with tarfile.open(sdist_filename, mode="w:gz", format=tarfile.PAX_FORMAT) as sdist_archive: for file in self.build_dir.rglob('*'): if file.is_file(): arcname = posixpath_join(self.archive_name, file.relative_to(self.build_dir).as_posix()) sdist_archive.add(str(file), arcname=arcname) self._echo(Fore.GREEN(f"Source distribution created at {sdist_filename.resolve().as_posix()}")) return os.path.basename(sdist_filename) def write_pyproject_toml(self) -> None: """ Write the ``pyproject.toml`` file. """ # Copy pyproject.toml pp_toml = dom_toml.load(self.project_dir / "pyproject.toml") # Ensure whey is the build backend and a requirement pp_toml.setdefault("build-system", {}) current_requires = map(ComparableRequirement, pp_toml["build-system"].get("requires", ())) new_requirements = combine_requirements(ComparableRequirement("whey"), *current_requires) pp_toml["build-system"]["requires"] = list(map(str, sorted(new_requirements))) pp_toml["build-system"]["build-backend"] = "whey" dynamic = set(pp_toml["project"].get("dynamic", ())) # Make the "dependencies" static if "dependencies" in dynamic: dynamic.remove("dependencies") pp_toml["project"]["dependencies"] = list(map(str, sorted(self.config["dependencies"]))) # Make the "classifiers" static if "classifiers" in dynamic: dynamic.remove("classifiers") pp_toml["project"]["classifiers"] = list(map(str, sorted(self.config["classifiers"]))) # Make "requires-python" static if "requires-python" in dynamic: dynamic.remove("requires-python") pp_toml["project"]["requires-python"] = str(self.config["requires-python"]) # Set the new value for "dynamic" pp_toml["project"]["dynamic"] = dynamic dom_toml.dump(pp_toml, self.build_dir / "pyproject.toml", encoder=dom_toml.TomlEncoder) self.report_copied(self.project_dir / "pyproject.toml", self.build_dir / "pyproject.toml") def build_sdist(self) -> str: """ Build the source distribution. :return: The filename of the created archive. """ if self.build_dir.is_dir(): shutil.rmtree(self.build_dir) self.build_dir.maybe_make(parents=True) self.copy_source() self.copy_additional_files() self.write_license(self.build_dir) self.write_pyproject_toml() for filename in ["requirements.txt"]: source = self.project_dir / filename if source.is_file(): dest = self.build_dir / filename dest.write_clean(source.read_text()) self.report_copied(source, dest) self.write_readme() self.write_metadata(self.build_dir / "PKG-INFO", self.get_metadata_map()) self.call_additional_hooks() return self.create_sdist_archive() def write_readme(self) -> None: """ Write the ``README.*`` file. """ if self.config["readme"] is None: return if self.config["readme"].content_type == "text/x-rst": target = self.build_dir / "README.rst" elif self.config["readme"].content_type == "text/markdown": target = self.build_dir / "README.md" else: target = self.build_dir / "README" target.parent.maybe_make(parents=True) target.write_clean(self.config["readme"].text) self.report_written(target) build = build_sdist class WheelBuilder(AbstractBuilder): """ Builds wheel binary distributions using metadata read from ``pyproject.toml``. :param project_dir: The project to build the distribution for. :param build_dir: The (temporary) build directory. :default build_dir: :file:`{}/build/wheel` :param out_dir: The output directory. :default out_dir: :file:`{}/dist` :param verbose: Enable verbose output. .. autosummary-widths:: 11/32 .. latex:vspace:: -10px """ @property def default_build_dir(self) -> PathPlus: # pragma: no cover """ Provides a default for the ``build_dir`` argument. """ return self.project_dir / "build" / "wheel" @property def dist_info(self) -> PathPlus: """ The ``*.dist-info`` directory in the build directory. """ dist_info = self.build_dir / f"{self.archive_name}.dist-info" dist_info.maybe_make(parents=True) return dist_info @property def tag(self) -> str: """ The tag for the wheel. """ return "py3-none-any" @property def generator(self) -> str: """ The value for the ``Generator`` field in ``*.dist-info/WHEEL``. """ # this package from whey import __version__ return f"whey ({__version__})" def write_entry_points(self) -> None: """ Write the list of entry points to the wheel, as specified in ``[project.scripts]``, ``[project.gui-scripts]`` and ``[project.entry-points]`` """ # noqa: D400 ep_dict = {} if self.config["scripts"]: ep_dict["console_scripts"] = self.config["scripts"] if self.config["gui-scripts"]: ep_dict["gui_scripts"] = self.config["gui-scripts"] ep_dict.update(self.config["entry-points"]) entry_points_file = self.dist_info / "entry_points.txt" entry_points.dump(ep_dict, entry_points_file) self.report_written(entry_points_file) def write_wheel(self) -> None: """ Write the metadata to the ``WHEEL`` file. """ wheel_file = self.dist_info / "WHEEL" wheel_file.write_clean( wheel.dumps({ "Wheel-Version": "1.0", "Generator": self.generator, "Root-Is-Purelib": True, "Tag": [self.tag], }) ) self.report_written(wheel_file) @staticmethod def get_source_epoch() -> Optional[datetime]: """ Returns the parsed value of the :envvar:`SOURCE_DATE_EPOCH` environment variable, or :py:obj:`None` if unset. See https://reproducible-builds.org/specs/source-date-epoch/ for the specification. :raises ValueError: if the value is in an invalid format. """ # If SOURCE_DATE_EPOCH is set (e.g. by Debian), it's used for timestamps inside the wheel. epoch: Optional[str] = os.environ.get("SOURCE_DATE_EPOCH") if epoch is None: return None elif epoch.isdigit(): return datetime.utcfromtimestamp(int(epoch)) else: raise ValueError(f"'SOURCE_DATE_EPOCH' must be an integer with no fractional component, not {epoch!r}") def create_wheel_archive(self) -> str: """ Create the wheel archive. :return: The filename of the created archive. """ wheel_filename = self.out_dir / f"{self.archive_name}-{self.tag}.whl" self.out_dir.maybe_make(parents=True) mtime = self.get_source_epoch() non_record_filenames = [] record_filenames = [] for file in self.build_dir.rglob('*'): if not file.is_file(): continue if "RECORD" in file.name and self.dist_info.name in file.parts: record_filenames.append(file) continue non_record_filenames.append(file) record_filenames = sort_paths(*record_filenames, self.dist_info / "RECORD") with handy_archives.ZipFile(wheel_filename, mode='w') as wheel_archive: with (self.dist_info / "RECORD").open('w') as fp: for file in sort_paths(*non_record_filenames): # pylint: disable=loop-invariant-statement fp.write(f"{get_record_entry(file, relative_to=self.build_dir)}\n") wheel_archive.write_file( file, arcname=file.relative_to(self.build_dir), mtime=mtime, ) for file in record_filenames: fp.write(f"{file.relative_to(self.build_dir).as_posix()},,\n") for file in record_filenames: wheel_archive.write_file( file, arcname=file.relative_to(self.build_dir), mtime=mtime, ) self.report_written(file) self._echo(Fore.GREEN(f"Wheel created at {wheel_filename.resolve().as_posix()}")) return wheel_filename.name def create_editables_files(self) -> Iterator[ComparableRequirement]: """ Generate files with `editables`_ for use in a :pep:`660` wheel. .. _editables: https://pypi.org/project/editables/ .. extras-require:: editable :scope: method :pyproject: :returns: An iterator of additional runtime requirements which should be added to the wheel's ``METADATA`` file. """ # this package from whey._editable import EditableProject pkgdir = self.project_dir / self.config["source-dir"] / self.config["package"] if not pkgdir.is_dir(): message = f"Package directory {self.config['package']!r} not found" if self.config["source-dir"]: raise FileNotFoundError(f"{message} in {self.config['source-dir']!r}.") else: raise FileNotFoundError(f"{message}.") my_project = EditableProject( self.config["name"].replace('-', '_'), pkgdir.parent, ) my_project.map_or_add_to_path(self.config["package"], pkgdir) for name, content in my_project.files(): target = self.build_dir / name target.parent.maybe_make(parents=True) target.write_clean(content) self.report_written(target) yield from map(ComparableRequirement, my_project.dependencies()) def build_wheel(self) -> str: """ Build the binary wheel distribution. :return: The filename of the created archive. """ if self.build_dir.is_dir(): shutil.rmtree(self.build_dir) self.build_dir.maybe_make(parents=True) self.copy_source() self.copy_additional_files() self.write_license(self.dist_info) self.write_entry_points() self.write_metadata(self.dist_info / "METADATA", self.get_metadata_map()) self.write_wheel() self.call_additional_hooks() return self.create_wheel_archive() build = build_wheel def build_editable(self) -> str: """ Build an editable wheel. An "editable" wheel uses the wheel format not for distribution but as ephemeral communication between the build system and the front end. This avoids having the build backend install anything directly. This wheel must not be exposed to end users, nor cached, nor distributed. You should use a different ``build_dir`` and ``out_dir`` to those used for standard wheel builds. The default implementation of this method does not call :meth:`~.AbstractBuilder.copy_source` or :meth:`~.AbstractBuilder.copy_additional_files`. .. extras-require:: editable :scope: method :pyproject: :return: The filename of the created archive. """ if self.build_dir.is_dir(): shutil.rmtree(self.build_dir) self.build_dir.maybe_make(parents=True) extra_deps = self.create_editables_files() self.write_license(self.dist_info) self.write_entry_points() metadata = self.get_metadata_map() for dep in extra_deps: if not any(dep.name in req for req in metadata.get_all("Requires-Dist", ())): # Additional runtime requirement for editable wheels. metadata["Requires-Dist"] = str(dep) # Prevents uploading to PyPI, which you shouldn't do with an editable wheel. metadata["Classifier"] = "Private :: Do Not Upload" self.write_metadata(self.dist_info / "METADATA", metadata) self.write_wheel() self.call_additional_hooks() return self.create_wheel_archive() whey-0.0.24/whey/config/000077500000000000000000000000001442026364700150025ustar00rootroot00000000000000whey-0.0.24/whey/config/__init__.py000066400000000000000000000077061442026364700171250ustar00rootroot00000000000000#!/usr/bin/env python3 # # __init__.py """ ``pyproject.toml`` configuration parsing. """ # # Copyright © 2021 Dominic Davis-Foster # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib import re from typing import Any, Dict # 3rd party import dom_toml import dom_toml.decoder from dom_toml.parser import BadConfigError from domdf_python_tools.iterative import natmin from domdf_python_tools.paths import PathPlus, in_directory from domdf_python_tools.typing import PathLike from packaging.requirements import InvalidRequirement from packaging.specifiers import Specifier from shippinglabel.requirements import combine_requirements, read_requirements # this package from whey.config.pep621 import PEP621Parser from whey.config.whey import WheyParser, backfill_classifiers __all__ = ( "PEP621Parser", "WheyParser", "backfill_classifiers", "load_toml", ) _name_to_package_re = re.compile("-(?!stubs)") def _get_default_package(name: str) -> str: return _name_to_package_re.sub('_', name.split('.', 1)[0]) def load_toml(filename: PathLike) -> Dict[str, Any]: # TODO: TypedDict """ Load the ``whey`` configuration mapping from the given TOML file. :param filename: """ filename = PathPlus(filename) project_dir = filename.parent config = dom_toml.load(filename, decoder=dom_toml.decoder.TomlPureDecoder) parsed_config = {} tool_table = config.get("tool", {}) with in_directory(project_dir): parsed_config.update(WheyParser().parse(tool_table.get("whey", {}), set_defaults=True)) if "project" in config: parsed_config.update(PEP621Parser().parse(config["project"], set_defaults=True)) else: raise KeyError(f"'project' table not found in '{filename!s}'") if parsed_config.get("readme", None) is not None: parsed_config["readme"] = parsed_config["readme"].resolve() if parsed_config.get("license", None) is not None: parsed_config["license"] = parsed_config["license"].resolve() # set defaults parsed_config.setdefault("package", _get_default_package(config["project"]["name"])) dynamic_fields = parsed_config.get("dynamic", []) if "classifiers" in dynamic_fields: parsed_config["classifiers"] = backfill_classifiers(parsed_config) if "requires-python" in dynamic_fields and parsed_config["python-versions"]: parsed_config["requires-python"] = Specifier(f">={natmin(parsed_config['python-versions'])}") if "dependencies" in dynamic_fields: if (project_dir / "requirements.txt").is_file(): dependencies, comments, invalid = read_requirements(project_dir / "requirements.txt", include_invalid=True) for bad_string in invalid: raise InvalidRequirement(bad_string) parsed_config["dependencies"] = sorted(combine_requirements(dependencies)) else: raise BadConfigError( "'project.dependencies' was listed as a dynamic field " "but no 'requirements.txt' file was found." ) if "base-classifiers" in parsed_config: del parsed_config["base-classifiers"] return parsed_config whey-0.0.24/whey/config/pep621.py000066400000000000000000000101101442026364700163620ustar00rootroot00000000000000#!/usr/bin/env python3 # # pep621.py """ :pep:`621` configuration parser. """ # # Copyright © 2021 Dominic Davis-Foster # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib from typing import Dict, cast # 3rd party import pyproject_parser.parsers from dom_toml.parser import TOML_TYPES, BadConfigError from domdf_python_tools.words import Plural, word_join from pyproject_parser.type_hints import ProjectDict __all__ = ("PEP621Parser", ) _field = Plural("field", "fields") class PEP621Parser(pyproject_parser.parsers.PEP621Parser, inherit_defaults=True): """ Parser for :pep:`621` metadata from ``pyproject.toml``. """ defaults = { "description": None, "readme": None, "requires-python": None, "license": None, } def _parse( self, config: Dict[str, TOML_TYPES], set_defaults: bool = False, ) -> ProjectDict: dynamic_fields = config.get("dynamic", []) parsed_config = {"dynamic": dynamic_fields} for key in self.keys: if key in config and key in dynamic_fields: raise BadConfigError(f"{key!r} was listed in 'project.dynamic' but a value was given.") elif key not in config: # Ignore absent values pass elif hasattr(self, f"parse_{key.replace('-', '_')}"): parsed_config[key] = getattr(self, f"parse_{key.replace('-', '_')}")(config) elif key in config: parsed_config[key] = config[key] if set_defaults: for key, value in self.defaults.items(): parsed_config.setdefault(key, value) for key, factory in self.factories.items(): value = factory() parsed_config.setdefault(key, value) return cast(ProjectDict, parsed_config) def parse( # type: ignore[override] self, config: Dict[str, TOML_TYPES], set_defaults: bool = False, ) -> ProjectDict: """ Parse the TOML configuration. :param config: :param set_defaults: If :py:obj:`True`, the values in :attr:`dom_toml.parser.AbstractConfigParser.defaults` and :attr:`dom_toml.parser.AbstractConfigParser.factories` will be set as defaults for the returned mapping. """ dynamic_fields = set(config.get("dynamic", [])) if "name" in dynamic_fields: raise BadConfigError("The 'project.name' field may not be dynamic.") elif "name" not in config: raise BadConfigError("The 'project.name' field must be provided.") if dynamic_fields: # TODO: Support the remaining fields as dynamic # TODO: dynamic version numbers by parsing AST for __version__ in __init__.py supported_dynamic = {"classifiers", "requires-python", "dependencies"} unsupported_fields = dynamic_fields - supported_dynamic if unsupported_fields: supported = word_join(sorted(supported_dynamic), oxford=True, use_repr=True) unsupported = word_join(sorted(unsupported_fields), oxford=True, use_repr=True) raise BadConfigError( f"Unsupported dynamic {_field(len(unsupported_fields))} {unsupported}.\n" f"note: whey only supports {supported} as dynamic fields." ) if "version" not in config: raise BadConfigError("The 'project.version' field must be provided.") return self._parse(config, set_defaults) whey-0.0.24/whey/config/whey.py000066400000000000000000000305101442026364700163270ustar00rootroot00000000000000#!/usr/bin/env python3 # # whey.py """ Parser for whey's own configuration. """ # # Copyright © 2021 Dominic Davis-Foster # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib from typing import Dict, List, Set, Type, cast # 3rd party import dist_meta.entry_points from dom_toml.parser import TOML_TYPES, AbstractConfigParser, BadConfigError from natsort import natsorted from shippinglabel.classifiers import validate_classifiers # this package from whey.builder import AbstractBuilder, SDistBuilder, WheelBuilder __all__ = ( "WheyParser", "backfill_classifiers", "get_default_builders", "get_entry_points", "license_lookup", ) #: Mapping of license short codes to license names used in trove classifiers. license_lookup = { "Apache-2.0": "Apache Software License", "BSD": "BSD License", "BSD-2-Clause": "BSD License", "BSD-3-Clause": "BSD License", "AGPL-3.0-only": "GNU Affero General Public License v3", "AGPL-3.0": "GNU Affero General Public License v3", "AGPL-3.0-or-later": "GNU Affero General Public License v3 or later (AGPLv3+)", "AGPL-3.0+": "GNU Affero General Public License v3 or later (AGPLv3+)", "FDL": "GNU Free Documentation License (FDL)", "GFDL-1.1-only": "GNU Free Documentation License (FDL)", "GFDL-1.1-or-later": "GNU Free Documentation License (FDL)", "GFDL-1.2-only": "GNU Free Documentation License (FDL)", "GFDL-1.2-or-later": "GNU Free Documentation License (FDL)", "GFDL-1.3-only": "GNU Free Documentation License (FDL)", "GFDL-1.3-or-later": "GNU Free Documentation License (FDL)", "GFDL-1.2": "GNU Free Documentation License (FDL)", "GFDL-1.1": "GNU Free Documentation License (FDL)", "GFDL-1.3": "GNU Free Documentation License (FDL)", "GPL": "GNU General Public License (GPL)", "GPL-1.0-only": "GNU General Public License (GPL)", "GPL-1.0-or-later": "GNU General Public License (GPL)", "GPLv2": "GNU General Public License v2 (GPLv2)", "GPL-2.0-only": "GNU General Public License v2 (GPLv2)", "GPLv2+": "GNU General Public License v2 or later (GPLv2+)", "GPL-2.0-or-later": "GNU General Public License v2 or later (GPLv2+)", "GPLv3": "GNU General Public License v3 (GPLv3)", "GPL-3.0-only": "GNU General Public License v3 (GPLv3)", "GPLv3+": "GNU General Public License v3 or later (GPLv3+)", "GPL-3.0-or-later": "GNU General Public License v3 or later (GPLv3+)", "LGPLv2": "GNU Lesser General Public License v2 (LGPLv2)", "LGPLv2+": "GNU Lesser General Public License v2 or later (LGPLv2+)", "LGPLv3": "GNU Lesser General Public License v3 (LGPLv3)", "LGPL-3.0-only": "GNU Lesser General Public License v3 (LGPLv3)", "LGPLv3+": "GNU Lesser General Public License v3 or later (LGPLv3+)", "LGPL-3.0-or-later": "GNU Lesser General Public License v3 or later (LGPLv3+)", "LGPL": "GNU Library or Lesser General Public License (LGPL)", "MIT": "MIT License", "PSF-2.0": "Python Software Foundation License", } def get_default_builders() -> Dict[str, Type[AbstractBuilder]]: """ Returns a mapping of builder categories to builder classes to use as the default builders. """ return {"sdist": SDistBuilder, "binary": WheelBuilder, "wheel": WheelBuilder} class WheyParser(AbstractConfigParser): """ Parser for the ``[tool.whey]`` table from ``pyproject.toml``. .. autosummary-widths:: 1/2 """ defaults = { "source-dir": '.', "license-key": None, "platforms": None, "python-versions": None, "python-implementations": None, } factories = { "additional-files": list, "base-classifiers": list, "builders": get_default_builders, } def parse_package(self, config: Dict[str, TOML_TYPES]) -> str: """ Parse the ``package`` key, giving the name of the importable package. This defaults to :pep621:`project.name ` if unspecified. :param config: The unparsed TOML config for the ``[tool.whey]`` table. """ package = config["package"] self.assert_type(package, str, ["tool", "whey", "package"]) return package def parse_source_dir(self, config: Dict[str, TOML_TYPES]) -> str: """ Parse the ``source-dir`` key, giving the name of the directory containing the project's source. This defaults to ``'.'`` if unspecified. :param config: The unparsed TOML config for the ``[tool.whey]`` table. """ source_dir = config["source-dir"] self.assert_type(source_dir, str, ["tool", "whey", "source-dir"]) return source_dir def parse_license_key(self, config: Dict[str, TOML_TYPES]) -> str: """ Parse the ``license-key`` key, giving the identifier of the project's license. Optional. :param config: The unparsed TOML config for the ``[tool.whey]`` table. """ license_key = config["license-key"] self.assert_type(license_key, str, ["tool", "whey", "license-key"]) return license_key def parse_additional_files(self, config: Dict[str, TOML_TYPES]) -> List[str]: """ Parse the ``additional-files`` key, giving `MANIFEST.in`_-style entries for additional files to include in distributions. .. _MANIFEST.in: https://packaging.python.org/guides/using-manifest-in/ :param config: The unparsed TOML config for the ``[tool.whey]`` table. """ # noqa: D400 additional_files = config["additional-files"] for idx, file in enumerate(additional_files): self.assert_indexed_type(file, str, ["tool", "whey", "additional-files"], idx=idx) return additional_files def parse_platforms(self, config: Dict[str, TOML_TYPES]) -> List[str]: """ Parse the ``platforms`` key, giving a list of supported platforms. Optional. :param config: The unparsed TOML config for the ``[tool.whey]`` table. """ platforms = config["platforms"] for idx, plat in enumerate(platforms): self.assert_indexed_type(plat, str, ["tool", "whey", "platforms"], idx=idx) return platforms @staticmethod def parse_python_versions(config: Dict[str, TOML_TYPES]) -> List[str]: """ Parse the ``python-versions`` key, giving a list of supported Python versions. Optional. :param config: The unparsed TOML config for the ``[tool.whey]`` table. """ python_versions = config["python-versions"] for idx, version in enumerate(python_versions): if not isinstance(version, (str, int, float)): raise TypeError( f"Invalid type for 'tool.whey.python-versions[{idx}]': " f"expected {str!r}, {int!r} or {float!r}, got {type(version)!r}" ) if str(version)[0] in "12": raise BadConfigError( f"Invalid value for 'tool.whey.python-versions[{idx}]': whey only supports Python 3-only projects." ) return list(map(str, python_versions)) def parse_python_implementations(self, config: Dict[str, TOML_TYPES]) -> List[str]: """ Parse the ``python-implementations`` key, giving a list of supported Python implementations. Optional. :param config: The unparsed TOML config for the ``[tool.whey]`` table. """ python_implementations = config["python-implementations"] for idx, impl in enumerate(python_implementations): self.assert_indexed_type(impl, str, ["tool", "whey", "python-implementations"], idx=idx) return python_implementations def parse_base_classifiers(self, config: Dict[str, TOML_TYPES]) -> Set[str]: """ Parse the ``base-classifiers`` key, giving a list `trove classifiers `__. This list will be extended with the appropriate classifiers for supported platforms, Python versions and implementations, and the project's license. Ignored if :pep621:`classifiers` is not listed in :pep621:`dynamic` :param config: The unparsed TOML config for the ``[tool.whey]`` table. :rtype: .. latex:clearpage:: """ parsed_classifiers = set() for idx, classifier in enumerate(config["base-classifiers"]): self.assert_indexed_type(classifier, str, ["tool", "whey", "python-implementations"], idx=idx) parsed_classifiers.add(classifier) return parsed_classifiers def parse_builders(self, config: Dict[str, TOML_TYPES]) -> Dict[str, Type[AbstractBuilder]]: """ Parse the ``builders`` table, which lists gives the entry points to use for the sdist and wheel builders. This allows the user to select a custom builder with additional functionality. :param config: The unparsed TOML config for the ``[tool.whey]`` table. """ parsed_builders = get_default_builders() builders = config["builders"] entry_points: Dict[str, dist_meta.entry_points.EntryPoint] = get_entry_points() self.assert_type(builders, dict, ["tool", "whey", "builders"]) for builder_type in ["binary", "sdist", "wheel"]: if builder_type in builders: entry_point_name = builders[builder_type] if entry_point_name not in entry_points: raise BadConfigError( f"Unknown {builder_type} builder {entry_point_name!r}. \n" f"Is it registered as an entry point under 'whey.builder'?" ) parsed_builders[builder_type] = cast(Type[AbstractBuilder], entry_points[entry_point_name].load()) return parsed_builders @property def keys(self) -> List[str]: """ The keys to parse from the TOML file. """ return [ "package", "source-dir", "additional-files", "license-key", "base-classifiers", "platforms", "python-versions", "python-implementations", "builders", ] def backfill_classifiers(config: Dict[str, TOML_TYPES]) -> List[str]: """ Backfill `trove classifiers `_ for supported platforms, Python versions and implementations, and the project's license, as appropriate. :param config: The parsed config from ``pyproject.toml``. """ # noqa: D400 # TODO: Typing :: Typed parsed_classifiers = set(config["base-classifiers"]) platforms = config["platforms"] license_key = config["license-key"] python_versions = config["python-versions"] python_implementations = config["python-implementations"] if license_key in license_lookup: parsed_classifiers.add(f"License :: OSI Approved :: {license_lookup[license_key]}") if platforms: if set(platforms) == {"Windows", "macOS", "Linux"}: parsed_classifiers.add("Operating System :: OS Independent") else: if "Windows" in platforms: parsed_classifiers.add("Operating System :: Microsoft :: Windows") if "Linux" in platforms: parsed_classifiers.add("Operating System :: POSIX :: Linux") if "macOS" in platforms: parsed_classifiers.add("Operating System :: MacOS") if python_versions: for version in python_versions: parsed_classifiers.add(f"Programming Language :: Python :: {version}") parsed_classifiers.add("Programming Language :: Python :: 3 :: Only") if python_implementations: for implementation in python_implementations: parsed_classifiers.add(f"Programming Language :: Python :: Implementation :: {implementation}") parsed_classifiers.add("Programming Language :: Python") validate_classifiers(parsed_classifiers) return natsorted(parsed_classifiers) def get_entry_points(group: str = "whey.builder") -> Dict[str, dist_meta.entry_points.EntryPoint]: r""" Returns an iterable over `EntryPoint`_ objects in the ``group`` group. :param group: :rtype: :class:`Iterable `\[`EntryPoint`_\] .. _EntryPoint: https://docs.python.org/3/library/importlib.metadata.html#entry-points """ eps = dist_meta.entry_points.get_entry_points(group) entry_points: Dict[str, dist_meta.entry_points.EntryPoint] = {} for entry_point in eps: # pylint: disable=use-dict-comprehension if entry_point.group == group: entry_points[entry_point.name] = entry_point return entry_points whey-0.0.24/whey/foreman.py000066400000000000000000000076561442026364700155540ustar00rootroot00000000000000#!/usr/bin/env python3 # # foreman.py """ The foreman is responsible for loading the configuration calling the builders. """ # # Copyright © 2021 Dominic Davis-Foster # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib from typing import Optional, Type # 3rd party from consolekit.terminal_colours import ColourTrilean from domdf_python_tools.paths import PathPlus, traverse_to_file from domdf_python_tools.typing import PathLike # this package from whey.builder import AbstractBuilder from whey.config import load_toml __all__ = ("Foreman", ) class Foreman: """ Responsible for loading the configuration calling the builders. """ def __init__(self, project_dir: PathLike): # Walk up the tree until a ``pyproject.toml`` file is found. #: The pyproject.toml directory self.project_dir: PathPlus = traverse_to_file(PathPlus(project_dir), "pyproject.toml") #: Configuration parsed from ``pyproject.toml``. self.config = load_toml(self.project_dir / "pyproject.toml") def get_builder(self, distribution_type: str) -> Type[AbstractBuilder]: """ Returns the builder for the given distribution type. :param distribution_type: The distribution type, such as ``'source'`` or ``'wheel'``. """ return self.config["builders"][distribution_type] def build_sdist( self, build_dir: Optional[PathLike] = None, out_dir: Optional[PathLike] = None, *args, verbose: bool = False, colour: ColourTrilean = None, **kwargs, ) -> str: """ Build a sdist distribution using the ``sdist`` builder configured in ``pyproject.toml``. :returns: The filename of the created archive. """ builder = self.get_builder("sdist")( self.project_dir, self.config, build_dir, out_dir, *args, verbose=verbose, colour=colour, **kwargs, ) return builder.build() def build_binary( self, build_dir: Optional[PathLike] = None, out_dir: Optional[PathLike] = None, *args, verbose: bool = False, colour: ColourTrilean = None, **kwargs, ) -> str: """ Build a binary distribution using the ``binary`` builder configured in ``pyproject.toml``. :returns: The filename of the created archive. """ builder = self.get_builder("binary")( self.project_dir, self.config, build_dir, out_dir, *args, verbose=verbose, colour=colour, **kwargs, ) return builder.build() def build_wheel( self, build_dir: Optional[PathLike] = None, out_dir: Optional[PathLike] = None, *args, verbose: bool = False, colour: ColourTrilean = None, **kwargs, ) -> str: """ Build a wheel distribution using the ``wheel`` builder configured in ``pyproject.toml``. :returns: The filename of the created archive. """ builder = self.get_builder("wheel")( self.project_dir, self.config, build_dir, out_dir, *args, verbose=verbose, colour=colour, **kwargs, ) return builder.build() whey-0.0.24/whey/py.typed000066400000000000000000000000001442026364700152220ustar00rootroot00000000000000whey-0.0.24/whey/utils.py000066400000000000000000000070071442026364700152530ustar00rootroot00000000000000#!/usr/bin/env python3 # # utils.py """ General utilities. """ # # Copyright © 2021 Dominic Davis-Foster # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # # stdlib from typing import Dict, Iterable, Optional, Type, cast # 3rd party import click from domdf_python_tools.words import Plural from pyproject_parser.cli import ConfigTracebackHandler # this package from whey.builder import AbstractBuilder from whey.config.whey import get_entry_points from whey.foreman import Foreman __all__ = ("WheyTracebackHandler", "parse_custom_builders", "print_builder_names") _builder = Plural("builder", "builders") class WheyTracebackHandler(ConfigTracebackHandler): """ Custom :class:`consolekit.tracebacks.TracebackHandler`. """ class WheyBackendTBHandler(WheyTracebackHandler): def __init__(self, exception: BaseException = SystemExit(1)): super().__init__(exception) def parse_custom_builders(builders: Optional[Iterable[str]]) -> Dict[str, Type[AbstractBuilder]]: """ Parse the custom builders passed using the ``--builder NAME`` option on the command line. :param builders: """ custom_builders: Dict[str, Type[AbstractBuilder]] = {} if builders is None: return custom_builders entry_points = get_entry_points() for builder_name in builders: if builder_name not in entry_points: raise click.BadArgumentUsage( f"Unknown builder {builder_name!r}. \n" f"Is it registered as an entry point under 'whey.builder'?" ) else: custom_builders[builder_name] = cast(Type[AbstractBuilder], entry_points[builder_name].load()) return custom_builders def print_builder_names( foreman: Foreman, custom_builders: Dict[str, Type[AbstractBuilder]], **opts: bool, ) -> None: """ Prints the name(s) of the builders which will be used. :param foreman: :param custom_builders: :param opts: Keyword arguments for builder categories. Corresponds to the ``--sdist``, ``--wheel`` and ``--binary`` options. """ builders = [] for builder_name, enabled in opts.items(): if enabled: builder_obj = foreman.config["builders"][builder_name] # pylint: disable=loop-invariant-statement builders.append(f" {builder_name}: {builder_obj.__module__}.{builder_obj.__qualname__}") for builder_name, builder_obj in custom_builders.items(): # pylint: disable=use-list-copy builders.append(f" {builder_name}: {builder_obj.__module__}.{builder_obj.__qualname__}") click.echo(f"Using the following {_builder(len(builders))}:") for line in builders: click.echo(line) click.echo()