diff --git a/.cirrus.yml b/.cirrus.yml index f1cb8dba078..c54ff6e7656 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,35 +1,80 @@ -freebsd_instance: - image_family: freebsd-14-0 - cpu: 2 - memory: 4G - -test_task: - name: "Tests / FreeBSD / " - only_if: $CIRRUS_TAG == '' - skip: "!changesInclude('.cirrus.yml', 'poetry.lock', 'pyproject.toml', '**.json','**.py')" +tests_task: + # We only use Cirrus CI for FreeBSD at present; the rest of the task will assume FreeBSD. + freebsd_instance: + image_family: freebsd-14-0 + # Cirrus has a concurrency limit of 8 vCPUs for FreeBSD. Allow executing 4 tasks in parallel. + cpu: 2 + memory: 2G + env: - # `SHELL` environment variable is not set by default, so we explicitly set it to - # avoid failures on tests that depend on it. - SHELL: sh matrix: - PYTHON: python3.8 + PYTHON_VERSION: 3.8 + PYTHON_PACKAGE: python38 + SQLITE_PACKAGE: py38-sqlite3 - PYTHON: python3.9 + PYTHON_VERSION: 3.9 + PYTHON_PACKAGE: python39 + SQLITE_PACKAGE: py39-sqlite3 - PYTHON: python3.10 + PYTHON_VERSION: 3.10 + PYTHON_PACKAGE: python310 + SQLITE_PACKAGE: py310-sqlite3 - PYTHON: python3.11 - install_prereqs_script: - - V=$(printf '%s' $PYTHON | tr -d '.[:alpha:]') - - pkg install -y python${V} py${V}-sqlite3 - install_poetry_script: - - POETRY_HOME=/opt/poetry + PYTHON_VERSION: 3.11 + PYTHON_PACKAGE: python311 + SQLITE_PACKAGE: py311-sqlite3 + # FIXME: Python 3.12 is not available in Ports. + # - PYTHON: python3.12 + # PYTHON_VERSION: 3.12 + # PYTHON_PACKAGE: python312 + # SQLITE_PACKAGE: py312-sqlite3 + # FIXME: use pipx for install. pipx is currently broken in Ports. + POETRY_HOME: /opt/poetry + # SHELL is not set by default, and we have tests that depend on it. + SHELL: sh + + bootstrap_poetry_script: + - pkg install -y git $PYTHON_PACKAGE $SQLITE_PACKAGE - $PYTHON -m venv $POETRY_HOME - - $POETRY_HOME/bin/pip install --upgrade pip setuptools wheel - $POETRY_HOME/bin/pip install poetry - - echo "PATH=$POETRY_HOME/bin:$PATH" >> $CIRRUS_ENV - install_and_test_script: + - echo "PATH=${POETRY_HOME}/bin:${PATH}" >> $CIRRUS_ENV + + setup_environment_script: + # FIXME: --sync is broken due to a bug with py-sqlite3 packaging. + # TODO: caching - poetry install - - poetry run pytest --junitxml=junit.xml -v - on_failure: - annotate_failure_artifacts: - path: junit.xml - format: junit - type: text/xml + - poetry env info + - poetry show + + matrix: + - alias: pytest + name: "Tests / FreeBSD (Python ${PYTHON_VERSION}) / pytest" + skip: "!changesInclude('.cirrus.yml', 'poetry.lock', 'pyproject.toml', 'src/**.py', 'tests/**')" + pytest_script: poetry run pytest --integration -v --junitxml=junit.xml + on_failure: + annotate_failure_artifacts: + path: junit.xml + format: junit + type: text/xml + + # TODO: caching + - alias: mypy + name: "Tests / FreeBSD (Python ${PYTHON_VERSION}) / mypy" + skip: "!changesInclude('.cirrus.yml', 'poetry.lock', 'pyproject.toml', 'src/**.py')" + mypy_script: poetry run mypy + +status_task: + name: "Tests / FreeBSD Status" + + depends_on: + - pytest + - mypy + + container: + image: alpine:latest + cpu: 0.5 + memory: 512M + + # No-op the clone. + clone_script: true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000..ff6bee3eee9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Do not mess with line endings in metadata files or the hash will be wrong. +*.metadata binary diff --git a/.github/actions/bootstrap-poetry/action.yml b/.github/actions/bootstrap-poetry/action.yml new file mode 100644 index 00000000000..ad8ec7d6b2a --- /dev/null +++ b/.github/actions/bootstrap-poetry/action.yml @@ -0,0 +1,31 @@ +name: Bootstrap Poetry +description: Configure the environment with the specified Python and Poetry version. + +inputs: + python-version: + description: Desired Python version + default: "3.12" + python-latest: + description: Use an uncached Python if a newer match is available + default: 'false' + poetry-spec: + description: pip-compatible installation specification to use for Poetry + default: 'poetry' + +runs: + using: composite + steps: + # Enable handling long path names (+260 char) on the Windows platform + # https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation + - run: git config --system core.longpaths true + if: runner.os == 'Windows' + shell: pwsh + + - run: pipx install '${{ inputs.poetry-spec }}' + shell: bash + + - uses: actions/setup-python@v5 + with: + python-version: ${{ inputs.python-version }} + check-latest: ${{ inputs.python-latest == 'true' }} + cache: poetry diff --git a/.github/scripts/backport.sh b/.github/scripts/backport.sh new file mode 100755 index 00000000000..8c3155bc659 --- /dev/null +++ b/.github/scripts/backport.sh @@ -0,0 +1,234 @@ +#!/usr/bin/env bash +# +# Copyright 2024 Bjorn Neergaard +# +# This work is licensed under the terms of the MIT license. +# For a copy, see . +# +# This script is used to automatically create backport pull requests. It is +# smart enough to require no arguments if run against a PR branch, assuming the +# upstream repo conforms to the default prefixes. Target branches will be +# determined by labels present on the original pull request. +# +# It is capable of handling PRs merged with a commit, by rebase and by +# squash-and-rebase. The backport pull request will have its title, body and +# labels derived from the original. The cherry-picked comments can be signed off, +# and a comment will be created if requested. +# +# In particular, this script assumes the 'origin' remote points to the target +# repository for backports. We also assume we can freely clobber local and remote +# branches using our backport branch naming scheme and that you don't mind if we +# prune your worktrees for you. +# +# This script can push the backport branches to a fork if a corresponding +# --remote is passed. + +basename=${0##*/} + +# Check for Homebrew-installed getopt on macOS. +for g in /{usr/local,opt/homebrew}/opt/gnu-getopt/bin/getopt; do + test -x "$g" && : GETOPT="${GETOPT:=$g}" && break +done || : GETOPT="${GETOPT:=getopt}" + +"${GETOPT}" --test >/dev/null +if [ $? -ne 4 ]; then + printf >&2 '%s: GNU getopt is required, please ensure it is available in the PATH\n' "$basename" + exit 1 +fi + +if ! command -v gh >/dev/null; then + printf >&2 "%s: the GitHub CLI (\`gh') is required, please ensure it is available in the PATH\n" "$basename" +fi + +usage() { + printf >&2 '%s -h|--help\n' "$basename" + printf >&2 '%s [-s|--signoff] [-c|--comment] --pr [pr] --remote [remote] --branch-prefix [prefix] --label-prefix [prefix]\n' "$basename" +} + +args="$("${GETOPT}" -o h,s,c -l help,signoff,comment,pr:,remote:,branch-prefix:,label-prefix: -n "$basename" -- "$@")" || exit $? +eval set -- "$args" +unset args + +while [ "$#" -gt 0 ]; do + case "$1" in + --pr | --remote | --branch-prefix | --label-prefix) + flag="${1:2}" + printf -v "${flag//-/_}" '%s' "$2" + shift 2 + ;; + -s | --signoff) + signoff=1 + shift + ;; + -c | --comment) + comment=1 + shift + ;; + -h | --help) + usage + exit + ;; + -- | *) + shift + break + ;; + esac +done + +set -eux -o pipefail + +# Determine the number of the target pull request, if not already supplied. +: pr="${pr:=$(gh pr view --json number --jq '.number')}" + +# Use the 'origin' remote by default; if a fork is desired, a corresponding remote should +# be specified, e.g. `gh repo fork --remote-name fork` and `--remote fork`. +: remote="${remote:=origin}" + +# Use 'backport/' as a default prefix for both the resulting branch and the triggering label. +: branch_prefix="${branch_prefix:=backport/}" +: label_prefix="${label_prefix:=backport/}" + +# Determine the owner of the target remote (necessary to open a pull request) based on the URL. +remote_owner=$(basename "$(dirname "$(git remote get-url --push "$remote")")") + +# Get the state, base branch and merge commit (if it exists) of the pull request. +pr_meta=$(gh pr view --json state,baseRefName,mergeCommit --jq '[.state,.baseRefName,.mergeCommit.oid][]' "$pr") +pr_state=$(sed '1q;d' <<<"$pr_meta") +pr_base=$(sed '2q;d' <<<"$pr_meta") +pr_mergecommit=$(sed '3q;d' <<<"$pr_meta") + +# Get the list of commits present in the pull request. +pr_commits=$(gh pr view --json commits --jq '.commits[].oid' "$pr") + +# Get the title and body of the pull request. +pr_title_body=$(gh pr view --json title,body --jq '[.title,.body][]' "$pr") +pr_title=$(head -n 1 <<<"$pr_title_body") +pr_body=$(tail -n +2 <<<"$pr_title_body") +# Gather the list of labels on the pull request. +pr_labels=$(gh pr view --json labels --jq '.labels[].name' "$pr") + +# Fetch origin, to ensure we have the latest commits on all upstream branches. +git fetch origin +# Fetch the latest pull request head, to ensure we have all commits available locally. +# It will be available as FETCH_HEAD for the remainder of this script. +git fetch origin "refs/pull/${pr}/head" + +# Determine which commits should be cherry-picked. This can be surprisingly complex, +# but the typical cases present on GitHub are handled here. +if [ "$pr_state" = OPEN ] || [ "$(git rev-list --no-walk --count --merges "$pr_mergecommit")" -eq 1 ]; then + # Unmerged, or merge commit: the list of commits is equivalent to the pull request. + backport_commits=$pr_commits +else + # The cherry commits represent those commits that were cherry-picked from the pull request to the base. + pr_cherry_commits=$(git cherry refs/remotes/origin/main FETCH_HEAD | sed -n '/^- / s/- //p') + # The rebased commits represent those commits present in the base that correspond to the pull request. + pr_rebased_commits=$(git cherry FETCH_HEAD refs/remotes/origin/main | sed -n '/^- / s/- //p') + + # Look for cherry-picks (which is what a conflict-free and non-interactive rebase merge + # effectively does). Note that a squash confuses the list of rebased commits; + # to make our heuristics as effective as possible, we have two checks: + # * Git must successfully identify the list of commits cherry-picked from the PR. + # * The number of commits in the pull request and identified for backport must match. + if [ "$pr_cherry_commits" = "$pr_commits" ] \ + && [ "$(wc -l <<<"$pr_rebased_commits")" -eq "$(wc -l <<<"$pr_commits")" ]; then + # Rebase: the list of commits is those rebased into the base branch. + backport_commits=$pr_rebased_commits + else + # Squash-and-rebase: the list of commits is the singular merged commit. + backport_commits=$pr_mergecommit + fi +fi + +# Create a temporary directory in which to hold worktrees for each backport attempt. +workdir="$(mktemp -d)" +trap 'rm -rf "${workdir}"; git worktree prune -v' EXIT + +# Create some arrays to track success and failure. +backport_urls=() +failed_backports=() + +# Iterate over all labels matching the prefix to determine what branches must be backported. +while IFS= read -r backport_label; do + target_branch="${backport_label/#${label_prefix}}" + backport_branch="${branch_prefix}${pr}-${target_branch}" + + # Check that the target branch and base branch are not the same. This heads off some + # potential errors. + if [ "$target_branch" = "$pr_base" ]; then + continue + fi + + # Create a new backport branch, in a new worktree, based on the target branch. + backport_worktree="${workdir}/${backport_branch}" + git worktree add -B "$backport_branch" "$backport_worktree" "refs/remotes/origin/${target_branch}" + + # Cherry-pick the commits from the target branch in order. + for commit in $backport_commits; do + if ! git -C "$backport_worktree" cherry-pick -x ${signoff:+-s} "$commit"; then + # If a cherry-pick fails, record the branch and move on. + failed_backports+=("$target_branch") + continue 2 + fi + done + + # Push the resulting backport branch to the configured remote. + git push -f "$remote" "$backport_branch" + + # Create a derived title and label for the PR. + backport_title="[${target_branch} backport] ${pr_title}" + backport_body="Backport #${pr} to ${target_branch}." + if [ -n "$pr_body" ]; then + backport_body+=$'\n\n'"---"$'\n\n'"$pr_body" + fi + # Determine which labels should be brought over to the new pull request, formatted as the CLI expects. + backport_labels=$(grep -v "^${label_prefix}" <<<"$pr_labels" | head -c -1 | tr '\n' ',') + + # Check for any open backports; note this is a heuristic as we just grab the first pull request + # that matches our generated branch name. This is unlikely to fail as we filter by author, however. + backport_url=$(gh pr list --author '@me' --head "$backport_branch" --json url --jq 'first(.[].url)') + if [ -n "$backport_url" ]; then + # Update the pull request title and body. + # TODO: update labels? + gh pr edit "$backport_url" --title "$backport_title" --body "$backport_body" + found_backport=1 + else + # Create a new pull request from the backport branch, against the target branch. + backport_url=$(gh pr create --base "$target_branch" --head "${remote_owner}:${backport_branch}" \ + --title "$backport_title" --body-file - \ + --label "$backport_labels" \ + <<<"$backport_body" | tail -n 1) + fi + + # Track this successful backport. + backport_urls+=("$backport_url") +done < <(grep "^${label_prefix}" <<<"$pr_labels") + +if [ -n "${comment:-}" ]; then + # Generate a comment on the original PR, recording what backports we opened (or failed to open). + if [ "${#backport_urls[@]}" -gt 0 ]; then + comment_body+="Automated backport PRs opened:"$'\n' + for backport_url in "${backport_urls[@]}"; do + comment_body+="* ${backport_url}"$'\n' + done + comment_body+=$'\n' + fi + + if [ "${#failed_backports[@]}" -gt 0 ]; then + comment_body+="Backports failed on the following branches:" + for failed_backport in "${failed_backports[@]}"; do + comment_body+="* ${failed_backport}"$'\n' + done + comment_body+=$'\n' + + # If we're running in GitHub actions, link to the run log to diagnose why a backport failed. + if [ -n "${GITHUB_ACTIONS:-}" ]; then + comment_body+="Inspect the run at ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" + fi + fi + + if [ -n "$comment_body" ]; then + # If we had any matches for an existing PR, we'll go ahead and assume we already commented. + # Edit the existing comment instead. + gh pr comment "$pr" ${found_backport:+--edit-last} --body-file - <<<"$comment_body" + fi +fi diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 612d8f63135..00000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,25 +0,0 @@ -exemptProjects: true -exemptMilestones: true - -staleLabel: stale - -markComment: > - 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. - -closeComment: > - Closing this issue automatically because it has not had any activity since - it has been marked as stale. If you think it is still relevant and should - be addressed, feel free to open a new one. - -pulls: - 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. - - closeComment: > - Closing this pull request automatically because it has not had any activity since - it has been marked as stale. If you think it is still relevant and should - be addressed, feel free to open a new one. diff --git a/.github/workflows/.tests-matrix.yaml b/.github/workflows/.tests-matrix.yaml new file mode 100644 index 00000000000..661097db8ba --- /dev/null +++ b/.github/workflows/.tests-matrix.yaml @@ -0,0 +1,106 @@ +# Reusable workflow consumed by tests.yaml; used to share a single matrix across jobs. +on: + workflow_call: + inputs: + runner: + required: true + type: string + python-version: + required: true + type: string + run-mypy: + required: true + type: boolean + run-pytest: + required: true + type: boolean + run-pytest-export: + required: true + type: boolean + +defaults: + run: + shell: bash + +jobs: + mypy: + name: mypy + runs-on: ${{ inputs.runner }} + if: inputs.run-mypy + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/bootstrap-poetry + with: + python-version: ${{ inputs.python-version }} + + - run: poetry install --sync + + - run: poetry env info + + - run: poetry show + + - uses: actions/cache@v4 + with: + path: .mypy_cache + key: mypy-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'poetry.lock') }} + restore-keys: | + mypy-${{ runner.os }}-${{ env.pythonLocation }}- + mypy-${{ runner.os }}- + + - run: poetry run mypy + + pytest: + name: pytest + runs-on: ${{ inputs.runner }} + if: inputs.run-pytest + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/bootstrap-poetry + with: + python-version: ${{ inputs.python-version }} + + - run: poetry install --sync --with github-actions + + - run: poetry env info + + - run: poetry show + + - run: poetry run pytest --integration -v + env: + POETRY_TEST_INTEGRATION_GIT_USERNAME: ${{ github.actor }} + POETRY_TEST_INTEGRATION_GIT_PASSWORD: ${{ github.token }} + + - run: git diff --exit-code --stat HEAD + + pytest-export: + name: pytest (poetry-plugin-export) + runs-on: ${{ inputs.runner }} + if: inputs.run-pytest-export + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/bootstrap-poetry + with: + python-version: ${{ inputs.python-version }} + + - run: poetry install --sync --with github-actions + + - run: poetry env info + + - run: poetry show + + - run: poetry run pip list --format json | jq -r '.[] | "\(.name)=\(.version)"' >> $GITHUB_OUTPUT + id: package-versions + + - uses: actions/checkout@v4 + with: + path: poetry-plugin-export + repository: python-poetry/poetry-plugin-export + ref: refs/tags/${{ steps.package-versions.outputs.poetry-plugin-export }} + + - run: poetry run -C .. pytest -v + working-directory: ./poetry-plugin-export + + - run: git -C poetry-plugin-export diff --exit-code --stat HEAD diff --git a/.github/workflows/backport.yaml b/.github/workflows/backport.yaml index 3b96dbbd1f8..aca765d1b91 100644 --- a/.github/workflows/backport.yaml +++ b/.github/workflows/backport.yaml @@ -8,29 +8,33 @@ on: jobs: backport: - name: Backport + name: Create backport runs-on: ubuntu-latest - # Only react to merged PRs for security reasons. + # This workflow only applies to merged PRs; and triggers on a PR being closed, or the backport label being applied. # See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target. if: > github.event.pull_request.merged && ( - github.event.action == 'closed' - || ( - github.event.action == 'labeled' - && contains(github.event.label.name, 'backport') + (github.event.action == 'closed' && contains(github.event.pull_request.labels.*.name, 'backport/')) + || + (github.event.action == 'labeled' && contains(github.event.label.name, 'backport/') ) ) steps: - - name: Generate token - id: generate_token - uses: tibdex/github-app-token@v2 + - uses: actions/checkout@v4 + # This workflow requires a non-GHA token in order to trigger downstream CI, and to access the 'fork' repository. + - uses: actions/create-github-app-token@v1 + id: app-token with: - app_id: ${{ secrets.POETRY_TOKEN_APP_ID }} - private_key: ${{ secrets.POETRY_TOKEN_APP_KEY }} - - name: Generate backport - uses: tibdex/backport@v2 - with: - github_token: ${{ steps.generate_token.outputs.token }} - title_template: "[<%= base %>] <%= title %>" - label_pattern: "^backport/(?([^ ]+))$" + app-id: ${{ secrets.POETRY_TOKEN_APP_ID }} + private-key: ${{ secrets.POETRY_TOKEN_APP_KEY }} + - run: | + git config --global user.name "${{ steps.app-token.outputs.slug }}[bot]" + git config --global user.email "${{ steps.app-token.outputs.slug }}[bot]@users.noreply.github.com" + + gh repo fork --remote-name fork + + ./.github/scripts/backport.sh --pr ${{ github.event.pull_request.number }} --comment --remote fork + name: backport.sh + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yaml similarity index 59% rename from .github/workflows/docs.yml rename to .github/workflows/docs.yaml index 5ab22316e6f..86b8fe6cfeb 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yaml @@ -1,11 +1,11 @@ -name: "Documentation Preview" +name: Documentation Preview on: pull_request: # allow repository maintainers to modify and test workflow paths-ignore: - "**" - - "!.github/workflows/docs.yml" + - "!.github/workflows/docs.yaml" pull_request_target: # enable runs for this workflow when labeled as documentation only # prevent execution when the workflow itself is modified from a fork @@ -16,62 +16,47 @@ on: - "**" - "!docs/**" -permissions: - contents: read - pull-requests: write - jobs: deploy: name: Build & Deploy runs-on: ubuntu-latest - if: | + if: > (github.event_name == 'pull_request_target' && contains(github.event.pull_request.labels.*.name, 'impact/docs')) || (github.event_name != 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) + permissions: + contents: read + pull-requests: write steps: - - name: Checkout Website Source - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: repository: python-poetry/website - - name: Bootstrap poetry - run: pipx install poetry - - - name: Checkout Poetry Source - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: path: poetry ref: ${{ github.event.pull_request.head.sha }} - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - cache: poetry - - - name: Setup Node - uses: actions/setup-node@v4 + - uses: actions/setup-node@v4 with: node-version: "18" - - name: Build Assets - run: npm ci && npm run prod - - - name: Fetch Documentation - run: | - poetry install --no-root --only main - poetry run python bin/website build --local ./poetry - - - name: Install Hugo - uses: peaceiris/actions-hugo@v2 + - uses: peaceiris/actions-hugo@v2 with: hugo-version: '0.83.1' - - name: Build - run: hugo -v --minify + - uses: ./.github/actions/bootstrap-poetry + + - run: poetry install --sync --no-root --only main + + - run: | + # Rebuild the docs files from the PR checkout. + poetry run python bin/website build --local ./poetry + # Build website assets (CSS/JS). + npm ci && npm run prod + # Build the static website. + hugo -v --minify - - name: Deploy - uses: amondnet/vercel-action@v25 - id: vercel-action + - uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lock-threads.yml b/.github/workflows/lock-threads.yaml similarity index 63% rename from .github/workflows/lock-threads.yml rename to .github/workflows/lock-threads.yaml index 05d23ff0396..e315d67ada4 100644 --- a/.github/workflows/lock-threads.yml +++ b/.github/workflows/lock-threads.yaml @@ -1,33 +1,39 @@ -name: 'Lock Threads' +name: Lock Threads on: schedule: - # at the end of everyday - - cron: '0 0 * * *' + - cron: '0 0 * * *' # every day at midnight workflow_dispatch: -permissions: - issues: write - pull-requests: write - discussions: write - concurrency: - group: lock-threads + group: ${{ github.workflow }} jobs: - action: + lock-issues: runs-on: ubuntu-latest + permissions: + issues: write steps: - uses: dessant/lock-threads@v5 with: + process-only: issues issue-inactive-days: 30 issue-comment: > This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs. + + lock-prs: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: dessant/lock-threads@v5 + with: + process-only: prs pr-inactive-days: 30 pr-comment: > This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs. - process-only: 'issues, prs' diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 0945a0eb470..00000000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: Tests - -on: - push: - paths-ignore: - - 'docs/**' - - '.cirrus.yml' - - '.github/workflows/docs.yml' - branches: - - main - pull_request: - paths-ignore: - - 'docs/**' - - '.cirrus.yml' - - '.github/workflows/docs.yml' - branches: - - '**' - -concurrency: - group: tests-${{ github.head_ref || github.ref }} - cancel-in-progress: ${{ github.event_name == 'pull_request' }} - -jobs: - tests: - name: ${{ matrix.os }} / ${{ matrix.python-version }} - runs-on: ${{ matrix.image }} - strategy: - matrix: - os: [Ubuntu, macOS, Windows] - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] - include: - - os: Ubuntu - image: ubuntu-22.04 - - os: Windows - image: windows-2022 - - os: macOS - image: macos-12 - fail-fast: false - defaults: - run: - shell: bash - steps: - - uses: actions/checkout@v4 - - - name: Bootstrap poetry - run: pipx install poetry - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - cache: poetry - - - name: Enable long paths for git on Windows - if: ${{ matrix.os == 'Windows' }} - # Enable handling long path names (+260 char) on the Windows platform - # https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation - run: git config --system core.longpaths true - - - name: Configure poetry - run: | - poetry config virtualenvs.in-project true - poetry config virtualenvs.options.no-pip true - poetry config virtualenvs.options.no-setuptools true - - - name: Check lock file - run: poetry check --lock - - - name: Install dependencies - run: poetry install --with github-actions - - - name: Run mypy - run: poetry run mypy - - - name: Run pytest - env: - POETRY_TEST_INTEGRATION_GIT_USERNAME: ${GITHUB_ACTOR} - POETRY_TEST_INTEGRATION_GIT_PASSWORD: ${{ secrets.GITHUB_TOKEN }} - run: poetry run pytest --integration -v - - - name: Get Plugin Version (poetry-plugin-export) - id: poetry-plugin-export-version - run: | - echo version=$(poetry show poetry-plugin-export | grep version | cut -d : -f 2 | xargs) >> $GITHUB_OUTPUT - - - name: Checkout Plugin Source (poetry-plugin-export) - uses: actions/checkout@v4 - with: - path: poetry-plugin-export - repository: python-poetry/poetry-plugin-export - ref: refs/tags/${{ steps.poetry-plugin-export-version.outputs.version }} - - - name: Run pytest (poetry-plugin-export) - working-directory: ./poetry-plugin-export - run: poetry run -C .. pytest -v - - - name: Check for clean working tree - run: | - git diff --exit-code --stat HEAD - git -C poetry-plugin-export diff --exit-code --stat HEAD diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 00000000000..49c8d951b84 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,49 @@ +name: Release + +on: + release: + types: [published] + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - run: pipx run build + + - uses: actions/upload-artifact@v4 + with: + name: distfiles + path: dist/ + if-no-files-found: error + + upload-github: + name: Upload (GitHub) + runs-on: ubuntu-latest + permissions: + contents: write + needs: build + steps: + - uses: actions/download-artifact@v4 + with: + name: distfiles + + - run: gh release upload ${{ github.event.release.tag_name }} dist/*.{tar.gz,whl} + + upload-pypi: + name: Upload (PyPI) + runs-on: ubuntu-latest + environment: pypi + permissions: + id-token: write + needs: build + steps: + - uses: actions/download-artifact@v4 + with: + name: distfiles + + - uses: pypa/gh-action-pypi-publish@release/v1 + with: + print-hash: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 359cfb9f28d..00000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Release - -on: - push: - tags: - - '*.*.*' - -jobs: - release: - name: Release - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install Poetry - run: pipx install poetry - - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - cache: poetry - - - name: Build project for distribution - run: poetry build - - - name: Check Version - id: check-version - run: | - [[ "$(poetry version --short)" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || echo prerelease=true >> $GITHUB_OUTPUT - - - name: Create Release - uses: ncipollo/release-action@v1 - with: - artifacts: "dist/*" - token: ${{ secrets.GITHUB_TOKEN }} - draft: false - prerelease: steps.check-version.outputs.prerelease == 'true' - - - name: Publish to PyPI - env: - POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_TOKEN }} - run: poetry publish diff --git a/.github/workflows/skip.yml b/.github/workflows/skip.yml deleted file mode 100644 index 325e5a7bf5a..00000000000 --- a/.github/workflows/skip.yml +++ /dev/null @@ -1,32 +0,0 @@ -# workaround for https://github.com/actions/virtual-environments/issues/1281 -name: Skip All Jobs - -on: - push: - paths-ignore: - - '**' - - '!docs/**' - - '!.cirrus.yml' - - '!.github/workflows/docs.yml' - branches: - - main - pull_request: - paths-ignore: - - '**' - - '!docs/**' - - '!.cirrus.yml' - - '!.github/workflows/docs.yml' - branches: - - '**' - -jobs: - tests: - name: ${{ matrix.os }} / ${{ matrix.python-version }} - # we do not need os specific runners here, using linux is quicker - runs-on: ubuntu-latest - strategy: - matrix: - os: [Ubuntu, macOS, Windows] - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] - steps: - - run: exit 0 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 00000000000..128290183d9 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,116 @@ +name: Tests + +on: + push: + pull_request: + merge_group: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +defaults: + run: + shell: bash + +jobs: + changes: + name: Detect changed files + runs-on: ubuntu-latest + outputs: + project: ${{ steps.changes.outputs.project }} + fixtures-pypi: ${{ steps.changes.outputs.fixtures-pypi }} + mypy: ${{ steps.changes.outputs.mypy }} + pytest: ${{ steps.changes.outputs.pytest }} + pytest-export: ${{ steps.changes.outputs.pytest-export }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + workflow: &workflow + - '.github/workflows/tests.yaml' + - '.github/workflows/.tests-matrix.yaml' + project: &project + - *workflow + - 'poetry.lock' + - 'pyproject.toml' + fixtures-pypi: + - *workflow + - 'tests/repositories/fixtures/pypi.org/**' + mypy: + - *project + - 'src/**.py' + pytest: + - *project + - 'src/**.py' + - 'tests/**' + pytest-export: + - *project + - 'src/**.py' + + lockfile: + name: Check poetry.lock + runs-on: ubuntu-latest + if: needs.changes.outputs.project == 'true' + needs: changes + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/bootstrap-poetry + + - run: poetry check --lock + + fixtures-pypi: + name: Check fixtures (PyPI) + runs-on: ubuntu-latest + if: needs.changes.outputs.fixtures-pypi == 'true' + needs: changes + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/bootstrap-poetry + + - run: poetry install --sync --only main,test + + - run: poetry run env PYTHONPATH="$GITHUB_WORKSPACE" python tests/repositories/fixtures/pypi.org/generate.py + + - run: git diff --exit-code --stat HEAD tests/repositories/fixtures/pypi.org + + tests-matrix: + name: ${{ matrix.os.name }} (Python ${{ matrix.python-version }}) + needs: + - lockfile + - changes + strategy: + matrix: + os: + - name: Ubuntu + image: ubuntu-22.04 + - name: macOS + image: macos-13 + - name: Windows + image: windows-2022 + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + fail-fast: false + # Use this matrix with multiple jobs defined in a reusable workflow: + uses: ./.github/workflows/.tests-matrix.yaml + with: + runner: ${{ matrix.os.image }} + python-version: ${{ matrix.python-version }} + run-mypy: ${{ needs.changes.outputs.mypy == 'true' }} + run-pytest: ${{ needs.changes.outputs.pytest == 'true' }} + run-pytest-export: ${{ needs.changes.outputs.pytest-export == 'true' }} + secrets: inherit + + status: + name: Status + runs-on: ubuntu-latest + if: always() + needs: + - lockfile + - fixtures-pypi + - tests-matrix + steps: + - run: ${{ (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) && 'false' || 'true' }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 09727f4c637..44b72ff4c0c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,8 +6,9 @@ repos: rev: v4.5.0 hooks: - id: trailing-whitespace + exclude: tests/repositories/fixtures/pypi.org/metadata/.*\.metadata - id: end-of-file-fixer - exclude: ^.*\.egg-info/ + exclude: ^.*\.egg-info/|tests/repositories/fixtures/pypi.org/metadata/.*\.metadata - id: check-merge-conflict - id: check-case-conflict - id: check-json @@ -26,7 +27,7 @@ repos: - id: validate_manifest - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.2 + rev: v0.3.3 hooks: - id: ruff - id: ruff-format diff --git a/docs/faq.md b/docs/faq.md index 45e7fa2bd30..57843f71ffa 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -171,8 +171,8 @@ dependencies specified in `poetry.lock` into [Nox](https://nox.thea.codes/en/sta ### I don't want Poetry to manage my virtual environments. Can I disable it? While Poetry automatically creates virtual environments to always work isolated -from the global Python installation, there are valid reasons why it's not necessary -and is an overhead, like when working with containers. +from the global Python installation, there are rare scenarios where the use a Poetry managed +virtual environment is not possible or preferred. In this case, you can disable this feature by setting the `virtualenvs.create` setting to `false`: @@ -180,6 +180,13 @@ In this case, you can disable this feature by setting the `virtualenvs.create` s poetry config virtualenvs.create false ``` +{{% warning %}} +The recommended best practice, including when installing an application within a container, is to make +use of a virtual environment. This can also be managed by another tool. + +The Poetry team strongly encourages the use of a virtual environment. +{{% /warning %}} + ### Why is Poetry telling me that the current project's supported Python range is not compatible with one or more packages' Python requirements? Unlike `pip`, Poetry doesn't resolve for just the Python in the current environment. Instead it makes sure that a dependency diff --git a/pyproject.toml b/pyproject.toml index 1d3d70c1a65..07265de94eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,9 +105,6 @@ src = ["src"] target-version = "py38" [tool.ruff.lint] -unfixable = [ - "ERA", # do not autoremove commented out code -] extend-select = [ "B", # flake8-bugbear "C4", # flake8-comprehensions @@ -118,6 +115,7 @@ extend-select = [ "PGH", # pygrep "RUF", # ruff checks "SIM", # flake8-simplify + "T20", # flake8-print "TCH", # flake8-type-checking "TID", # flake8-tidy-imports "UP", # pyupgrade @@ -127,6 +125,12 @@ ignore = [ "B905", # use explicit 'strict=' parameter with 'zip()' "N818", # Exception name should be named with an Error suffix ] +extend-safe-fixes = [ + "TCH", # move import from and to TYPE_CHECKING blocks +] +unfixable = [ + "ERA", # do not autoremove commented out code +] [tool.ruff.lint.flake8-tidy-imports] ban-relative-imports = "all" @@ -185,7 +189,7 @@ ignore_missing_imports = true [tool.pytest.ini_options] -addopts = "-n auto" +addopts = "-n logical" testpaths = ["tests"] markers = [ "network: mark tests that require internet access", diff --git a/src/poetry/console/commands/about.py b/src/poetry/console/commands/about.py index cf2548d6f59..56d8e7acdf0 100644 --- a/src/poetry/console/commands/about.py +++ b/src/poetry/console/commands/about.py @@ -1,14 +1,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING - from poetry.console.commands.command import Command -if TYPE_CHECKING: - from collections.abc import Callable - - class AboutCommand(Command): name = "about" @@ -17,16 +11,12 @@ class AboutCommand(Command): def handle(self) -> int: from poetry.utils._compat import metadata - # The metadata.version that we import for Python 3.7 is untyped, work around - # that. - version: Callable[[str], str] = metadata.version - self.line( f"""\ Poetry - Package Management for Python -Version: {version('poetry')} -Poetry-Core Version: {version('poetry-core')} +Version: {metadata.version('poetry')} +Poetry-Core Version: {metadata.version('poetry-core')} Poetry is a dependency manager tracking local dependencies of your projects\ and libraries. diff --git a/src/poetry/console/commands/add.py b/src/poetry/console/commands/add.py index 67300f5557a..852798f99ce 100644 --- a/src/poetry/console/commands/add.py +++ b/src/poetry/console/commands/add.py @@ -23,7 +23,7 @@ class AddCommand(InstallerCommand, InitCommand): name = "add" - description = "Adds a new dependency to pyproject.toml." + description = "Adds a new dependency to pyproject.toml and installs it." arguments: ClassVar[list[Argument]] = [ argument("name", "The packages to add.", multiple=True) diff --git a/src/poetry/inspection/info.py b/src/poetry/inspection/info.py index 32575c4bd99..457fc97555f 100644 --- a/src/poetry/inspection/info.py +++ b/src/poetry/inspection/info.py @@ -4,6 +4,7 @@ import functools import glob import logging +import tempfile from pathlib import Path from typing import TYPE_CHECKING @@ -13,6 +14,8 @@ import pkginfo +from build import BuildBackendException +from poetry.core.constraints.version import Version from poetry.core.factory import Factory from poetry.core.packages.dependency import Dependency from poetry.core.packages.package import Package @@ -22,10 +25,8 @@ from poetry.core.version.markers import InvalidMarker from poetry.core.version.requirements import InvalidRequirement -from poetry.utils.env import EnvCommandError -from poetry.utils.env import ephemeral_environment from poetry.utils.helpers import extractall -from poetry.utils.setup_reader import SetupReader +from poetry.utils.isolated_build import isolated_builder if TYPE_CHECKING: @@ -38,24 +39,7 @@ logger = logging.getLogger(__name__) -PEP517_META_BUILD = """\ -import build -import build.env -import pyproject_hooks - -source = '{source}' -dest = '{dest}' - -with build.env.DefaultIsolatedEnv() as env: - builder = build.ProjectBuilder.from_isolated_env( - env, source, runner=pyproject_hooks.quiet_subprocess_runner - ) - env.install(builder.build_system_requires) - env.install(builder.get_requires_for_build('wheel')) - builder.metadata_path(dest) -""" - -PEP517_META_BUILD_DEPS = ["build==1.1.1", "pyproject_hooks==1.0.0"] +DYNAMIC_METADATA_VERSION = Version.parse("2.2") class PackageInfoError(ValueError): @@ -234,6 +218,43 @@ def to_package( return package + @classmethod + def _requirements_from_distribution( + cls, + dist: pkginfo.BDist | pkginfo.SDist | pkginfo.Wheel, + ) -> list[str] | None: + """ + Helper method to extract package requirements from a `pkginfo.Distribution` + instance. + + :param dist: The distribution instance to extract requirements from. + """ + # If the distribution lists requirements, we use those. + # + # If the distribution does not list requirements, but the metadata is new enough + # to specify that this is because there definitely are none: then we return an + # empty list. + # + # If there is a requires.txt, we use that. + if dist.requires_dist: + return list(dist.requires_dist) + + if dist.metadata_version is not None: + metadata_version = Version.parse(dist.metadata_version) + if ( + metadata_version >= DYNAMIC_METADATA_VERSION + and "Requires-Dist" not in dist.dynamic + ): + return [] + + requires = Path(dist.filename) / "requires.txt" + if requires.exists(): + text = requires.read_text(encoding="utf-8") + requirements = parse_requires(text) + return requirements + + return None + @classmethod def _from_distribution( cls, dist: pkginfo.BDist | pkginfo.SDist | pkginfo.Wheel @@ -244,15 +265,12 @@ def _from_distribution( :param dist: The distribution instance to parse information from. """ - requirements = None + if dist.metadata_version not in pkginfo.distribution.HEADER_ATTRS: + # This check can be replaced once upstream implements strict parsing + # https://bugs.launchpad.net/pkginfo/+bug/2058697 + raise ValueError(f"Unknown metadata version: {dist.metadata_version}") - if dist.requires_dist: - requirements = list(dist.requires_dist) - else: - requires = Path(dist.filename) / "requires.txt" - if requires.exists(): - text = requires.read_text(encoding="utf-8") - requirements = parse_requires(text) + requirements = cls._requirements_from_distribution(dist) info = cls( name=dist.name, @@ -322,58 +340,6 @@ def _from_sdist_file(cls, path: Path) -> PackageInfo: return info.update(new_info) - @staticmethod - def has_setup_files(path: Path) -> bool: - return any((path / f).exists() for f in SetupReader.FILES) - - @classmethod - def from_setup_files(cls, path: Path) -> PackageInfo: - """ - Mechanism to parse package information from a `setup.[py|cfg]` file. This uses - the implementation at `poetry.utils.setup_reader.SetupReader` in order to parse - the file. This is not reliable for complex setup files and should only attempted - as a fallback. - - :param path: Path to `setup.py` file - """ - if not cls.has_setup_files(path): - raise PackageInfoError( - path, "No setup files (setup.py, setup.cfg) was found." - ) - - try: - result = SetupReader.read_from_directory(path) - except Exception as e: - raise PackageInfoError(path, e) - - python_requires = result["python_requires"] - if python_requires is None: - python_requires = "*" - - requires = "".join(dep + "\n" for dep in result["install_requires"]) - if result["extras_require"]: - requires += "\n" - - for extra_name, deps in result["extras_require"].items(): - requires += f"[{extra_name}]\n" - - for dep in deps: - requires += dep + "\n" - - requires += "\n" - - requirements = parse_requires(requires) - - info = cls( - name=result.get("name"), - version=result.get("version"), - summary=result.get("description", ""), - requires_dist=requirements, - requires_python=python_requires, - ) - - return info - @staticmethod def _find_dist_info(path: Path) -> Iterator[Path]: """ @@ -472,16 +438,13 @@ def _get_poetry_package(path: Path) -> ProjectPackage | None: return None @classmethod - def from_directory(cls, path: Path, disable_build: bool = False) -> PackageInfo: + def from_directory(cls, path: Path) -> PackageInfo: """ - Generate package information from a package source directory. If `disable_build` - is not `True` and introspection of all available metadata fails, the package is - attempted to be built in an isolated environment so as to generate required - metadata. + Generate package information from a package source directory. If introspection + of all available metadata fails, the package is attempted to be built in an + isolated environment so as to generate required metadata. :param path: Path to generate package information from. - :param disable_build: If not `True` and setup reader fails, PEP 517 isolated - build is attempted in order to gather metadata. """ project_package = cls._get_poetry_package(path) info: PackageInfo | None @@ -492,10 +455,7 @@ def from_directory(cls, path: Path, disable_build: bool = False) -> PackageInfo: if not info or info.requires_dist is None: try: - if disable_build: - info = cls.from_setup_files(path) - else: - info = get_pep517_metadata(path) + info = get_pep517_metadata(path) except PackageInfoError: if not info: raise @@ -531,8 +491,8 @@ def from_wheel(cls, path: Path) -> PackageInfo: try: wheel = pkginfo.Wheel(str(path)) return cls._from_distribution(wheel) - except ValueError: - return PackageInfo() + except ValueError as e: + raise PackageInfoError(path, e) @classmethod def from_bdist(cls, path: Path) -> PackageInfo: @@ -572,33 +532,15 @@ def get_pep517_metadata(path: Path) -> PackageInfo: """ info = None - with contextlib.suppress(PackageInfoError): - info = PackageInfo.from_setup_files(path) - if all(x is not None for x in (info.version, info.name, info.requires_dist)): - return info + with tempfile.TemporaryDirectory() as dist: + try: + dest = Path(dist) - with ephemeral_environment( - flags={"no-pip": False, "no-setuptools": True, "no-wheel": True} - ) as venv: - # TODO: cache PEP 517 build environment corresponding to each project venv - dest_dir = venv.path.parent / "dist" - dest_dir.mkdir() + with isolated_builder(path, "wheel") as builder: + builder.metadata_path(dest) - pep517_meta_build_script = PEP517_META_BUILD.format( - source=path.as_posix(), dest=dest_dir.as_posix() - ) - - try: - venv.run_pip( - "install", - "--disable-pip-version-check", - "--ignore-installed", - "--no-input", - *PEP517_META_BUILD_DEPS, - ) - venv.run_python_script(pep517_meta_build_script) - info = PackageInfo.from_metadata_directory(dest_dir) - except EnvCommandError as e: + info = PackageInfo.from_metadata_directory(dest) + except BuildBackendException as e: logger.debug("PEP517 build failed: %s", e) raise PackageInfoError(path, e, "PEP517 build failed") diff --git a/src/poetry/installation/chef.py b/src/poetry/installation/chef.py index 5f847f64e13..79225c085a0 100644 --- a/src/poetry/installation/chef.py +++ b/src/poetry/installation/chef.py @@ -1,27 +1,20 @@ from __future__ import annotations -import os import tempfile -from contextlib import redirect_stdout -from io import StringIO from pathlib import Path from typing import TYPE_CHECKING from build import BuildBackendException -from build import ProjectBuilder -from build.env import IsolatedEnv as BaseIsolatedEnv from poetry.core.utils.helpers import temporary_directory -from pyproject_hooks import quiet_subprocess_runner # type: ignore[import-untyped] from poetry.utils._compat import decode -from poetry.utils.env import ephemeral_environment from poetry.utils.helpers import extractall +from poetry.utils.isolated_build import IsolatedBuildError +from poetry.utils.isolated_build import isolated_builder if TYPE_CHECKING: - from collections.abc import Collection - from poetry.repositories import RepositoryPool from poetry.utils.cache import ArtifactCache from poetry.utils.env import Env @@ -30,78 +23,6 @@ class ChefError(Exception): ... -class ChefBuildError(ChefError): ... - - -class ChefInstallError(ChefError): - def __init__(self, requirements: Collection[str], output: str, error: str) -> None: - message = "\n\n".join( - ( - f"Failed to install {', '.join(requirements)}.", - f"Output:\n{output}", - f"Error:\n{error}", - ) - ) - super().__init__(message) - self._requirements = requirements - - @property - def requirements(self) -> Collection[str]: - return self._requirements - - -class IsolatedEnv(BaseIsolatedEnv): - def __init__(self, env: Env, pool: RepositoryPool) -> None: - self._env = env - self._pool = pool - - @property - def python_executable(self) -> str: - return str(self._env.python) - - def make_extra_environ(self) -> dict[str, str]: - path = os.environ.get("PATH") - scripts_dir = str(self._env._bin_dir) - return { - "PATH": ( - os.pathsep.join([scripts_dir, path]) - if path is not None - else scripts_dir - ) - } - - def install(self, requirements: Collection[str]) -> None: - from cleo.io.buffered_io import BufferedIO - from poetry.core.packages.dependency import Dependency - from poetry.core.packages.project_package import ProjectPackage - - from poetry.config.config import Config - from poetry.installation.installer import Installer - from poetry.packages.locker import Locker - from poetry.repositories.installed_repository import InstalledRepository - - # We build Poetry dependencies from the requirements - package = ProjectPackage("__root__", "0.0.0") - package.python_versions = ".".join(str(v) for v in self._env.version_info[:3]) - for requirement in requirements: - dependency = Dependency.create_from_pep_508(requirement) - package.add_dependency(dependency) - - io = BufferedIO() - installer = Installer( - io, - self._env, - package, - Locker(self._env.path.joinpath("poetry.lock"), {}), - self._pool, - Config.create(), - InstalledRepository.load(self._env), - ) - installer.update(True) - if installer.run() != 0: - raise ChefInstallError(requirements, io.fetch_output(), io.fetch_error()) - - class Chef: def __init__( self, artifact_cache: ArtifactCache, env: Env, pool: RepositoryPool @@ -127,46 +48,36 @@ def _prepare( ) -> Path: from subprocess import CalledProcessError - with ephemeral_environment( - self._env.python, - flags={"no-pip": True, "no-setuptools": True, "no-wheel": True}, - ) as venv: - env = IsolatedEnv(venv, self._pool) - builder = ProjectBuilder.from_isolated_env( - env, directory, runner=quiet_subprocess_runner - ) - env.install(builder.build_system_requires) - - stdout = StringIO() - error: Exception | None = None - try: - with redirect_stdout(stdout): - dist_format = "wheel" if not editable else "editable" - env.install( - builder.build_system_requires - | builder.get_requires_for_build(dist_format) - ) - path = Path( - builder.build( - dist_format, - destination.as_posix(), - ) + distribution = "wheel" if not editable else "editable" + error: Exception | None = None + + try: + with isolated_builder( + source=directory, + distribution=distribution, + python_executable=self._env.python, + pool=self._pool, + ) as builder: + return Path( + builder.build( + distribution, + destination.as_posix(), ) - except BuildBackendException as e: - message_parts = [str(e)] - if isinstance(e.exception, CalledProcessError): - text = e.exception.stderr or e.exception.stdout - if text is not None: - message_parts.append(decode(text)) - else: - message_parts.append(str(e.exception)) + ) + except BuildBackendException as e: + message_parts = [str(e)] - error = ChefBuildError("\n\n".join(message_parts)) + if isinstance(e.exception, CalledProcessError): + text = e.exception.stderr or e.exception.stdout + if text is not None: + message_parts.append(decode(text)) + else: + message_parts.append(str(e.exception)) - if error is not None: - raise error from None + error = IsolatedBuildError("\n\n".join(message_parts)) - return path + if error is not None: + raise error from None def _prepare_sdist(self, archive: Path, destination: Path | None = None) -> Path: from poetry.core.packages.utils.link import Link diff --git a/src/poetry/installation/executor.py b/src/poetry/installation/executor.py index 84af089e445..b9fb149c4ed 100644 --- a/src/poetry/installation/executor.py +++ b/src/poetry/installation/executor.py @@ -18,8 +18,6 @@ from poetry.core.packages.utils.link import Link from poetry.installation.chef import Chef -from poetry.installation.chef import ChefBuildError -from poetry.installation.chef import ChefInstallError from poetry.installation.chooser import Chooser from poetry.installation.operations import Install from poetry.installation.operations import Uninstall @@ -34,6 +32,8 @@ from poetry.utils.helpers import get_highest_priority_hash_type from poetry.utils.helpers import pluralize from poetry.utils.helpers import remove_directory +from poetry.utils.isolated_build import IsolatedBuildError +from poetry.utils.isolated_build import IsolatedBuildInstallError from poetry.utils.pip import pip_install @@ -310,7 +310,7 @@ def _execute_operation(self, operation: Operation) -> None: trace = ExceptionTrace(e) trace.render(io) pkg = operation.package - if isinstance(e, ChefBuildError): + if isinstance(e, IsolatedBuildError): pip_command = "pip wheel --no-cache-dir --use-pep517" if pkg.develop: requirement = pkg.source_url @@ -328,7 +328,7 @@ def _execute_operation(self, operation: Operation) -> None: f" running '{pip_command} \"{requirement}\"'." "" ) - elif isinstance(e, ChefInstallError): + elif isinstance(e, IsolatedBuildInstallError): message = ( "" "Cannot install build-system.requires" diff --git a/src/poetry/packages/direct_origin.py b/src/poetry/packages/direct_origin.py index 9451e381205..78bae1ee764 100644 --- a/src/poetry/packages/direct_origin.py +++ b/src/poetry/packages/direct_origin.py @@ -9,6 +9,7 @@ from poetry.inspection.info import PackageInfo from poetry.inspection.info import PackageInfoError +from poetry.utils.authenticator import get_default_authenticator from poetry.utils.helpers import download_file from poetry.utils.helpers import get_file_hash from poetry.vcs.git import Git @@ -56,6 +57,7 @@ def _get_package_from_git( class DirectOrigin: def __init__(self, artifact_cache: ArtifactCache) -> None: self._artifact_cache = artifact_cache + self._authenticator = get_default_authenticator() @classmethod def get_package_from_file(cls, file_path: Path) -> Package: @@ -74,10 +76,13 @@ def get_package_from_file(cls, file_path: Path) -> Package: def get_package_from_directory(cls, directory: Path) -> Package: return PackageInfo.from_directory(path=directory).to_package(root_dir=directory) + def _download_file(self, url: str, dest: Path) -> None: + download_file(url, dest, session=self._authenticator) + def get_package_from_url(self, url: str) -> Package: link = Link(url) artifact = self._artifact_cache.get_cached_archive_for_link( - link, strict=True, download_func=download_file + link, strict=True, download_func=self._download_file ) package = self.get_package_from_file(artifact) diff --git a/src/poetry/repositories/http_repository.py b/src/poetry/repositories/http_repository.py index 515907e72e5..54c7f0da1e9 100644 --- a/src/poetry/repositories/http_repository.py +++ b/src/poetry/repositories/http_repository.py @@ -4,6 +4,7 @@ import hashlib from contextlib import contextmanager +from contextlib import suppress from pathlib import Path from typing import TYPE_CHECKING from typing import Any @@ -165,7 +166,7 @@ def _get_info_from_metadata(self, link: Link) -> PackageInfo | None: response = self.session.get(link.metadata_url) if link.metadata_hashes and ( hash_name := get_highest_priority_hash_type( - set(link.metadata_hashes.keys()), f"{link.filename}.metadata" + link.metadata_hashes, f"{link.filename}.metadata" ) ): metadata_hash = getattr(hashlib, hash_name)( @@ -350,9 +351,7 @@ def _links_to_data(self, links: list[Link], data: PackageInfo) -> dict[str, Any] file_hash = self.calculate_sha256(link) if file_hash is None and ( - hash_type := get_highest_priority_hash_type( - set(link.hashes.keys()), link.filename - ) + hash_type := get_highest_priority_hash_type(link.hashes, link.filename) ): file_hash = f"{hash_type}:{link.hashes[hash_type]}" @@ -371,10 +370,12 @@ def _links_to_data(self, links: list[Link], data: PackageInfo) -> dict[str, Any] def calculate_sha256(self, link: Link) -> str | None: with self._cached_or_downloaded_file(link) as filepath: - hash_name = get_highest_priority_hash_type( - set(link.hashes.keys()), link.filename - ) - known_hash = getattr(hashlib, hash_name)() if hash_name else None + hash_name = get_highest_priority_hash_type(link.hashes, link.filename) + known_hash = None + with suppress(ValueError, AttributeError): + # Handle ValueError here as well since under FIPS environments + # this is what is raised (e.g., for MD5) + known_hash = getattr(hashlib, hash_name)() if hash_name else None required_hash = hashlib.sha256() chunksize = 4096 diff --git a/src/poetry/repositories/legacy_repository.py b/src/poetry/repositories/legacy_repository.py index a6edf66729c..8b1bcea8236 100644 --- a/src/poetry/repositories/legacy_repository.py +++ b/src/poetry/repositories/legacy_repository.py @@ -12,7 +12,7 @@ from poetry.inspection.info import PackageInfo from poetry.repositories.exceptions import PackageNotFound from poetry.repositories.http_repository import HTTPRepository -from poetry.repositories.link_sources.html import SimpleRepositoryPage +from poetry.repositories.link_sources.html import HTMLPage from poetry.repositories.link_sources.html import SimpleRepositoryRootPage @@ -125,10 +125,10 @@ def _get_release_info( ), ) - def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage: + def _get_page(self, name: NormalizedName) -> HTMLPage: if not (response := self._get_response(f"/{name}/")): raise PackageNotFound(f"Package [{name}] not found.") - return SimpleRepositoryPage(response.url, response.text) + return HTMLPage(response.url, response.text) @cached_property def root_page(self) -> SimpleRepositoryRootPage: diff --git a/src/poetry/repositories/link_sources/html.py b/src/poetry/repositories/link_sources/html.py index 3128b15fa1b..6b849e4e4cb 100644 --- a/src/poetry/repositories/link_sources/html.py +++ b/src/poetry/repositories/link_sources/html.py @@ -100,10 +100,3 @@ def package_names(self) -> list[str]: results.append(href.rstrip("/")) return results - - -class SimpleRepositoryPage(HTMLPage): - def __init__(self, url: str, content: str) -> None: - if not url.endswith("/"): - url += "/" - super().__init__(url=url, content=content) diff --git a/src/poetry/repositories/single_page_repository.py b/src/poetry/repositories/single_page_repository.py index 7bdc469bbf0..446957f12db 100644 --- a/src/poetry/repositories/single_page_repository.py +++ b/src/poetry/repositories/single_page_repository.py @@ -4,7 +4,7 @@ from poetry.repositories.exceptions import PackageNotFound from poetry.repositories.legacy_repository import LegacyRepository -from poetry.repositories.link_sources.html import SimpleRepositoryPage +from poetry.repositories.link_sources.html import HTMLPage if TYPE_CHECKING: @@ -12,11 +12,11 @@ class SinglePageRepository(LegacyRepository): - def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage: + def _get_page(self, name: NormalizedName) -> HTMLPage: """ Single page repositories only have one page irrespective of endpoint. """ response = self._get_response("") if not response: raise PackageNotFound(f"Package [{name}] not found.") - return SimpleRepositoryPage(response.url, response.text) + return HTMLPage(response.url, response.text) diff --git a/src/poetry/utils/cache.py b/src/poetry/utils/cache.py index 913fdb51beb..1f0f18ed5e5 100644 --- a/src/poetry/utils/cache.py +++ b/src/poetry/utils/cache.py @@ -198,9 +198,7 @@ def __init__(self, *, cache_dir: Path) -> None: def get_cache_directory_for_link(self, link: Link) -> Path: key_parts = {"url": link.url_without_fragment} - if hash_name := get_highest_priority_hash_type( - set(link.hashes.keys()), link.filename - ): + if hash_name := get_highest_priority_hash_type(link.hashes, link.filename): key_parts[hash_name] = link.hashes[hash_name] if link.subdirectory_fragment: diff --git a/src/poetry/utils/env/__init__.py b/src/poetry/utils/env/__init__.py index e99abda922f..b460a545595 100644 --- a/src/poetry/utils/env/__init__.py +++ b/src/poetry/utils/env/__init__.py @@ -35,7 +35,8 @@ from collections.abc import Iterator from cleo.io.io import IO - from poetry.core.poetry import Poetry as CorePoetry + + from poetry.poetry import Poetry @contextmanager @@ -56,7 +57,7 @@ def ephemeral_environment( @contextmanager def build_environment( - poetry: CorePoetry, env: Env | None = None, io: IO | None = None + poetry: Poetry, env: Env | None = None, io: IO | None = None ) -> Iterator[Env]: """ If a build script is specified for the project, there could be additional build @@ -66,7 +67,10 @@ def build_environment( environment is returned. """ if not env or poetry.package.build_script: - with ephemeral_environment(executable=env.python if env else None) as venv: + with ephemeral_environment( + executable=env.python if env else None, + flags={"no-pip": True, "no-setuptools": True, "no-wheel": True}, + ) as venv: if io: requires = [ f"{requirement}" @@ -78,16 +82,10 @@ def build_environment( f" {', '.join(requires)}" ) - output = venv.run_pip( - "install", - "--disable-pip-version-check", - "--ignore-installed", - "--no-input", - *poetry.pyproject.build_system.requires, - ) + from poetry.utils.isolated_build import IsolatedEnv - if io and io.is_debug() and output: - io.write_error(output) + isolated_env = IsolatedEnv(venv, poetry.pool) + isolated_env.install(poetry.pyproject.build_system.requires) yield venv else: diff --git a/src/poetry/utils/env/script_strings.py b/src/poetry/utils/env/script_strings.py index 246649867f3..3e663e3e0c6 100644 --- a/src/poetry/utils/env/script_strings.py +++ b/src/poetry/utils/env/script_strings.py @@ -82,7 +82,7 @@ def _version_nodot(version): "platform_release": platform.release(), "platform_system": platform.system(), "platform_version": platform.version(), - "python_full_version": platform.python_version(), + "python_full_version": platform.python_version().rstrip("+"), "platform_python_implementation": platform.python_implementation(), "python_version": ".".join(platform.python_version_tuple()[:2]), "sys_platform": sys.platform, diff --git a/src/poetry/utils/env/site_packages.py b/src/poetry/utils/env/site_packages.py index a637f5ad1b8..dca35777a46 100644 --- a/src/poetry/utils/env/site_packages.py +++ b/src/poetry/utils/env/site_packages.py @@ -112,19 +112,6 @@ def find_distribution( return distribution return None - def find_distribution_files_with_suffix( - self, distribution_name: str, suffix: str, writable_only: bool = False - ) -> Iterable[Path]: - for distribution in self.distributions( - name=distribution_name, writable_only=writable_only - ): - files = [] if distribution.files is None else distribution.files - for file in files: - if file.name.endswith(suffix): - path = distribution.locate_file(file) - assert isinstance(path, Path) - yield path - def find_distribution_files_with_name( self, distribution_name: str, name: str, writable_only: bool = False ) -> Iterable[Path]: diff --git a/src/poetry/utils/env/system_env.py b/src/poetry/utils/env/system_env.py index 8ddef7b5608..81396206ff3 100644 --- a/src/poetry/utils/env/system_env.py +++ b/src/poetry/utils/env/system_env.py @@ -71,7 +71,8 @@ def get_marker_env(self) -> dict[str, Any]: "platform_release": platform.release(), "platform_system": platform.system(), "platform_version": platform.version(), - "python_full_version": platform.python_version(), + # Workaround for https://github.com/python/cpython/issues/99968 + "python_full_version": platform.python_version().rstrip("+"), "platform_python_implementation": platform.python_implementation(), "python_version": ".".join(platform.python_version().split(".")[:2]), "sys_platform": sys.platform, diff --git a/src/poetry/utils/helpers.py b/src/poetry/utils/helpers.py index fbc29e5b4dd..4dcbab6e17c 100644 --- a/src/poetry/utils/helpers.py +++ b/src/poetry/utils/helpers.py @@ -20,15 +20,15 @@ from typing import Any from typing import overload -import requests - from requests.utils import atomic_open +from poetry.utils.authenticator import get_default_authenticator from poetry.utils.constants import REQUESTS_TIMEOUT if TYPE_CHECKING: from collections.abc import Callable + from collections.abc import Collection from collections.abc import Iterator from types import TracebackType @@ -171,10 +171,10 @@ def __init__( ): self._dest = dest - get = requests.get if not session else session.get + session = session or get_default_authenticator() headers = {"Accept-Encoding": "Identity"} - self._response = get( + self._response = session.get( url, stream=True, headers=headers, timeout=REQUESTS_TIMEOUT ) self._response.raise_for_status() @@ -333,7 +333,7 @@ def get_file_hash(path: Path, hash_name: str = "sha256") -> str: def get_highest_priority_hash_type( - hash_types: set[str], archive_name: str + hash_types: Collection[str], archive_name: str ) -> str | None: if not hash_types: return None diff --git a/src/poetry/utils/isolated_build.py b/src/poetry/utils/isolated_build.py new file mode 100644 index 00000000000..2f46dfd37fe --- /dev/null +++ b/src/poetry/utils/isolated_build.py @@ -0,0 +1,156 @@ +from __future__ import annotations + +import os + +from contextlib import contextmanager +from contextlib import redirect_stdout +from io import StringIO +from typing import TYPE_CHECKING +from typing import Collection +from typing import Iterator + +from build.env import IsolatedEnv as BaseIsolatedEnv + +from poetry.utils.env import Env +from poetry.utils.env import EnvManager +from poetry.utils.env import ephemeral_environment + + +if TYPE_CHECKING: + from pathlib import Path + + from build import ProjectBuilder + + from poetry.repositories import RepositoryPool + + +class IsolatedBuildBaseError(Exception): ... + + +class IsolatedBuildError(IsolatedBuildBaseError): ... + + +class IsolatedBuildInstallError(IsolatedBuildBaseError): + def __init__(self, requirements: Collection[str], output: str, error: str) -> None: + message = "\n\n".join( + ( + f"Failed to install {', '.join(requirements)}.", + f"Output:\n{output}", + f"Error:\n{error}", + ) + ) + super().__init__(message) + self._requirements = requirements + + @property + def requirements(self) -> Collection[str]: + return self._requirements + + +class IsolatedEnv(BaseIsolatedEnv): + def __init__(self, env: Env, pool: RepositoryPool) -> None: + self._env = env + self._pool = pool + + @property + def python_executable(self) -> str: + return str(self._env.python) + + def make_extra_environ(self) -> dict[str, str]: + path = os.environ.get("PATH") + scripts_dir = str(self._env._bin_dir) + return { + "PATH": ( + os.pathsep.join([scripts_dir, path]) + if path is not None + else scripts_dir + ) + } + + def install(self, requirements: Collection[str]) -> None: + from cleo.io.buffered_io import BufferedIO + from poetry.core.packages.dependency import Dependency + from poetry.core.packages.project_package import ProjectPackage + + from poetry.config.config import Config + from poetry.installation.installer import Installer + from poetry.packages.locker import Locker + from poetry.repositories.installed_repository import InstalledRepository + + # We build Poetry dependencies from the requirements + package = ProjectPackage("__root__", "0.0.0") + package.python_versions = ".".join(str(v) for v in self._env.version_info[:3]) + + for requirement in requirements: + dependency = Dependency.create_from_pep_508(requirement) + package.add_dependency(dependency) + + io = BufferedIO() + + installer = Installer( + io, + self._env, + package, + Locker(self._env.path.joinpath("poetry.lock"), {}), + self._pool, + Config.create(), + InstalledRepository.load(self._env), + ) + installer.update(True) + + if installer.run() != 0: + raise IsolatedBuildInstallError( + requirements, io.fetch_output(), io.fetch_error() + ) + + +@contextmanager +def isolated_builder( + source: Path, + distribution: str = "wheel", + python_executable: Path | None = None, + pool: RepositoryPool | None = None, +) -> Iterator[ProjectBuilder]: + from build import ProjectBuilder + from pyproject_hooks import quiet_subprocess_runner # type: ignore[import-untyped] + + from poetry.factory import Factory + + try: + # we recreate the project's Poetry instance in order to retrieve the correct repository pool + # when a pool is not provided + pool = pool or Factory().create_poetry().pool + except RuntimeError: + # the context manager is not being called within a Poetry project context + # fallback to a default pool using only PyPI as source + from poetry.repositories import RepositoryPool + from poetry.repositories.pypi_repository import PyPiRepository + + # fallback to using only PyPI + pool = RepositoryPool(repositories=[PyPiRepository()]) + + python_executable = ( + python_executable or EnvManager.get_system_env(naive=True).python + ) + + with ephemeral_environment( + executable=python_executable, + flags={"no-pip": True, "no-setuptools": True, "no-wheel": True}, + ) as venv: + env = IsolatedEnv(venv, pool) + stdout = StringIO() + + builder = ProjectBuilder.from_isolated_env( + env, source, runner=quiet_subprocess_runner + ) + + with redirect_stdout(stdout): + env.install(builder.build_system_requires) + + # we repeat the build system requirements to avoid poetry installer from removing them + env.install( + builder.build_system_requires + | builder.get_requires_for_build(distribution) + ) + + yield builder diff --git a/src/poetry/utils/patterns.py b/src/poetry/utils/patterns.py index bf88e51b9bf..717a569ddcd 100644 --- a/src/poetry/utils/patterns.py +++ b/src/poetry/utils/patterns.py @@ -14,6 +14,6 @@ ) sdist_file_re = re.compile( - r"^(?P(?P.+?)-(?P\d.*?))" + r"^(?P(?P.+?)-(?P\d[^-]*?))" r"(\.sdist)?\.(?P(zip|tar(\.(gz|bz2|xz|Z))?))$" ) diff --git a/src/poetry/utils/setup_reader.py b/src/poetry/utils/setup_reader.py deleted file mode 100644 index 3c233cd92c7..00000000000 --- a/src/poetry/utils/setup_reader.py +++ /dev/null @@ -1,383 +0,0 @@ -from __future__ import annotations - -import ast - -from configparser import ConfigParser -from typing import TYPE_CHECKING -from typing import Any -from typing import ClassVar - -from poetry.core.constraints.version import Version - - -if TYPE_CHECKING: - from pathlib import Path - - -class SetupReaderError(Exception): - pass - - -class SetupReader: - """ - Class that reads a setup.py file without executing it. - """ - - DEFAULT: ClassVar[dict[str, Any]] = { - "name": None, - "version": None, - "description": None, - "install_requires": [], - "extras_require": {}, - "python_requires": None, - } - - FILES: ClassVar[list[str]] = ["setup.py", "setup.cfg"] - - @classmethod - def read_from_directory(cls, directory: Path) -> dict[str, Any]: - result = cls.DEFAULT.copy() - for filename in cls.FILES: - filepath = directory / filename - if not filepath.exists(): - continue - - read_file_func = getattr(cls(), "read_" + filename.replace(".", "_")) - new_result = read_file_func(filepath) - - for key in result: - if new_result[key]: - result[key] = new_result[key] - - return result - - def read_setup_py(self, filepath: Path) -> dict[str, Any]: - with filepath.open(encoding="utf-8") as f: - content = f.read() - - result: dict[str, Any] = {} - - body = ast.parse(content).body - - setup_call = self._find_setup_call(body) - if setup_call is None: - return self.DEFAULT - - # Inspecting keyword arguments - call, body = setup_call - result["name"] = self._find_single_string(call, body, "name") - result["version"] = self._find_single_string(call, body, "version") - result["description"] = self._find_single_string(call, body, "description") - result["install_requires"] = self._find_install_requires(call, body) - result["extras_require"] = self._find_extras_require(call, body) - result["python_requires"] = self._find_single_string( - call, body, "python_requires" - ) - - return result - - def read_setup_cfg(self, filepath: Path) -> dict[str, Any]: - parser = ConfigParser() - - parser.read(str(filepath)) - - name = None - version = None - description = None - if parser.has_option("metadata", "name"): - name = parser.get("metadata", "name") - - if parser.has_option("metadata", "version"): - version = Version.parse(parser.get("metadata", "version")).text - - if parser.has_option("metadata", "description"): - description = parser.get("metadata", "description") - - install_requires = [] - extras_require: dict[str, list[str]] = {} - python_requires = None - if parser.has_section("options"): - if parser.has_option("options", "install_requires"): - for dep in parser.get("options", "install_requires").split("\n"): - dep = dep.strip() - if not dep: - continue - - install_requires.append(dep) - - if parser.has_option("options", "python_requires"): - python_requires = parser.get("options", "python_requires") - - if parser.has_section("options.extras_require"): - for group in parser.options("options.extras_require"): - extras_require[group] = [] - deps = parser.get("options.extras_require", group) - for dep in deps.split("\n"): - dep = dep.strip() - if not dep: - continue - - extras_require[group].append(dep) - - return { - "name": name, - "version": version, - "description": description, - "install_requires": install_requires, - "extras_require": extras_require, - "python_requires": python_requires, - } - - def _find_setup_call( - self, elements: list[ast.stmt] - ) -> tuple[ast.Call, list[ast.stmt]] | None: - funcdefs: list[ast.stmt] = [] - for i, element in enumerate(elements): - if isinstance(element, ast.If) and i == len(elements) - 1: - # Checking if the last element is an if statement - # and if it is 'if __name__ == "__main__"' which - # could contain the call to setup() - test = element.test - if not isinstance(test, ast.Compare): - continue - - left = test.left - if not isinstance(left, ast.Name): - continue - - if left.id != "__name__": - continue - - setup_call = self._find_sub_setup_call([element]) - if setup_call is None: - continue - - call, body = setup_call - return call, body + elements - - if not isinstance(element, ast.Expr): - if isinstance(element, ast.FunctionDef): - funcdefs.append(element) - - continue - - value = element.value - if not isinstance(value, ast.Call): - continue - - func = value.func - if not (isinstance(func, ast.Name) and func.id == "setup") and not ( - isinstance(func, ast.Attribute) - and getattr(func.value, "id", None) == "setuptools" - and func.attr == "setup" - ): - continue - - return value, elements - - # Nothing, we inspect the function definitions - return self._find_sub_setup_call(funcdefs) - - def _find_sub_setup_call( - self, elements: list[ast.stmt] - ) -> tuple[ast.Call, list[ast.stmt]] | None: - for element in elements: - if not isinstance(element, (ast.FunctionDef, ast.If)): - continue - - setup_call = self._find_setup_call(element.body) - if setup_call is not None: - sub_call, body = setup_call - - body = elements + body - - return sub_call, body - - return None - - def _find_install_requires(self, call: ast.Call, body: list[ast.stmt]) -> list[str]: - value = self._find_in_call(call, "install_requires") - if value is None: - # Trying to find in kwargs - kwargs = self._find_call_kwargs(call) - - if kwargs is None or not isinstance(kwargs, ast.Name): - return [] - - variable = self._find_variable_in_body(body, kwargs.id) - - if isinstance(variable, ast.Dict): - value = self._find_in_dict(variable, "install_requires") - - elif ( - isinstance(variable, ast.Call) - and isinstance(variable.func, ast.Name) - and variable.func.id == "dict" - ): - value = self._find_in_call(variable, "install_requires") - - else: - raise SetupReaderError(f"Cannot handle variable {variable}") - - if value is None: - return [] - - if isinstance(value, ast.Name): - value = self._find_variable_in_body(body, value.id) - - if isinstance(value, ast.Constant) and value.value is None: - return [] - - if isinstance(value, ast.List): - return string_list_values(value) - - raise SetupReaderError(f"Cannot handle value of type {type(value)}") - - def _find_extras_require( - self, call: ast.Call, body: list[ast.stmt] - ) -> dict[str, list[str]]: - value = self._find_in_call(call, "extras_require") - if value is None: - # Trying to find in kwargs - kwargs = self._find_call_kwargs(call) - - if kwargs is None or not isinstance(kwargs, ast.Name): - return {} - - variable = self._find_variable_in_body(body, kwargs.id) - if isinstance(variable, ast.Dict): - value = self._find_in_dict(variable, "extras_require") - - elif ( - isinstance(variable, ast.Call) - and isinstance(variable.func, ast.Name) - and variable.func.id == "dict" - ): - value = self._find_in_call(variable, "extras_require") - - else: - raise SetupReaderError(f"Cannot handle variable {variable}") - - if value is None: - return {} - - if isinstance(value, ast.Name): - value = self._find_variable_in_body(body, value.id) - - if isinstance(value, ast.Constant) and value.value is None: - return {} - - if isinstance(value, ast.Dict): - extras_require: dict[str, list[str]] = {} - val: ast.expr | None - for key, val in zip(value.keys, value.values): - if not isinstance(key, ast.Constant) or not isinstance(key.value, str): - raise SetupReaderError(f"Cannot handle key {key}") - - if isinstance(val, ast.Name): - val = self._find_variable_in_body(body, val.id) - - if not isinstance(val, ast.List): - raise SetupReaderError(f"Cannot handle value of type {type(val)}") - - extras_require[key.value] = string_list_values(val) - - return extras_require - - raise SetupReaderError(f"Cannot handle value of type {type(value)}") - - def _find_single_string( - self, call: ast.Call, body: list[ast.stmt], name: str - ) -> str | None: - value = self._find_in_call(call, name) - if value is None: - # Trying to find in kwargs - kwargs = self._find_call_kwargs(call) - - if kwargs is None or not isinstance(kwargs, ast.Name): - return None - - variable = self._find_variable_in_body(body, kwargs.id) - if not isinstance(variable, (ast.Dict, ast.Call)): - return None - - if isinstance(variable, ast.Call): - if not isinstance(variable.func, ast.Name): - return None - - if variable.func.id != "dict": - return None - - value = self._find_in_call(variable, name) - else: - value = self._find_in_dict(variable, name) - - if value is None: - return None - - if isinstance(value, ast.Constant) and isinstance(value.value, str): - return value.value - elif isinstance(value, ast.Name): - variable = self._find_variable_in_body(body, value.id) - - if ( - variable is not None - and isinstance(variable, ast.Constant) - and isinstance(variable.value, str) - ): - return variable.value - - return None - - def _find_in_call(self, call: ast.Call, name: str) -> Any | None: - for keyword in call.keywords: - if keyword.arg == name: - return keyword.value - return None - - def _find_call_kwargs(self, call: ast.Call) -> Any | None: - kwargs = None - for keyword in call.keywords: - if keyword.arg is None: - kwargs = keyword.value - - return kwargs - - def _find_variable_in_body( - self, body: list[ast.stmt], name: str - ) -> ast.expr | None: - for elem in body: - if not isinstance(elem, ast.Assign): - continue - - for target in elem.targets: - if not isinstance(target, ast.Name): - continue - - if target.id == name: - return elem.value - - return None - - def _find_in_dict(self, dict_: ast.Dict, name: str) -> ast.expr | None: - for key, val in zip(dict_.keys, dict_.values): - if ( - isinstance(key, ast.Constant) - and isinstance(key.value, str) - and key.value == name - ): - return val - - return None - - -def string_list_values(value: ast.List) -> list[str]: - strings = [] - for element in value.elts: - if isinstance(element, ast.Constant) and isinstance(element.value, str): - strings.append(element.value) - - else: - raise SetupReaderError("Found non-string element in list") - - return strings diff --git a/src/poetry/vcs/git/backend.py b/src/poetry/vcs/git/backend.py index a9701738038..0fc00f0b266 100644 --- a/src/poetry/vcs/git/backend.py +++ b/src/poetry/vcs/git/backend.py @@ -184,7 +184,7 @@ def info(cls, repo: Repo | Path) -> GitRepoLocalInfo: @staticmethod def get_name_from_source_url(url: str) -> str: - return re.sub(r"(.git)?$", "", url.rsplit("/", 1)[-1]) + return re.sub(r"(.git)?$", "", url.rstrip("/").rsplit("/", 1)[-1]) @classmethod def _fetch_remote_refs(cls, url: str, local: Repo) -> FetchPackResult: diff --git a/tests/conftest.py b/tests/conftest.py index 119f38cfe5b..05e1c6cbfec 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,7 +7,6 @@ import shutil import sys -from contextlib import suppress from pathlib import Path from typing import TYPE_CHECKING from typing import Any @@ -26,9 +25,8 @@ from poetry.config.config import Config as BaseConfig from poetry.config.dict_config_source import DictConfigSource from poetry.factory import Factory -from poetry.inspection.info import PackageInfo -from poetry.inspection.info import PackageInfoError from poetry.layouts import layout +from poetry.packages.direct_origin import _get_package_from_git from poetry.repositories import Repository from poetry.repositories import RepositoryPool from poetry.utils.cache import ArtifactCache @@ -42,7 +40,6 @@ from tests.helpers import http_setup_redirect from tests.helpers import isolated_environment from tests.helpers import mock_clone -from tests.helpers import mock_download from tests.helpers import switch_working_directory from tests.helpers import with_working_directory @@ -280,26 +277,6 @@ def mock_user_config_dir(mocker: MockerFixture, config_dir: Path) -> None: mocker.patch("poetry.config.config.CONFIG_DIR", new=config_dir) -@pytest.fixture(autouse=True) -def download_mock(mocker: MockerFixture) -> None: - # Patch download to not download anything but to just copy from fixtures - mocker.patch("poetry.utils.helpers.download_file", new=mock_download) - mocker.patch("poetry.packages.direct_origin.download_file", new=mock_download) - - -@pytest.fixture(autouse=True) -def pep517_metadata_mock(mocker: MockerFixture) -> None: - def get_pep517_metadata(path: Path) -> PackageInfo: - with suppress(PackageInfoError): - return PackageInfo.from_setup_files(path) - return PackageInfo(name="demo", version="0.1.2") - - mocker.patch( - "poetry.inspection.info.get_pep517_metadata", - get_pep517_metadata, - ) - - @pytest.fixture def environ() -> Iterator[None]: with isolated_environment(): @@ -324,6 +301,8 @@ def git_mock(mocker: MockerFixture) -> None: p = mocker.patch("poetry.vcs.git.Git.get_revision") p.return_value = MOCK_DEFAULT_GIT_REVISION + _get_package_from_git.cache_clear() + @pytest.fixture def http() -> Iterator[type[httpretty.httpretty]]: diff --git a/tests/console/commands/test_add.py b/tests/console/commands/test_add.py index 503848d0146..fb8c4e58188 100644 --- a/tests/console/commands/test_add.py +++ b/tests/console/commands/test_add.py @@ -734,7 +734,7 @@ def test_add_url_constraint_wheel( repo.add_package(get_package("pendulum", "1.4.4")) tester.execute( - "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" ) expected = """\ @@ -746,7 +746,7 @@ def test_add_url_constraint_wheel( - Installing pendulum (1.4.4) - Installing demo\ - (0.1.0 https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl) + (0.1.0 https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl) Writing lock file """ @@ -760,7 +760,7 @@ def test_add_url_constraint_wheel( assert "demo" in content["dependencies"] assert content["dependencies"]["demo"] == { - "url": "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + "url": "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" } @@ -776,7 +776,7 @@ def test_add_url_constraint_wheel_with_extras( repo.add_package(get_package("tomlkit", "0.5.5")) tester.execute( - "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" f"[{extra_name},bar]" ) @@ -791,7 +791,7 @@ def test_add_url_constraint_wheel_with_extras( - Installing pendulum (1.4.4) - Installing tomlkit (0.5.5) - Installing demo\ - (0.1.0 https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl) + (0.1.0 https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl) Writing lock file """ @@ -808,7 +808,7 @@ def test_add_url_constraint_wheel_with_extras( assert "demo" in content["dependencies"] assert content["dependencies"]["demo"] == { "url": ( - "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" ), "extras": [extra_name, "bar"], } diff --git a/tests/console/commands/test_check.py b/tests/console/commands/test_check.py index 6f45c70b206..67cfef8410b 100644 --- a/tests/console/commands/test_check.py +++ b/tests/console/commands/test_check.py @@ -4,12 +4,13 @@ import pytest +from poetry.factory import Factory from poetry.packages import Locker from poetry.toml import TOMLFile if TYPE_CHECKING: - import httpretty + from typing import Iterator from cleo.testers.command_tester import CommandTester from pytest_mock import MockerFixture @@ -17,42 +18,36 @@ from poetry.poetry import Poetry from tests.types import CommandTesterFactory from tests.types import FixtureDirGetter - from tests.types import ProjectFactory + from tests.types import SetProjectContext -@pytest.fixture() -def tester(command_tester_factory: CommandTesterFactory) -> CommandTester: - return command_tester_factory("check") - - -def _project_factory( - fixture_name: str, - project_factory: ProjectFactory, - fixture_dir: FixtureDirGetter, -) -> Poetry: - source = fixture_dir(fixture_name) - pyproject_content = (source / "pyproject.toml").read_text(encoding="utf-8") - poetry_lock_content = (source / "poetry.lock").read_text(encoding="utf-8") - return project_factory( - name="foobar", - pyproject_content=pyproject_content, - poetry_lock_content=poetry_lock_content, - source=source, - ) +@pytest.fixture +def poetry_sample_project(set_project_context: SetProjectContext) -> Iterator[Poetry]: + with set_project_context("sample_project", in_place=False) as cwd: + yield Factory().create_poetry(cwd) @pytest.fixture def poetry_with_outdated_lockfile( - project_factory: ProjectFactory, fixture_dir: FixtureDirGetter -) -> Poetry: - return _project_factory("outdated_lock", project_factory, fixture_dir) + set_project_context: SetProjectContext, +) -> Iterator[Poetry]: + with set_project_context("outdated_lock", in_place=False) as cwd: + yield Factory().create_poetry(cwd) @pytest.fixture def poetry_with_up_to_date_lockfile( - project_factory: ProjectFactory, fixture_dir: FixtureDirGetter -) -> Poetry: - return _project_factory("up_to_date_lock", project_factory, fixture_dir) + set_project_context: SetProjectContext, +) -> Iterator[Poetry]: + with set_project_context("up_to_date_lock", in_place=False) as cwd: + yield Factory().create_poetry(cwd) + + +@pytest.fixture() +def tester( + command_tester_factory: CommandTesterFactory, poetry_sample_project: Poetry +) -> CommandTester: + return command_tester_factory("check", poetry=poetry_sample_project) def test_check_valid(tester: CommandTester) -> None: @@ -175,11 +170,8 @@ def test_check_lock_missing( def test_check_lock_outdated( command_tester_factory: CommandTesterFactory, poetry_with_outdated_lockfile: Poetry, - http: type[httpretty.httpretty], options: str, ) -> None: - http.disable() - locker = Locker( lock=poetry_with_outdated_lockfile.pyproject.file.path.parent / "poetry.lock", pyproject_data=poetry_with_outdated_lockfile.locker._pyproject_data, @@ -203,11 +195,8 @@ def test_check_lock_outdated( def test_check_lock_up_to_date( command_tester_factory: CommandTesterFactory, poetry_with_up_to_date_lockfile: Poetry, - http: type[httpretty.httpretty], options: str, ) -> None: - http.disable() - locker = Locker( lock=poetry_with_up_to_date_lockfile.pyproject.file.path.parent / "poetry.lock", pyproject_data=poetry_with_up_to_date_lockfile.locker._pyproject_data, diff --git a/tests/console/commands/test_lock.py b/tests/console/commands/test_lock.py index bdffaf76c6a..38d0c746412 100644 --- a/tests/console/commands/test_lock.py +++ b/tests/console/commands/test_lock.py @@ -10,8 +10,6 @@ if TYPE_CHECKING: - import httpretty - from cleo.testers.command_tester import CommandTester from poetry.poetry import Poetry @@ -92,10 +90,7 @@ def poetry_with_invalid_lockfile( def test_lock_check_outdated_legacy( command_tester_factory: CommandTesterFactory, poetry_with_outdated_lockfile: Poetry, - http: type[httpretty.httpretty], ) -> None: - http.disable() - locker = Locker( lock=poetry_with_outdated_lockfile.pyproject.file.path.parent / "poetry.lock", pyproject_data=poetry_with_outdated_lockfile.locker._pyproject_data, @@ -119,10 +114,7 @@ def test_lock_check_outdated_legacy( def test_lock_check_up_to_date_legacy( command_tester_factory: CommandTesterFactory, poetry_with_up_to_date_lockfile: Poetry, - http: type[httpretty.httpretty], ) -> None: - http.disable() - locker = Locker( lock=poetry_with_up_to_date_lockfile.pyproject.file.path.parent / "poetry.lock", pyproject_data=poetry_with_up_to_date_lockfile.locker._pyproject_data, diff --git a/tests/console/commands/test_show.py b/tests/console/commands/test_show.py index 162fa73a13d..2bda20eca7d 100644 --- a/tests/console/commands/test_show.py +++ b/tests/console/commands/test_show.py @@ -2070,7 +2070,9 @@ def test_url_dependency_is_not_outdated_by_repository_package( installed: Repository, repo: TestRepository, ) -> None: - demo_url = "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + demo_url = ( + "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + ) poetry.package.add_dependency( Factory.create_dependency( "demo", diff --git a/tests/fixtures/distributions/demo_metadata_version_unknown-0.1.0-py2.py3-none-any.whl b/tests/fixtures/distributions/demo_metadata_version_unknown-0.1.0-py2.py3-none-any.whl new file mode 100644 index 00000000000..03988228fec Binary files /dev/null and b/tests/fixtures/distributions/demo_metadata_version_unknown-0.1.0-py2.py3-none-any.whl differ diff --git a/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_dynamic/PKG-INFO b/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_dynamic/PKG-INFO new file mode 100644 index 00000000000..325d14b3bf9 --- /dev/null +++ b/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_dynamic/PKG-INFO @@ -0,0 +1,11 @@ +Metadata-Version: 2.2 +Name: demo +Version: 0.1.0 +Summary: Demo project. +Home-page: https://github.com/demo/demo +Author: Sébastien Eustace +Author-email: sebastien@eustace.io +License: MIT +Description: UNKNOWN +Platform: UNKNOWN +Dynamic: Requires-Dist diff --git a/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_dynamic/pyproject.toml b/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_dynamic/pyproject.toml new file mode 100644 index 00000000000..0f09fb96fc4 --- /dev/null +++ b/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_dynamic/pyproject.toml @@ -0,0 +1,19 @@ +# this was copied over and modified from orjson project's pyproject.toml +# https://github.com/ijl/orjson/blob/master/pyproject.toml +[project] +name = "demo" +repository = "https://github.com/demo/demo" + +[build-system] +build-backend = "maturin" +requires = ["maturin>=0.8.1,<0.9"] + +[tool.maturin] +manylinux = "off" +sdist-include = ["Cargo.lock", "json/**/*"] +strip = "on" + +[tool.black] +line-length = 88 +target-version = ['py36', 'py37', 'py38'] +include = '\.pyi?$' diff --git a/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_for_sure/PKG-INFO b/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_for_sure/PKG-INFO new file mode 100644 index 00000000000..824b60bcd55 --- /dev/null +++ b/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_for_sure/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 2.3 +Name: demo +Version: 0.1.0 +Summary: Demo project. +Home-page: https://github.com/demo/demo +Author: Sébastien Eustace +Author-email: sebastien@eustace.io +License: MIT +Description: UNKNOWN +Platform: UNKNOWN diff --git a/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_for_sure/pyproject.toml b/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_for_sure/pyproject.toml new file mode 100644 index 00000000000..0f09fb96fc4 --- /dev/null +++ b/tests/fixtures/inspection/demo_no_setup_pkg_info_no_deps_for_sure/pyproject.toml @@ -0,0 +1,19 @@ +# this was copied over and modified from orjson project's pyproject.toml +# https://github.com/ijl/orjson/blob/master/pyproject.toml +[project] +name = "demo" +repository = "https://github.com/demo/demo" + +[build-system] +build-backend = "maturin" +requires = ["maturin>=0.8.1,<0.9"] + +[tool.maturin] +manylinux = "off" +sdist-include = ["Cargo.lock", "json/**/*"] +strip = "on" + +[tool.black] +line-length = 88 +target-version = ['py36', 'py37', 'py38'] +include = '\.pyi?$' diff --git a/tests/helpers.py b/tests/helpers.py index a1a63520b6f..bf15904e979 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -4,7 +4,6 @@ import os import re import shutil -import urllib.parse from pathlib import Path from typing import TYPE_CHECKING @@ -34,12 +33,10 @@ from poetry.core.constraints.version import Version from poetry.core.packages.dependency import Dependency from pytest_mock import MockerFixture - from requests import Session from tomlkit.toml_document import TOMLDocument from poetry.installation.operations.operation import Operation from poetry.poetry import Poetry - from poetry.utils.authenticator import Authenticator from tests.types import HTTPrettyResponse FIXTURE_PATH = Path(__file__).parent / "fixtures" @@ -79,10 +76,10 @@ def get_dependency( def copy_path(source: Path, dest: Path) -> None: - if dest.is_symlink() or dest.is_file(): - dest.unlink() # missing_ok is only available in Python >= 3.8 - elif dest.is_dir(): + if dest.is_dir(): shutil.rmtree(dest) + else: + dest.unlink(missing_ok=True) if source.is_dir(): shutil.copytree(source, dest) @@ -111,32 +108,18 @@ def mock_clone( assert parsed.resource is not None folder = FIXTURE_PATH / "git" / parsed.resource / path + assert folder.is_dir() if not source_root: source_root = Path(Config.create().get("cache-dir")) / "src" dest = source_root / path - dest.parent.mkdir(parents=True, exist_ok=True) + dest.mkdir(parents=True, exist_ok=True) copy_path(folder, dest) return MockDulwichRepo(dest) -def mock_download( - url: str, - dest: Path, - *, - session: Authenticator | Session | None = None, - chunk_size: int = 1024, - raise_accepts_ranges: bool = False, -) -> None: - parts = urllib.parse.urlparse(url) - - fixture = FIXTURE_PATH / parts.path.lstrip("/") - - copy_path(fixture, dest) - - class TestExecutor(Executor): def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) diff --git a/tests/inspection/test_info.py b/tests/inspection/test_info.py index b986043924e..75a86f9e2b8 100644 --- a/tests/inspection/test_info.py +++ b/tests/inspection/test_info.py @@ -4,15 +4,17 @@ from subprocess import CalledProcessError from typing import TYPE_CHECKING +from typing import Iterator from zipfile import ZipFile import pytest +from build import BuildBackendException +from build import ProjectBuilder from packaging.metadata import parse_email from poetry.inspection.info import PackageInfo from poetry.inspection.info import PackageInfoError -from poetry.utils.env import EnvCommandError from poetry.utils.env import VirtualEnv @@ -23,11 +25,7 @@ from pytest_mock import MockerFixture from tests.types import FixtureDirGetter - - -@pytest.fixture(autouse=True) -def pep517_metadata_mock() -> None: - pass + from tests.types import SetProjectContext @pytest.fixture @@ -133,6 +131,12 @@ def demo_setup_complex_calls_script( return source_dir +@pytest.fixture(autouse=True) +def use_project_context(set_project_context: SetProjectContext) -> Iterator[None]: + with set_project_context("sample_project"): + yield + + def demo_check_info(info: PackageInfo, requires_dist: set[str] | None = None) -> None: assert info.name == "demo" assert info.version == "0.1.0" @@ -141,19 +145,29 @@ def demo_check_info(info: PackageInfo, requires_dist: set[str] | None = None) -> if requires_dist: assert set(info.requires_dist) == requires_dist else: + # Exact formatting various according to the exact mechanism used to extract the + # metadata. assert set(info.requires_dist) in ( - # before https://github.com/python-poetry/poetry-core/pull/510 { 'cleo; extra == "foo"', "pendulum (>=1.4.4)", 'tomlkit; extra == "bar"', }, - # after https://github.com/python-poetry/poetry-core/pull/510 { 'cleo ; extra == "foo"', "pendulum (>=1.4.4)", 'tomlkit ; extra == "bar"', }, + { + 'cleo ; extra == "foo"', + "pendulum>=1.4.4", + 'tomlkit ; extra == "bar"', + }, + { + "cleo ; extra == 'foo'", + "pendulum (>=1.4.4)", + "tomlkit ; extra == 'bar'", + }, ) @@ -190,6 +204,20 @@ def test_info_from_wheel_metadata_version_23(fixture_dir: FixtureDirGetter) -> N assert info._source_url == path.resolve().as_posix() +def test_info_from_wheel_metadata_version_unknown( + fixture_dir: FixtureDirGetter, +) -> None: + path = ( + fixture_dir("distributions") + / "demo_metadata_version_unknown-0.1.0-py2.py3-none-any.whl" + ) + + with pytest.raises(PackageInfoError) as e: + PackageInfo.from_wheel(path) + + assert "Unknown metadata version: 999.3" in str(e.value) + + def test_info_from_wheel_metadata(demo_wheel_metadata: RawMetadata) -> None: info = PackageInfo.from_metadata(demo_wheel_metadata) demo_check_info(info) @@ -220,9 +248,7 @@ def test_info_from_bdist(demo_wheel: Path) -> None: def test_info_from_poetry_directory(fixture_dir: FixtureDirGetter) -> None: - info = PackageInfo.from_directory( - fixture_dir("inspection") / "demo", disable_build=True - ) + info = PackageInfo.from_directory(fixture_dir("inspection") / "demo") demo_check_info(info) @@ -252,21 +278,31 @@ def test_info_from_requires_txt(fixture_dir: FixtureDirGetter) -> None: demo_check_info(info) -def test_info_from_setup_py(demo_setup: Path) -> None: - info = PackageInfo.from_setup_files(demo_setup) - demo_check_info(info, requires_dist={"package"}) +def test_info_no_setup_pkg_info_no_deps(fixture_dir: FixtureDirGetter) -> None: + info = PackageInfo.from_metadata_directory( + fixture_dir("inspection") / "demo_no_setup_pkg_info_no_deps" + ) + assert info is not None + assert info.name == "demo" + assert info.version == "0.1.0" + assert info.requires_dist is None -def test_info_from_setup_cfg(demo_setup_cfg: Path) -> None: - info = PackageInfo.from_setup_files(demo_setup_cfg) - demo_check_info(info, requires_dist={"package"}) +def test_info_no_setup_pkg_info_no_deps_for_sure(fixture_dir: FixtureDirGetter) -> None: + info = PackageInfo.from_metadata_directory( + fixture_dir("inspection") / "demo_no_setup_pkg_info_no_deps_for_sure", + ) + assert info is not None + assert info.name == "demo" + assert info.version == "0.1.0" + assert info.requires_dist == [] -def test_info_no_setup_pkg_info_no_deps(fixture_dir: FixtureDirGetter) -> None: - info = PackageInfo.from_directory( - fixture_dir("inspection") / "demo_no_setup_pkg_info_no_deps", - disable_build=True, +def test_info_no_setup_pkg_info_no_deps_dynamic(fixture_dir: FixtureDirGetter) -> None: + info = PackageInfo.from_metadata_directory( + fixture_dir("inspection") / "demo_no_setup_pkg_info_no_deps_dynamic", ) + assert info is not None assert info.name == "demo" assert info.version == "0.1.0" assert info.requires_dist is None @@ -275,18 +311,10 @@ def test_info_no_setup_pkg_info_no_deps(fixture_dir: FixtureDirGetter) -> None: def test_info_setup_simple(mocker: MockerFixture, demo_setup: Path) -> None: spy = mocker.spy(VirtualEnv, "run") info = PackageInfo.from_directory(demo_setup) - assert spy.call_count == 0 - demo_check_info(info, requires_dist={"package"}) - - -def test_info_setup_cfg(mocker: MockerFixture, demo_setup_cfg: Path) -> None: - spy = mocker.spy(VirtualEnv, "run") - info = PackageInfo.from_directory(demo_setup_cfg) - assert spy.call_count == 0 + assert spy.call_count == 5 demo_check_info(info, requires_dist={"package"}) -@pytest.mark.network def test_info_setup_complex(demo_setup_complex: Path) -> None: info = PackageInfo.from_directory(demo_setup_complex) demo_check_info(info, requires_dist={"package"}) @@ -296,16 +324,15 @@ def test_info_setup_complex_pep517_error( mocker: MockerFixture, demo_setup_complex: Path ) -> None: mocker.patch( - "poetry.utils.env.VirtualEnv.run", + "build.ProjectBuilder.from_isolated_env", autospec=True, - side_effect=EnvCommandError(CalledProcessError(1, "mock", output="mock")), + side_effect=BuildBackendException(CalledProcessError(1, "mock", output="mock")), ) with pytest.raises(PackageInfoError): PackageInfo.from_directory(demo_setup_complex) -@pytest.mark.network def test_info_setup_complex_pep517_legacy( demo_setup_complex_pep517_legacy: Path, ) -> None: @@ -313,22 +340,12 @@ def test_info_setup_complex_pep517_legacy( demo_check_info(info, requires_dist={"package"}) -def test_info_setup_complex_disable_build( - mocker: MockerFixture, demo_setup_complex: Path -) -> None: - # Cannot extract install_requires from list comprehension. - with pytest.raises(PackageInfoError): - PackageInfo.from_directory(demo_setup_complex, disable_build=True) - - -@pytest.mark.network def test_info_setup_complex_calls_script(demo_setup_complex_calls_script: Path) -> None: """Building the project requires calling a script from its build_requires.""" info = PackageInfo.from_directory(demo_setup_complex_calls_script) demo_check_info(info, requires_dist={"package"}) -@pytest.mark.network @pytest.mark.parametrize("missing", ["version", "name"]) def test_info_setup_missing_mandatory_should_trigger_pep517( mocker: MockerFixture, source_dir: Path, missing: str @@ -343,29 +360,11 @@ def test_info_setup_missing_mandatory_should_trigger_pep517( setup_py = source_dir / "setup.py" setup_py.write_text(setup) - spy = mocker.spy(VirtualEnv, "run") + spy = mocker.spy(ProjectBuilder, "from_isolated_env") _ = PackageInfo.from_directory(source_dir) assert spy.call_count == 1 -@pytest.mark.network -def test_info_setup_missing_install_requires_is_fine( - mocker: MockerFixture, source_dir: Path -) -> None: - setup = "from setuptools import setup; " - setup += "setup(" - setup += 'name="demo", ' - setup += 'version="0.1.0", ' - setup += ")" - - setup_py = source_dir / "setup.py" - setup_py.write_text(setup) - - spy = mocker.spy(VirtualEnv, "run") - _ = PackageInfo.from_directory(source_dir) - assert spy.call_count == 0 - - def test_info_prefer_poetry_config_over_egg_info(fixture_dir: FixtureDirGetter) -> None: info = PackageInfo.from_directory( fixture_dir("inspection") / "demo_with_obsolete_egg_info" diff --git a/tests/installation/fixtures/with-pypi-repository.test b/tests/installation/fixtures/with-pypi-repository.test index 2309188b551..d506a21ccbd 100644 --- a/tests/installation/fixtures/with-pypi-repository.test +++ b/tests/installation/fixtures/with-pypi-repository.test @@ -49,6 +49,8 @@ description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ + {file = "pluggy-0.6.0-py2-none-any.whl", hash = "sha256:9b835f86bfe5498c87ace7f4899cb1b0c40e71c9277377f6851c74a307879285"}, + {file = "pluggy-0.6.0-py3-none-any.whl", hash = "sha256:8c646771f5eab7557d1f3924077c55408e86bdfb700f7d86a6d83abeabff4c66"}, {file = "pluggy-0.6.0.tar.gz", hash = "sha256:a982e208d054867661d27c6d2a86b17ba05fbb6b1bdc01f42660732dd107f865"}, ] @@ -65,13 +67,13 @@ files = [ [[package]] name = "pytest" -version = "3.5.0" +version = "3.5.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pytest-3.5.0-py2.py3-none-any.whl", hash = "sha256:28e4d9c2ae3196d74805c2eba24f350ae4c791a5b9b397c79b41506a48dc64ca"}, - {file = "pytest-3.5.0.tar.gz", hash = "sha256:677b1d6decd29c041fe64276f29f79fbe66e40c59e445eb251366b4a8ab8bf68"}, + {file = "pytest-3.5.1-py2.py3-none-any.whl", hash = "sha256:6d3e83b1c1697d220137e436980e73b3ca674f643e666d7c24b0321cb57b76a4"}, + {file = "pytest-3.5.1.tar.gz", hash = "sha256:b8fe151f3e181801dd38583a1c03818fbc662a8fce96c9063a0af624613e78f8"}, ] [package.dependencies] diff --git a/tests/installation/fixtures/with-same-version-url-dependencies.test b/tests/installation/fixtures/with-same-version-url-dependencies.test index 47b8c1006c5..2188ee95a46 100644 --- a/tests/installation/fixtures/with-same-version-url-dependencies.test +++ b/tests/installation/fixtures/with-same-version-url-dependencies.test @@ -10,7 +10,7 @@ files = [ [package.source] type = "url" -url = "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" [package.dependencies] pendulum = ">=1.4.4" @@ -30,7 +30,7 @@ files = [ ] [package.source] type = "url" -url = "https://python-poetry.org/distributions/demo-0.1.0.tar.gz" +url = "https://files.pythonhosted.org/distributions/demo-0.1.0.tar.gz" [package.dependencies] pendulum = ">=1.4.4" diff --git a/tests/installation/fixtures/with-url-dependency.test b/tests/installation/fixtures/with-url-dependency.test index 6cfbe6d8f6c..ec40b26055a 100644 --- a/tests/installation/fixtures/with-url-dependency.test +++ b/tests/installation/fixtures/with-url-dependency.test @@ -10,7 +10,7 @@ files = [ [package.source] type = "url" -url = "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" [package.dependencies] pendulum = ">=1.4.4" diff --git a/tests/installation/test_chef.py b/tests/installation/test_chef.py index 2925d387935..ffe0e06b3bd 100644 --- a/tests/installation/test_chef.py +++ b/tests/installation/test_chef.py @@ -2,7 +2,6 @@ import os import shutil -import sys import tempfile from pathlib import Path @@ -16,18 +15,11 @@ from poetry.factory import Factory from poetry.installation.chef import Chef -from poetry.installation.chef import ChefInstallError -from poetry.installation.chef import IsolatedEnv -from poetry.puzzle.exceptions import SolverProblemError -from poetry.puzzle.provider import IncompatibleConstraintsError from poetry.repositories import RepositoryPool from poetry.utils.env import EnvManager -from poetry.utils.env import ephemeral_environment if TYPE_CHECKING: - from collections.abc import Collection - from pytest_mock import MockerFixture from poetry.repositories.pypi_repository import PyPiRepository @@ -50,41 +42,6 @@ def setup(mocker: MockerFixture, pool: RepositoryPool) -> None: mocker.patch.object(Factory, "create_pool", return_value=pool) -def test_isolated_env_install_success(pool: RepositoryPool) -> None: - with ephemeral_environment(Path(sys.executable)) as venv: - env = IsolatedEnv(venv, pool) - assert "poetry-core" not in venv.run("pip", "freeze") - env.install({"poetry-core"}) - assert "poetry-core" in venv.run("pip", "freeze") - - -@pytest.mark.parametrize( - ("requirements", "exception"), - [ - ({"poetry-core==1.5.0", "poetry-core==1.6.0"}, IncompatibleConstraintsError), - ({"black==19.10b0", "attrs==17.4.0"}, SolverProblemError), - ], -) -def test_isolated_env_install_error( - requirements: Collection[str], exception: type[Exception], pool: RepositoryPool -) -> None: - with ephemeral_environment(Path(sys.executable)) as venv: - env = IsolatedEnv(venv, pool) - with pytest.raises(exception): - env.install(requirements) - - -def test_isolated_env_install_failure( - pool: RepositoryPool, mocker: MockerFixture -) -> None: - mocker.patch("poetry.installation.installer.Installer.run", return_value=1) - with ephemeral_environment(Path(sys.executable)) as venv: - env = IsolatedEnv(venv, pool) - with pytest.raises(ChefInstallError) as e: - env.install({"a", "b>1"}) - assert e.value.requirements == {"a", "b>1"} - - def test_prepare_sdist( config: Config, config_cache_dir: Path, @@ -123,7 +80,6 @@ def test_prepare_directory( os.unlink(wheel) -@pytest.mark.network def test_prepare_directory_with_extensions( config: Config, config_cache_dir: Path, @@ -169,7 +125,6 @@ def test_prepare_directory_editable( os.unlink(wheel) -@pytest.mark.network def test_prepare_directory_script( config: Config, config_cache_dir: Path, diff --git a/tests/installation/test_executor.py b/tests/installation/test_executor.py index b862d3f5141..e755a03e369 100644 --- a/tests/installation/test_executor.py +++ b/tests/installation/test_executor.py @@ -1263,7 +1263,7 @@ def test_build_backend_errors_are_reported_correctly_if_caused_by_subprocess( - Installing {package_name} ({package_version} {package_url}) - ChefBuildError + IsolatedBuildError hide the original error \ @@ -1409,7 +1409,7 @@ def test_build_system_requires_install_failure( - Installing {package_name} ({package_version} {package_url}) - ChefInstallError + IsolatedBuildInstallError Failed to install poetry-core>=1.1.0a7. \ @@ -1426,6 +1426,7 @@ def test_build_system_requires_install_failure( mocker.stopall() # to get real output output = io.fetch_output().strip() + assert output.startswith(expected_start) assert output.endswith(expected_end) @@ -1546,11 +1547,6 @@ def test_executor_known_hashes( io: BufferedIO, fixture_dir: FixtureDirGetter, ) -> None: - # when installing sdist, an isolated build environment is required to extract metadata - # this will install any build system requirements into the environment, to avoid failures when - # network is not available we enable mock_file_downloads fixture here - # see: https://github.com/python-poetry/poetry/issues/9114 - package_source_url: Path = ( fixture_dir("distributions") / "demo-0.1.0.tar.gz" ).resolve() diff --git a/tests/installation/test_installer.py b/tests/installation/test_installer.py index 0e526b741b2..b90d24b2e78 100644 --- a/tests/installation/test_installer.py +++ b/tests/installation/test_installer.py @@ -1916,7 +1916,11 @@ def test_installer_required_extras_should_not_be_removed_when_updating_single_de executor=Executor(env, pool, config, NullIO()), ) - package.add_dependency(Factory.create_dependency("poetry", {"version": "^0.12.0"})) + package.add_dependency( + Factory.create_dependency( + "with-transitive-extra-dependency", {"version": "^0.12"} + ) + ) installer.update(True) result = installer.run() @@ -1979,7 +1983,7 @@ def test_installer_required_extras_should_be_installed( ) package.add_dependency( Factory.create_dependency( - "cachecontrol", {"version": "^0.12.5", "extras": ["filecache"]} + "with-extra-dependency", {"version": "^0.12", "extras": ["filecache"]} ) ) @@ -2133,7 +2137,7 @@ def test_installer_can_install_dependencies_from_forced_source( def test_run_installs_with_url_file( installer: Installer, locker: Locker, repo: Repository, package: ProjectPackage ) -> None: - url = "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + url = "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" package.add_dependency(Factory.create_dependency("demo", {"url": url})) repo.add_package(get_package("pendulum", "1.4.4")) @@ -2159,9 +2163,9 @@ def test_run_installs_with_same_version_url_files( env_platform: str, ) -> None: urls = { - "linux": "https://python-poetry.org/distributions/demo-0.1.0.tar.gz", + "linux": "https://files.pythonhosted.org/distributions/demo-0.1.0.tar.gz", "win32": ( - "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" ), } for platform, url in urls.items(): @@ -2727,7 +2731,9 @@ def test_explicit_source_dependency_with_direct_origin_dependency( A dependency with explicit source should not be satisfied by a direct origin dependency even if there is a version match. """ - demo_url = "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + demo_url = ( + "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + ) package.add_dependency( Factory.create_dependency( "demo", diff --git a/tests/packages/test_direct_origin.py b/tests/packages/test_direct_origin.py index 55a63946b39..f7263ea0a2a 100644 --- a/tests/packages/test_direct_origin.py +++ b/tests/packages/test_direct_origin.py @@ -26,7 +26,7 @@ def test_direct_origin_get_package_from_file(fixture_dir: FixtureDirGetter) -> N def test_direct_origin_caches_url_dependency(tmp_path: Path) -> None: artifact_cache = ArtifactCache(cache_dir=tmp_path) direct_origin = DirectOrigin(artifact_cache) - url = "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + url = "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" package = direct_origin.get_package_from_url(url) @@ -42,9 +42,9 @@ def test_direct_origin_does_not_download_url_dependency_when_cached( return_value=fixture_dir("distributions") / "demo-0.1.2-py2.py3-none-any.whl" ) direct_origin = DirectOrigin(artifact_cache) - url = "https://python-poetry.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + url = "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" download_file = mocker.patch( - "poetry.packages.direct_origin.download_file", + "poetry.packages.direct_origin.DirectOrigin._download_file", side_effect=Exception("download_file should not be called"), ) diff --git a/tests/packages/test_locker.py b/tests/packages/test_locker.py index d7e2192cb61..dcf1122b190 100644 --- a/tests/packages/test_locker.py +++ b/tests/packages/test_locker.py @@ -777,7 +777,6 @@ def test_root_extras_dependencies_are_ordered( with locker.lock.open(encoding="utf-8") as f: content = f.read() - print(content) assert content == expected @@ -863,7 +862,7 @@ def test_locker_dumps_dependency_information_correctly( ) package_a.add_dependency( Factory.create_dependency( - "E", {"url": "https://python-poetry.org/poetry-1.2.0.tar.gz"} + "E", {"url": "https://files.pythonhosted.org/poetry-1.2.0.tar.gz"} ) ) package_a.add_dependency( @@ -913,7 +912,7 @@ def test_locker_dumps_dependency_information_correctly( B = {{path = "project_with_extras", develop = true}} C = {{path = "directory/project_with_transitive_directory_dependencies"}} D = {{path = "distributions/demo-0.1.0.tar.gz"}} -E = {{url = "https://python-poetry.org/poetry-1.2.0.tar.gz"}} +E = {{url = "https://files.pythonhosted.org/poetry-1.2.0.tar.gz"}} F = {{git = "https://github.com/python-poetry/poetry.git", branch = "foo"}} G = {{git = "https://github.com/python-poetry/poetry.git", subdirectory = "bar"}} H = {{git = "https://github.com/python-poetry/poetry.git", tag = "baz"}} diff --git a/tests/puzzle/test_solver.py b/tests/puzzle/test_solver.py index 7495ad29a1e..b437fc07d71 100644 --- a/tests/puzzle/test_solver.py +++ b/tests/puzzle/test_solver.py @@ -3019,18 +3019,19 @@ def test_solver_can_solve_with_legacy_repository_using_proper_python_compatible_ def test_solver_skips_invalid_versions( package: ProjectPackage, io: NullIO, pypi_repository: PyPiRepository ) -> None: - package.python_versions = "^3.7" + package.python_versions = "^3.9" pool = RepositoryPool([pypi_repository]) solver = Solver(package, pool, [], [], io) - package.add_dependency(Factory.create_dependency("trackpy", "^0.4")) + package.add_dependency(Factory.create_dependency("six-unknown-version", "^1.11")) transaction = solver.solve() check_solver_result( - transaction, [{"job": "install", "package": get_package("trackpy", "0.4.1")}] + transaction, + [{"job": "install", "package": get_package("six-unknown-version", "1.11.0")}], ) @@ -3906,7 +3907,7 @@ def test_solver_cannot_choose_another_version_for_url_dependencies( http.register_uri( "GET", - "https://foo.bar/demo-0.1.0-py2.py3-none-any.whl", + "https://files.pythonhosted.org/demo-0.1.0-py2.py3-none-any.whl", body=Path(path).read_bytes(), streaming=True, ) @@ -3921,7 +3922,9 @@ def test_solver_cannot_choose_another_version_for_url_dependencies( package.add_dependency( Factory.create_dependency( "demo", - {"url": "https://foo.bar/distributions/demo-0.1.0-py2.py3-none-any.whl"}, + { + "url": "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl" + }, ) ) package.add_dependency(Factory.create_dependency("foo", "^1.2.3")) @@ -3947,7 +3950,7 @@ def test_solver_cannot_choose_url_dependency_for_explicit_source( "demo", { "markers": "sys_platform != 'darwin'", - "url": "https://foo.bar/distributions/demo-0.1.0-py2.py3-none-any.whl", + "url": "https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl", }, ) ) @@ -3968,7 +3971,7 @@ def test_solver_cannot_choose_url_dependency_for_explicit_source( "demo", "0.1.0", source_type="url", - source_url="https://foo.bar/distributions/demo-0.1.0-py2.py3-none-any.whl", + source_url="https://files.pythonhosted.org/distributions/demo-0.1.0-py2.py3-none-any.whl", ) # The url demo dependency depends on pendulum. repo.add_package(package_pendulum) diff --git a/tests/repositories/fixtures/distribution_hashes.py b/tests/repositories/fixtures/distribution_hashes.py index 6c20ed308bf..64c85b37319 100644 --- a/tests/repositories/fixtures/distribution_hashes.py +++ b/tests/repositories/fixtures/distribution_hashes.py @@ -99,6 +99,10 @@ class DistributionHash: "7592aa158137726d9579e5d4347bd03a88f9fc82e11061303215feaaf000d32c", "434114a36f986671d132033e130f26b7", ), + "demo_metadata_version_unknown-0.1.0-py2.py3-none-any.whl": DistributionHash( + "d716cd66546468ec3d4d40f4a4ecc813e3e4c661e155ecbc3a932f47d46d6e05", + "749f823ff755a2f46bfb5ab25fdf9810", + ), "demo_missing_dist_info-0.1.0-py2.py3-none-any.whl": DistributionHash( "cf8eaade81dd1db42f60c0e9c8610c1c12006baa9f7ad994b1c2bae92ea4b426", "da33c6088e72fbaaf873999606767353", @@ -123,6 +127,10 @@ class DistributionHash: "baf0d469c9e541b747986b7404cd63a5496955bd0c43a3cc068c449b09b7d4a4", "40eb168dab84e606df3fdb7e67fe27b7", ), + "hbmqtt-0.9.6.tar.gz": DistributionHash( + "379f1d9044997c69308ac2e01621c817b5394e1fbe0696e62538ae2dd0aa7e07", + "b284e3118882f169aa618a856cd91c5f", + ), "ipython-5.7.0-py2-none-any.whl": DistributionHash( "3d93d3995e2e52a98dc4f44361cd5bf68dbde62925d1f820b97d8f0e1d941f73", "cf35939995e0fd8c44fca7509308abde", diff --git a/tests/repositories/fixtures/installed/lib/python3.7/site-packages/url_pep_610-1.2.3.dist-info/direct_url.json b/tests/repositories/fixtures/installed/lib/python3.7/site-packages/url_pep_610-1.2.3.dist-info/direct_url.json index b36e4055294..333fec8116d 100644 --- a/tests/repositories/fixtures/installed/lib/python3.7/site-packages/url_pep_610-1.2.3.dist-info/direct_url.json +++ b/tests/repositories/fixtures/installed/lib/python3.7/site-packages/url_pep_610-1.2.3.dist-info/direct_url.json @@ -1,4 +1,4 @@ { - "url": "https://python-poetry.org/distributions/url-pep-610-1.2.3.tar.gz", + "url": "https://mock.pythonhosted.org/distributions/url-pep-610-1.2.3.tar.gz", "archive_info": {} } diff --git a/tests/repositories/fixtures/legacy.py b/tests/repositories/fixtures/legacy.py index 58f431b0268..57c06aee1cb 100644 --- a/tests/repositories/fixtures/legacy.py +++ b/tests/repositories/fixtures/legacy.py @@ -22,7 +22,7 @@ from packaging.utils import NormalizedName from pytest_mock import MockerFixture - from poetry.repositories.link_sources.html import SimpleRepositoryPage + from poetry.repositories.link_sources.html import HTMLPage from tests.types import HTTPrettyRequestCallback from tests.types import NormalizedNameTransformer from tests.types import SpecializedLegacyRepositoryMocker @@ -129,7 +129,7 @@ def mock( ) original_get_page = specialized_repository._get_page - def _mocked_get_page(name: NormalizedName) -> SimpleRepositoryPage: + def _mocked_get_page(name: NormalizedName) -> HTMLPage: return original_get_page( canonicalize_name(f"{name}{transformer_or_suffix}") if isinstance(transformer_or_suffix, str) diff --git a/tests/repositories/fixtures/pypi.org/dists/poetry_test_py2_py3_metadata_merge-0.1.0-py2-none-any.whl b/tests/repositories/fixtures/pypi.org/dists/mocked/poetry_test_py2_py3_metadata_merge-0.1.0-py2-none-any.whl similarity index 100% rename from tests/repositories/fixtures/pypi.org/dists/poetry_test_py2_py3_metadata_merge-0.1.0-py2-none-any.whl rename to tests/repositories/fixtures/pypi.org/dists/mocked/poetry_test_py2_py3_metadata_merge-0.1.0-py2-none-any.whl diff --git a/tests/repositories/fixtures/pypi.org/dists/poetry_test_py2_py3_metadata_merge-0.1.0-py3-none-any.whl b/tests/repositories/fixtures/pypi.org/dists/mocked/poetry_test_py2_py3_metadata_merge-0.1.0-py3-none-any.whl similarity index 100% rename from tests/repositories/fixtures/pypi.org/dists/poetry_test_py2_py3_metadata_merge-0.1.0-py3-none-any.whl rename to tests/repositories/fixtures/pypi.org/dists/mocked/poetry_test_py2_py3_metadata_merge-0.1.0-py3-none-any.whl diff --git a/tests/repositories/fixtures/pypi.org/dists/mocked/six_unknown_version-1.11.0.tar.gz b/tests/repositories/fixtures/pypi.org/dists/mocked/six_unknown_version-1.11.0.tar.gz new file mode 100644 index 00000000000..5896ba07911 Binary files /dev/null and b/tests/repositories/fixtures/pypi.org/dists/mocked/six_unknown_version-1.11.0.tar.gz differ diff --git a/tests/repositories/fixtures/pypi.org/generate.py b/tests/repositories/fixtures/pypi.org/generate.py index caefbe72b9e..6ce6c72c1e3 100644 --- a/tests/repositories/fixtures/pypi.org/generate.py +++ b/tests/repositories/fixtures/pypi.org/generate.py @@ -4,7 +4,7 @@ 1. Fetch relevant project json file from https://pypi.org/simple/. 2. Fetch relevant release json file from https://pypi.org/pypi///json. -3. Download all files (if not otherwise specified) for each release. +3. Download all files (if not otherwise specified) for each release, including .metadata files. 4. Stub (zero-out) all files not relevant for test cases, only sdist and bdist metadata is retained. a, We also retain `__init__.py` files as some packages use it for dynamic version detection when building sdist. b. Some release bdist, notably that of setuptools, wheel and poetry-core are retained as is in the `dist/` directory @@ -42,7 +42,6 @@ import tarfile import zipfile -from abc import abstractmethod from functools import cached_property from gzip import GzipFile from pathlib import Path @@ -51,6 +50,7 @@ from typing import Callable from typing import Iterator +from packaging.metadata import parse_email from poetry.core.masonry.builders.sdist import SdistBuilder from poetry.core.packages.package import Package from tests.helpers import FIXTURE_PATH @@ -64,8 +64,12 @@ if TYPE_CHECKING: + import requests + from poetry.core.packages.utils.link import Link +ENABLE_RELEASE_JSON = True + logger = logging.getLogger("pypi.generator") logger.setLevel(logging.INFO) handler = logging.StreamHandler(sys.stdout) @@ -73,92 +77,14 @@ logger.addHandler(handler) -@dataclasses.dataclass -class ReleaseSpecification: - name: str - version: str - stub: bool = True - is_fake: bool = False - - def __eq__(self, other: object) -> bool: - if isinstance(other, ReleaseSpecification): - return self.name == other.name and self.version == other.version - return False - - -@dataclasses.dataclass -class ProjectSpecification: - name: str - ignore_missing_files: bool = False - - def __eq__(self, other: object) -> bool: - if isinstance(other, ProjectSpecification): - return self.name == other.name - return False - - -PROJECT_SPECS = [ - ProjectSpecification("requests", ignore_missing_files=True), -] - -RELEASE_SPECS = [ - ReleaseSpecification("attrs", "17.4.0"), - ReleaseSpecification("black", "19.10b0"), - ReleaseSpecification("black", "21.11b0"), - ReleaseSpecification("cachecontrol", "0.12.5", is_fake=True), - ReleaseSpecification("cleo", "1.0.0a5"), - ReleaseSpecification("clikit", "0.2.4"), - # tests.installation.test_installer.test_installer_with_pypi_repository on windows - ReleaseSpecification("colorama", "0.3.9"), - ReleaseSpecification("discord-py", "2.0.0"), - ReleaseSpecification("funcsigs", "1.0.2", is_fake=True), - ReleaseSpecification("futures", "3.2.0"), - ReleaseSpecification("hbmqtt", "0.9.6", is_fake=True), - ReleaseSpecification("importlib-metadata", "1.7.0", is_fake=True), - ReleaseSpecification("ipython", "4.1.0rc1", is_fake=True), - # tests.repositories.test_legacy_repository.test_get_package_from_both_py2_and_py3_specific_wheels - # tests.repositories.test_legacy_repository.test_get_package_retrieves_non_sha256_hashes_mismatching_known_hash - ReleaseSpecification("ipython", "5.7.0"), - # tests.repositories.test_legacy_repository.test_get_package_retrieves_non_sha256_hashes - # tests.repositories.test_legacy_repository.test_get_package_with_dist_and_universal_py3_wheel - ReleaseSpecification("ipython", "7.5.0"), - ReleaseSpecification("isort", "4.3.4"), - ReleaseSpecification("isort-metadata", "4.3.4", is_fake=True), - ReleaseSpecification("jupyter", "1.0.0"), - ReleaseSpecification("lockfile", "0.12.2", is_fake=True), - ReleaseSpecification("more-itertools", "4.1.0"), - ReleaseSpecification("pastel", "0.1.0"), - ReleaseSpecification("pluggy", "0.6.0"), - ReleaseSpecification("poetry", "0.12.4", is_fake=True), - ReleaseSpecification("poetry-core", "1.5.0", stub=False), - ReleaseSpecification("py", "1.5.3"), - ReleaseSpecification("pygame-music-grid", "3.13", is_fake=True), - ReleaseSpecification("pylev", "1.3.0", is_fake=True), - ReleaseSpecification("pytest", "3.5.0"), - ReleaseSpecification("pytest", "3.5.1"), - # tests.repositories.test_legacy_repository.test_get_package_information_skips_dependencies_with_invalid_constraints - ReleaseSpecification("python-language-server", "0.21.2"), - ReleaseSpecification("pyyaml", "3.13.0", is_fake=True), - ReleaseSpecification("requests", "2.18.4"), - ReleaseSpecification("setuptools", "39.2.0", is_fake=True), - ReleaseSpecification("setuptools", "67.6.1", stub=False), - ReleaseSpecification("six", "1.11.0"), - ReleaseSpecification("sqlalchemy", "1.2.12"), - ReleaseSpecification("toga", "0.3.0", is_fake=True), - ReleaseSpecification("tomlkit", "0.5.2"), - ReleaseSpecification("tomlkit", "0.5.3"), - ReleaseSpecification("trackpy", "0.4.1", is_fake=True), - ReleaseSpecification("twisted", "18.9.0"), - ReleaseSpecification("wheel", "0.40.0", stub=False), - ReleaseSpecification("zipp", "3.5.0"), -] - - @dataclasses.dataclass(frozen=True) class _ReleaseFileLocations: dist: Path = dataclasses.field( default=FIXTURE_PATH_REPOSITORIES_PYPI.joinpath("dist") ) + mocked: Path = dataclasses.field( + default=FIXTURE_PATH_REPOSITORIES_PYPI.joinpath("dist", "mocked") + ) stubbed: Path = dataclasses.field( default=FIXTURE_PATH_REPOSITORIES_PYPI.joinpath("stubbed") ) @@ -196,7 +122,7 @@ def find(self, filename: str) -> ReleaseFileMetadata | None: return ReleaseFileMetadata(location) return None - def list(self, location: Path | None) -> Iterator[ReleaseFileMetadata]: + def list(self, location: Path | None = None) -> Iterator[ReleaseFileMetadata]: locations = [location] if location is not None else self.locations for candidate in locations: for file in candidate.glob("*.tar.*"): @@ -323,175 +249,9 @@ def cleanup_installation_fixtures(metadata: ReleaseFileMetadata) -> None: file.write_text(content, encoding="utf-8") -class MockedRepositoryFactory: - def __init__( - self, - release_specs: list[ReleaseSpecification], - project_specs: list[ProjectSpecification], - pypi: PyPiRepository | None = None, - refresh: bool = False, - ) -> None: - self.pypi = pypi or PyPiRepository(disable_cache=True) - self.packages: dict[str, MockedProject] = {} - self.release_specs = release_specs - self.project_specs = project_specs - self.refresh = refresh - - def process(self) -> None: - for file in FIXTURE_PATH_REPOSITORIES_PYPI.joinpath("stubbed").iterdir(): - if file.is_file(): - file.unlink() - - files = [] - - for dist in self.release_specs: - files.extend(self.add_release_file(dist)) - - for pkg in self.packages.values(): - pkg.write() - - files.extend(RELEASE_FILE_COLLECTION.list(RELEASE_FILE_LOCATIONS.demo)) - generate_distribution_hashes_fixture(files=files) - - @cached_property - def known_releases_by_project(self) -> dict[str, list[str]]: - result: dict[str, list[str]] = {} - - for package in self.packages.values(): - if package.name not in result: - result[package.name] = [] - - for release in package.releases: - result[package.name].append(release.version) - - result[package.name].sort() - - return result - - def clean(self) -> None: - ignore_missing_files = { - project.name - for project in self.project_specs - if project.ignore_missing_files - } - json_fixture_dir = FIXTURE_PATH_REPOSITORIES_PYPI.joinpath("json") - - for file in json_fixture_dir.glob("*.json"): - if file.stem not in self.packages: - logger.info( - "Removing %s", file.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI) - ) - file.unlink() - continue - - package = self.packages[file.stem] - - if package.is_fake: - continue - - existing_content = file.read_text(encoding="utf-8") - data = json.loads(existing_content) - - if "versions" in data: - data["versions"] = self.known_releases_by_project[file.stem] - - if "files" in data and package.name not in ignore_missing_files: - data["files"] = [ - _file - for _file in data["files"] - if RELEASE_FILE_COLLECTION.filename_exists(_file["filename"]) - ] - - content = json.dumps(data, ensure_ascii=False, indent=2) - if existing_content != content: - logger.info( - "Cleaning up %s", file.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI) - ) - file.write_text(content + "\n", encoding="utf-8") - - for file in json_fixture_dir.glob("*/*.json"): - if ( - file.parent.name in self.packages - and self.packages[file.parent.name].is_fake - ): - logger.info( - "Skipping clean up for %s (fake)", - file.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI), - ) - continue - - if ( - file.parent.name not in self.packages - or file.stem not in self.known_releases_by_project[file.parent.stem] - ): - logger.info( - "Removing %s", file.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI) - ) - file.unlink() - - if len(list(file.parent.iterdir())) == 0: - logger.info( - "Removing empty directory %s", - file.parent.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI), - ) - file.parent.rmdir() - - def add_release_file(self, spec: ReleaseSpecification) -> list[ReleaseFileMetadata]: - logger.info("Processing release %s-%s", spec.name, spec.version) - - if spec.name not in self.packages: - prefer_remote = self.refresh and not spec.is_fake - self.packages[spec.name] = MockedProject( - spec.name, - self.get_json_data(spec.name, None, prefer_remote=prefer_remote), - is_fake=spec.is_fake, - ) - - package = self.packages[spec.name] - release = MockedRelease( - spec.name, spec.version, self.get_json_data(spec.name, spec.version) - ) - - links = ( - [] - if spec.is_fake - else self.pypi.find_links_for_package(Package(spec.name, spec.version)) - ) - - for link in links: - logger.info("Processing release file %s", link.filename) - - existing_release_file_location = RELEASE_FILE_LOCATIONS.dist.joinpath( - link.filename - ) - if existing_release_file_location.exists(): - logger.info( - "Release file already exists at %s, skipping", - existing_release_file_location.relative_to( - FIXTURE_PATH_REPOSITORIES_PYPI - ), - ) - # we do not re-download or stub this - existing_file = RELEASE_FILE_COLLECTION.find(link.filename) - assert existing_file is not None - release.files.append(existing_file) - - continue - - if not spec.stub and link.is_wheel: - file = self.copy_as_is(link) - elif link.is_wheel or (link.is_sdist and link.filename.endswith(".zip")): - file = self.process_zipfile(link) - else: - file = self.process_tarfile(link) - - release.add_file(file) - - if not spec.is_fake: - release.write() - - package.add_release(release) - return release.files +class FileManager: + def __init__(self, pypi: PyPiRepository) -> None: + self.pypi = pypi @staticmethod def should_preserve_file_content_check(link: Link) -> Callable[[str], bool]: @@ -518,6 +278,30 @@ def bdist_check(filename: str) -> bool: return bdist_check + def process_metadata_file(self, link: Link) -> None: + # we enforce the availability of the metadata file + link._metadata = True + + logger.info("Processing metadata file for %s", link.filename) + + assert link.metadata_url is not None + response: requests.Response = self.pypi.session.get( + link.metadata_url, raise_for_status=False + ) + + if response.status_code != 200: + logger.info("Skipping metadata for %s", link.filename) + return None + + metadata, _ = parse_email(response.content) + content = response.content.decode(encoding="utf-8").replace( + metadata["description"], "" + ) + + FIXTURE_PATH_REPOSITORIES_PYPI.joinpath( + "metadata", f"{link.filename}.metadata" + ).write_text(content, encoding="utf-8") + def copy_as_is(self, link: Link) -> ReleaseFileMetadata: dst = FIXTURE_PATH_REPOSITORIES_PYPI / "dists" / link.filename logger.info( @@ -588,135 +372,348 @@ def process_tarfile(self, link: Link) -> ReleaseFileMetadata: return ReleaseFileMetadata(dst) - def get_json_data( - self, name: str, version: str | None, prefer_remote: bool = False - ) -> dict[str, Any]: - json_fixture_dir = FIXTURE_PATH_REPOSITORIES_PYPI / "json" - if version is None: - path = json_fixture_dir / f"{name}.json" - else: - path = json_fixture_dir / name / f"{version}.json" +class Project: + def __init__(self, name: str, releases: list[Release]): + self.name = name + self.releases: list[Release] = releases - data: dict[str, Any] = {} + @property + def filenames(self) -> list[str]: + filenames = [] - if path.exists(): - data = json.loads(path.read_text()) + for release in self.releases: + filenames.extend(release.filenames) - if prefer_remote and (remote_data := self._get_remote_json_data(name, version)): - return remote_data + return filenames - logger.info( - "Loading existing json fixture at %s", - path.relative_to(json_fixture_dir), - ) - return data + @property + def files(self) -> list[ReleaseFileMetadata]: + files = [] + + for release in self.releases: + files.extend(release.files) + + return files - def _get_remote_json_data( - self, name: str, version: str | None = None + @property + def versions(self) -> list[str]: + return [release.version for release in self.releases] + + @cached_property + def json_path(self) -> Path: + return FIXTURE_PATH_REPOSITORIES_PYPI.joinpath("json", f"{self.name}.json") + + @staticmethod + def _finalise_file_item( + data: dict[str, Any], files: list[ReleaseFileMetadata] | None = None ) -> dict[str, Any]: - if version is None: - logger.info("Fetching remote json via https://pypi.org/simple/%s", name) - response = self.pypi._get( - f"simple/{name}/", - headers={"Accept": "application/vnd.pypi.simple.v1+json"}, - ) - else: - logger.info( - "Fetching remote json via https://pypi.org/pypi/%s/%s/json", - name, - version, - ) + filename = data["filename"] - response = self.pypi._get(f"pypi/{name}/{version}/json") + for file in files or []: + if file.path.name == filename: + data["hashes"] = {"md5": file.md5, "sha256": file.sha256} + break - return response or {} + metadata_file = ( + FIXTURE_PATH_REPOSITORIES_PYPI / "metadata" / f"{filename}.metadata" + ) + if metadata_file.exists(): + metadata = ReleaseFileMetadata(metadata_file) + for key in ["core-metadata", "data-dist-info-metadata"]: + data[key] = {"sha256": metadata.sha256} -class MockedJsonFile: - def __init__(self, data: dict[str, Any]) -> None: - self.data = data - self._content = json.dumps(data, ensure_ascii=False, indent=2) + return data - @property - @abstractmethod - def json_filepath(self) -> Path: ... + def _finalise(self, data: dict[str, Any]) -> None: + files = self.files - def write(self) -> None: - self.data.get("info", {"description": ""})["description"] = "" + data["versions"] = self.versions - if "vulnerabilities" in self.data: - self.data["vulnerabilities"] = [] + data["files"] = [ + self._finalise_file_item(_file, files) + for _file in data["files"] + if _file["filename"] in self.filenames + ] - content = json.dumps(self.data, ensure_ascii=False, indent=2) + data["meta"]["_last-serial"] = 0 - if not self.json_filepath.exists() or self._content != content: - logger.info("Writing json content to %s", self.json_filepath) - self.json_filepath.parent.mkdir(exist_ok=True) - self.json_filepath.write_text(content + "\n", encoding="utf-8") - self._content = content + logger.info( + "Finalising up %s", + self.json_path.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI), + ) + self.json_path.write_text( + json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) + + for file in files: + cleanup_installation_fixtures(file) + cleanup_installation_fixtures(file) + + def populate(self, pypi: PyPiRepository) -> None: + logger.info("Fetching remote json via https://pypi.org/simple/%s", self.name) + data = ( + pypi._get( + f"simple/{self.name}/", + headers={"Accept": "application/vnd.pypi.simple.v1+json"}, + ) + or {} + ) + + for release in self.releases: + release.populate(pypi) + self._finalise(data) -class MockedRelease(MockedJsonFile): - def __init__(self, name: str, version: str, data: dict[str, Any]) -> None: + +class Release: + def __init__( + self, + name: str, + version: str, + download_files: bool = True, + stub: bool = True, + preserved_files: list[str] | None = None, + ): self.name = name self.version = version + self.filenames: list[str] = preserved_files or [] + self.download_files: bool = download_files + self.stub: bool = stub self.files: list[ReleaseFileMetadata] = [] - super().__init__(data=data) - @property - def json_filepath(self) -> Path: + @cached_property + def json_path(self) -> Path: return ( FIXTURE_PATH_REPOSITORIES_PYPI / "json" / self.name / f"{self.version}.json" ) - def add_file(self, metadata: ReleaseFileMetadata) -> None: - self.files.append(metadata) + @staticmethod + def _finalise_file_item( + data: dict[str, Any], files: list[ReleaseFileMetadata] | None = None + ) -> dict[str, Any]: + filename = data["filename"] - for item in self.data["urls"]: - if item["filename"] == metadata.path.name: - item["digests"] = {"md5": metadata.md5, "sha256": metadata.sha256} - item["md5_digest"] = metadata.md5 + for file in files or []: + if file.path.name == filename: + data["digests"] = {"md5": file.md5, "sha256": file.sha256} + data["md5_digest"] = file.md5 + break + return data -class MockedProject(MockedJsonFile): - def __init__(self, name: str, data: dict[str, Any], is_fake: bool = False) -> None: - self.name = name - self.releases: list[MockedRelease] = [] - self.is_fake: bool = is_fake - super().__init__(data=data) + def _finalise(self, data: dict[str, Any]) -> None: + data.get("info", {"description": ""})["description"] = "" - @property - def json_filepath(self) -> Path: - return FIXTURE_PATH_REPOSITORIES_PYPI / "json" / f"{self.name}.json" + if "vulnerabilities" in data: + data["vulnerabilities"] = [] - def add_release(self, release: MockedRelease) -> None: - self.releases.append(release) + data["urls"] = [ + self._finalise_file_item(item, self.files) + for item in data["urls"] + if item["filename"] in self.filenames + ] - if self.is_fake: - return + for item in data["urls"]: + self._finalise_file_item(item, self.files) - for file in release.files: - for item in self.data.get("files", []): - if item["filename"] == file.path.name: - item["hashes"] = {"md5": file.md5, "sha256": file.sha256} + data["last_serial"] = 0 - cleanup_legacy_html_hashes(file) - cleanup_installation_fixtures(file) + logger.info( + "Finalising up %s", + self.json_path.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI), + ) - def __eq__(self, other: object) -> bool: - if isinstance(other, MockedProject): - return self.name == other.name + if not self.json_path.parent.exists(): + self.json_path.parent.mkdir(parents=True, exist_ok=True) - if isinstance(other, str): - return self.name == other + self.json_path.write_text( + json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) - return False + def populate(self, pypi: PyPiRepository) -> None: + fm = FileManager(pypi) + links = pypi.find_links_for_package(Package(self.name, self.version)) -if __name__ == "__main__": - factory = MockedRepositoryFactory( - RELEASE_SPECS, PROJECT_SPECS, PyPiRepository(disable_cache=True), refresh=False + for link in links: + self.filenames.append(link.filename) + + fm.process_metadata_file(link) + + if self.download_files: + if not self.stub and link.is_wheel: + file = fm.copy_as_is(link) + elif link.is_wheel or ( + link.is_sdist and link.filename.endswith(".zip") + ): + file = fm.process_zipfile(link) + else: + file = fm.process_tarfile(link) + + self.files.append(file) + + if ENABLE_RELEASE_JSON: + logger.info( + "Fetching remote json via https://pypi.org/pypi/%s/%s/json", + self.name, + self.version, + ) + data = pypi._get(f"pypi/{self.name}/{self.version}/json") or {} + self._finalise(data) + + +def cleanup_old_files(releases: dict[str, list[str]]) -> None: + json_fixture_path = FIXTURE_PATH_REPOSITORIES_PYPI / "json" + + for json_file in json_fixture_path.glob("*.json"): + if json_file.stem not in releases and json_file.stem not in {"isort-metadata"}: + json_file.unlink() + + for json_file in json_fixture_path.glob("*/*.json"): + if json_file.parent.name == "mocked": + continue + + if ( + json_file.parent.name not in releases + or json_file.stem not in releases[json_file.parent.name] + ): + logger.info( + "Removing unmanaged release file %s", + json_file.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI), + ) + json_file.unlink() + + if len(list(json_file.parent.iterdir())) == 0: + logger.info( + "Removing empty directory %s", + json_file.parent.relative_to(FIXTURE_PATH_REPOSITORIES_PYPI), + ) + json_file.parent.rmdir() + + +PROJECTS = [ + Project("attrs", releases=[Release("attrs", "17.4.0")]), + Project( + "black", releases=[Release("black", "19.10b0"), Release("black", "21.11b0")] + ), + Project("cleo", releases=[Release("cleo", "1.0.0a5")]), + Project("clikit", releases=[Release("clikit", "0.2.4")]), + # tests.installation.test_installer.test_installer_with_pypi_repository on windows + Project("colorama", releases=[Release("colorama", "0.3.9")]), + Project("discord-py", releases=[Release("discord-py", "2.0.0")]), + Project("funcsigs", releases=[Release("funcsigs", "1.0.2", download_files=False)]), + Project("filecache", releases=[Release("filecache", "0.81", download_files=False)]), + Project("futures", releases=[Release("futures", "3.2.0")]), + # tests.repositories.test_pypi_repository.test_get_release_info_includes_only_supported_types + Project( + "hbmqtt", + releases=[ + Release( + "hbmqtt", + "0.9.6", + preserved_files=[ + "hbmqtt-0.9.6.linux-x86_64.tar.gz", + "hbmqtt-0.9.6-py3.8.egg", + ], + ) + ], + ), + Project( + "importlib-metadata", + releases=[Release("importlib-metadata", "1.7.0", download_files=False)], + ), + Project( + "ipython", + releases=[ + Release("ipython", "4.1.0rc1", download_files=False), + # tests.repositories.test_legacy_repository.test_get_package_from_both_py2_and_py3_specific_wheels + # tests.repositories.test_legacy_repository.test_get_package_retrieves_non_sha256_hashes_mismatching_known_hash + Release("ipython", "5.7.0"), + # tests.repositories.test_legacy_repository.test_get_package_retrieves_non_sha256_hashes + # tests.repositories.test_legacy_repository.test_get_package_with_dist_and_universal_py3_wheel + Release("ipython", "7.5.0"), + ], + ), + Project("isort", releases=[Release("isort", "4.3.4")]), + Project("jupyter", releases=[Release("jupyter", "1.0.0")]), + Project("more-itertools", releases=[Release("more-itertools", "4.1.0")]), + Project("pastel", releases=[Release("pastel", "0.1.0")]), + Project("pluggy", releases=[Release("pluggy", "0.6.0")]), + Project("poetry-core", releases=[Release("poetry-core", "1.5.0", stub=False)]), + Project("py", releases=[Release("py", "1.5.3")]), + Project("pylev", releases=[Release("pylev", "1.3.0", download_files=False)]), + Project( + "pytest", releases=[Release("pytest", "3.5.0"), Release("pytest", "3.5.1")] + ), + # tests.repositories.test_legacy_repository.test_get_package_information_skips_dependencies_with_invalid_constraints + Project( + "python-language-server", releases=[Release("python-language-server", "0.21.2")] + ), + Project("pyyaml", releases=[Release("pyyaml", "3.13.0", download_files=False)]), + # tests.repositories.test_pypi_repository.test_find_packages + Project( + "requests", + releases=[ + Release("requests", "2.18.0", download_files=False), + Release("requests", "2.18.1", download_files=False), + Release("requests", "2.18.2", download_files=False), + Release("requests", "2.18.3", download_files=False), + # tests.repositories.test_pypi_repository.test_package + Release("requests", "2.18.4", download_files=True), + Release("requests", "2.19.0", download_files=False), + ], + ), + Project( + "setuptools", + releases=[ + Release("setuptools", "39.2.0", download_files=False), + Release("setuptools", "67.6.1", stub=False), + ], + ), + Project("six", releases=[Release("six", "1.11.0")]), + Project("sqlalchemy", releases=[Release("sqlalchemy", "1.2.12")]), + # tests.repositories.test_pypi_repository.test_find_packages_with_prereleases + Project( + "toga", + releases=[ + Release("toga", "0.3.0", download_files=False), + Release("toga", "0.3.0dev1", download_files=False), + Release("toga", "0.3.0dev2", download_files=False), + Release("toga", "0.4.0", download_files=False), + ], + ), + Project( + "tomlkit", releases=[Release("tomlkit", "0.5.2"), Release("tomlkit", "0.5.3")] + ), + Project("twisted", releases=[Release("twisted", "18.9.0")]), + Project("wheel", releases=[Release("wheel", "0.40.0", stub=False)]), + Project("zipp", releases=[Release("zipp", "3.5.0")]), +] + + +def main() -> None: + pypi = PyPiRepository(disable_cache=False) + files: list[ReleaseFileMetadata] = [] + releases: dict[str, list[str]] = {} + + for project in PROJECTS: + project = Project(project.name, releases=project.releases) + project.populate(pypi) + + releases[project.name] = project.versions + files.extend(project.files) + + rfc = _ReleaseFileCollection( + [RELEASE_FILE_LOCATIONS.demo, RELEASE_FILE_LOCATIONS.mocked] ) - factory.process() - factory.clean() + files.extend(rfc.list()) + + generate_distribution_hashes_fixture(files) + + cleanup_old_files(releases) + + +if __name__ == "__main__": + main() diff --git a/tests/repositories/fixtures/pypi.org/json/attrs.json b/tests/repositories/fixtures/pypi.org/json/attrs.json index e34e8a1091e..3b0db9b129e 100644 --- a/tests/repositories/fixtures/pypi.org/json/attrs.json +++ b/tests/repositories/fixtures/pypi.org/json/attrs.json @@ -1,25 +1,44 @@ { - "name": "attrs", "files": [ { + "core-metadata": { + "sha256": "a1828f9b7a019e96302759189410f380814be1dd57a201a56c078f9e8e11a2e5" + }, + "data-dist-info-metadata": { + "sha256": "a1828f9b7a019e96302759189410f380814be1dd57a201a56c078f9e8e11a2e5" + }, "filename": "attrs-17.4.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/b5/60/4e178c1e790fd60f1229a9b3cb2f8bc2f4cc6ff2c8838054c142c70b5adc/attrs-17.4.0-py2.py3-none-any.whl", "hashes": { "md5": "9d32f2b5a93343e01f54d87740f2da60", "sha256": "d38e57f381e891928357c68e300d28d3d4dcddc50486d5f8dfaf743d40477619" - } + }, + "requires-python": null, + "size": 31658, + "upload-time": "2017-12-30T08:20:05.582456Z", + "url": "https://files.pythonhosted.org/packages/b5/60/4e178c1e790fd60f1229a9b3cb2f8bc2f4cc6ff2c8838054c142c70b5adc/attrs-17.4.0-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "attrs-17.4.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/8b/0b/a06cfcb69d0cb004fde8bc6f0fd192d96d565d1b8aa2829f0f20adb796e5/attrs-17.4.0.tar.gz", "hashes": { "md5": "c03e5b3608d9071fbd098850d8922668", "sha256": "eb7536a1e6928190b3008c5b350bdf9850d619fff212341cd096f87a27a5e564" - } + }, + "requires-python": null, + "size": 97071, + "upload-time": "2017-12-30T08:20:08.575620Z", + "url": "https://files.pythonhosted.org/packages/8b/0b/a06cfcb69d0cb004fde8bc6f0fd192d96d565d1b8aa2829f0f20adb796e5/attrs-17.4.0.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3451237 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "attrs", + "versions": [ + "17.4.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/attrs/17.4.0.json b/tests/repositories/fixtures/pypi.org/json/attrs/17.4.0.json index f5f127c8a1e..2c14a6199a1 100644 --- a/tests/repositories/fixtures/pypi.org/json/attrs/17.4.0.json +++ b/tests/repositories/fixtures/pypi.org/json/attrs/17.4.0.json @@ -21,6 +21,7 @@ "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "", + "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { @@ -28,6 +29,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://www.attrs.org/", "keywords": "class,attribute,boilerplate", "license": "MIT", @@ -37,6 +39,10 @@ "package_url": "https://pypi.org/project/attrs/", "platform": "", "project_url": "https://pypi.org/project/attrs/", + "project_urls": { + "Homepage": "http://www.attrs.org/" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/attrs/17.4.0/", "requires_dist": [ "coverage; extra == 'dev'", @@ -58,9 +64,11 @@ ], "requires_python": "", "summary": "Classes Without Boilerplate", - "version": "17.4.0" + "version": "17.4.0", + "yanked": false, + "yanked_reason": null }, - "last_serial": 3451237, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -70,13 +78,17 @@ }, "downloads": -1, "filename": "attrs-17.4.0-py2.py3-none-any.whl", - "has_sig": true, + "has_sig": false, "md5_digest": "9d32f2b5a93343e01f54d87740f2da60", "packagetype": "bdist_wheel", "python_version": "py2.py3", + "requires_python": null, "size": 31658, "upload_time": "2017-12-30T08:20:05", - "url": "https://files.pythonhosted.org/packages/b5/60/4e178c1e790fd60f1229a9b3cb2f8bc2f4cc6ff2c8838054c142c70b5adc/attrs-17.4.0-py2.py3-none-any.whl" + "upload_time_iso_8601": "2017-12-30T08:20:05.582456Z", + "url": "https://files.pythonhosted.org/packages/b5/60/4e178c1e790fd60f1229a9b3cb2f8bc2f4cc6ff2c8838054c142c70b5adc/attrs-17.4.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", @@ -86,13 +98,18 @@ }, "downloads": -1, "filename": "attrs-17.4.0.tar.gz", - "has_sig": true, + "has_sig": false, "md5_digest": "c03e5b3608d9071fbd098850d8922668", "packagetype": "sdist", "python_version": "source", + "requires_python": null, "size": 97071, "upload_time": "2017-12-30T08:20:08", - "url": "https://files.pythonhosted.org/packages/8b/0b/a06cfcb69d0cb004fde8bc6f0fd192d96d565d1b8aa2829f0f20adb796e5/attrs-17.4.0.tar.gz" + "upload_time_iso_8601": "2017-12-30T08:20:08.575620Z", + "url": "https://files.pythonhosted.org/packages/8b/0b/a06cfcb69d0cb004fde8bc6f0fd192d96d565d1b8aa2829f0f20adb796e5/attrs-17.4.0.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/black.json b/tests/repositories/fixtures/pypi.org/json/black.json index 1b597a5da0b..dd8177597f4 100644 --- a/tests/repositories/fixtures/pypi.org/json/black.json +++ b/tests/repositories/fixtures/pypi.org/json/black.json @@ -1,49 +1,77 @@ { "files": [ { + "core-metadata": { + "sha256": "256c27c1f5cc5c7bad6049ff2c339ac9419f5fc00eddbb895cf4780d7b6752b3" + }, + "data-dist-info-metadata": { + "sha256": "256c27c1f5cc5c7bad6049ff2c339ac9419f5fc00eddbb895cf4780d7b6752b3" + }, "filename": "black-19.10b0-py36-none-any.whl", "hashes": { "md5": "4a420234749e1ea350581160ef51cd02", "sha256": "3471ff321348d851b6f3047f4ed42c88622ac038caf7c2d160bd653334c88e88" }, "requires-python": ">=3.6", + "size": 97525, + "upload-time": "2019-10-28T23:53:54.000711Z", "url": "https://files.pythonhosted.org/packages/fd/bb/ad34bbc93d1bea3de086d7c59e528d4a503ac8fe318bd1fa48605584c3d2/black-19.10b0-py36-none-any.whl", "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "black-19.10b0.tar.gz", "hashes": { "md5": "c383543109a66a5a99113e6326db5251", "sha256": "6cada614d5d2132698c6d5fff384657273d922c4fffa6a2f0de9e03e25b8913a" }, "requires-python": ">=3.6", + "size": 1019740, + "upload-time": "2019-10-28T23:54:05.455213Z", "url": "https://files.pythonhosted.org/packages/b0/dc/ecd83b973fb7b82c34d828aad621a6e5865764d52375b8ac1d7a45e23c8d/black-19.10b0.tar.gz", "yanked": false }, { + "core-metadata": { + "sha256": "6b5b5209d6862dde7399150665655faa4526565c775f125ad004746fe96d4d4c" + }, + "data-dist-info-metadata": { + "sha256": "6b5b5209d6862dde7399150665655faa4526565c775f125ad004746fe96d4d4c" + }, "filename": "black-21.11b0-py3-none-any.whl", "hashes": { "md5": "294e105f34e2e21286a49bfcfb8fb6ae", "sha256": "e16b6879ed61f9268994b879174fad1cb2319a651afd20f8cf036428ac65f846" }, "requires-python": ">=3.6.2", + "size": 155131, + "upload-time": "2021-11-17T02:32:14.551680Z", "url": "https://files.pythonhosted.org/packages/3d/ad/1cf514e7f9ee4c3d8df7c839d7977f7605ad76557f3fca741ec67f76dba6/black-21.11b0-py3-none-any.whl", "yanked": "Broken regex dependency. Use 21.11b1 instead." }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "black-21.11b0.tar.gz", "hashes": { "md5": "f01267bf2613f825dd6684629c1c829e", "sha256": "f23c482185d842e2f19d506e55c004061167e3c677c063ecd721042c62086ada" }, "requires-python": ">=3.6.2", + "size": 593164, + "upload-time": "2021-11-17T02:32:16.396821Z", "url": "https://files.pythonhosted.org/packages/2f/db/03e8cef689ab0ff857576ee2ee288d1ff2110ef7f3a77cac62e61f18acaf/black-21.11b0.tar.gz", "yanked": "Broken regex dependency. Use 21.11b1 instead." } ], "meta": { - "_last-serial": 14955312, - "api-version": "1.0" + "_last-serial": 0, + "api-version": "1.1" }, - "name": "black" + "name": "black", + "versions": [ + "19.10b0", + "21.11b0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/black/19.10b0.json b/tests/repositories/fixtures/pypi.org/json/black/19.10b0.json index 8a174321690..8e541951614 100644 --- a/tests/repositories/fixtures/pypi.org/json/black/19.10b0.json +++ b/tests/repositories/fixtures/pypi.org/json/black/19.10b0.json @@ -26,6 +26,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/psf/black", "keywords": "automation formatter yapf autopep8 pyfmt gofmt rustfmt", "license": "MIT", @@ -38,6 +39,7 @@ "project_urls": { "Homepage": "https://github.com/psf/black" }, + "provides_extra": null, "release_url": "https://pypi.org/project/black/19.10b0/", "requires_dist": [ "click (>=6.5)", @@ -56,7 +58,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 14955312, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -66,7 +68,7 @@ }, "downloads": -1, "filename": "black-19.10b0-py36-none-any.whl", - "has_sig": true, + "has_sig": false, "md5_digest": "4a420234749e1ea350581160ef51cd02", "packagetype": "bdist_wheel", "python_version": "py36", @@ -86,7 +88,7 @@ }, "downloads": -1, "filename": "black-19.10b0.tar.gz", - "has_sig": true, + "has_sig": false, "md5_digest": "c383543109a66a5a99113e6326db5251", "packagetype": "sdist", "python_version": "source", diff --git a/tests/repositories/fixtures/pypi.org/json/black/21.11b0.json b/tests/repositories/fixtures/pypi.org/json/black/21.11b0.json index a9bd489ecfc..d840c510821 100644 --- a/tests/repositories/fixtures/pypi.org/json/black/21.11b0.json +++ b/tests/repositories/fixtures/pypi.org/json/black/21.11b0.json @@ -10,10 +10,12 @@ "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 :: Only", + "Programming Language :: Python :: 3.9", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Quality Assurance" ], @@ -26,6 +28,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/psf/black", "keywords": "automation formatter yapf autopep8 pyfmt gofmt rustfmt", "license": "MIT", @@ -39,6 +42,7 @@ "Changelog": "https://github.com/psf/black/blob/main/CHANGES.md", "Homepage": "https://github.com/psf/black" }, + "provides_extra": null, "release_url": "https://pypi.org/project/black/21.11b0/", "requires_dist": [ "click (>=7.1.2)", @@ -64,51 +68,7 @@ "yanked": true, "yanked_reason": "Broken regex dependency. Use 21.11b1 instead." }, - "last_serial": 13326107, - "releases": { - "21.11b0": [ - { - "comment_text": "", - "digests": { - "md5": "945da11b34c11738560fc6698cffa425", - "sha256": "0b1f66cbfadcd332ceeaeecf6373d9991d451868d2e2219ad0ac1213fb701117" - }, - "downloads": -1, - "filename": "black-21.11b0-py3-none-any.whl", - "has_sig": false, - "md5_digest": "945da11b34c11738560fc6698cffa425", - "packagetype": "bdist_wheel", - "python_version": "py3", - "requires_python": ">=3.6.2", - "size": 155131, - "upload_time": "2021-11-17T02:32:14", - "upload_time_iso_8601": "2021-11-17T02:32:14.551680Z", - "url": "https://files.pythonhosted.org/packages/3d/ad/1cf514e7f9ee4c3d8df7c839d7977f7605ad76557f3fca741ec67f76dba6/black-21.11b0-py3-none-any.whl", - "yanked": true, - "yanked_reason": "Broken regex dependency. Use 21.11b1 instead." - }, - { - "comment_text": "", - "digests": { - "md5": "6040b4e4c6ccc4e7eb81bb2634ef299a", - "sha256": "83f3852301c8dcb229e9c444dd79f573c8d31c7c2dad9bbaaa94c808630e32aa" - }, - "downloads": -1, - "filename": "black-21.11b0.tar.gz", - "has_sig": false, - "md5_digest": "6040b4e4c6ccc4e7eb81bb2634ef299a", - "packagetype": "sdist", - "python_version": "source", - "requires_python": ">=3.6.2", - "size": 593164, - "upload_time": "2021-11-17T02:32:16", - "upload_time_iso_8601": "2021-11-17T02:32:16.396821Z", - "url": "https://files.pythonhosted.org/packages/2f/db/03e8cef689ab0ff857576ee2ee288d1ff2110ef7f3a77cac62e61f18acaf/black-21.11b0.tar.gz", - "yanked": true, - "yanked_reason": "Broken regex dependency. Use 21.11b1 instead." - } - ] - }, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/cachecontrol.json b/tests/repositories/fixtures/pypi.org/json/cachecontrol.json deleted file mode 100644 index 2220d763339..00000000000 --- a/tests/repositories/fixtures/pypi.org/json/cachecontrol.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "CacheControl", - "files": [ - { - "filename": "CacheControl-0.12.5.tar.gz", - "url": "https://files.pythonhosted.org/packages/5e/f0/2c193ed1f17c97ae539da7e1c2d48b80d8cccb1917163b26a91ca4355aa6/CacheControl-0.12.5.tar.gz", - "hashes": { - "md5": "b9499189d24a2695f6ceb879b0764417", - "sha256": "963350642919d6d747288db041fe68a8dabb1aa3d3cef3587dbf2ec092592049" - }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - } - ], - "meta": { - "api-version": "1.0", - "_last-serial": 3939938 - } -} diff --git a/tests/repositories/fixtures/pypi.org/json/cachecontrol/0.12.5.json b/tests/repositories/fixtures/pypi.org/json/cachecontrol/0.12.5.json deleted file mode 100644 index 6f218ee4d93..00000000000 --- a/tests/repositories/fixtures/pypi.org/json/cachecontrol/0.12.5.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "info": { - "author": "Eric Larson", - "author_email": "eric@ionrock.org", - "bugtrack_url": null, - "classifiers": [ - "Development Status :: 4 - Beta", - "Environment :: Web Environment", - "License :: OSI Approved :: Apache Software License", - "Operating System :: OS Independent", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - "Topic :: Internet :: WWW/HTTP" - ], - "description": "", - "description_content_type": "", - "docs_url": null, - "download_url": "", - "downloads": { - "last_day": -1, - "last_month": -1, - "last_week": -1 - }, - "home_page": "https://github.com/ionrock/cachecontrol", - "keywords": "requests http caching web", - "license": "", - "maintainer": "", - "maintainer_email": "", - "name": "CacheControl", - "package_url": "https://pypi.org/project/CacheControl/", - "platform": "", - "project_url": "https://pypi.org/project/CacheControl/", - "project_urls": { - "Homepage": "https://github.com/ionrock/cachecontrol" - }, - "release_url": "https://pypi.org/project/CacheControl/0.12.5/", - "requires_dist": [ - "lockfile; extra == \"filecache\"" - ], - "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", - "summary": "httplib2 caching for requests", - "version": "0.12.5" - }, - "last_serial": 3939938, - "urls": [ - { - "comment_text": "", - "digests": { - "md5": "b9499189d24a2695f6ceb879b0764417", - "sha256": "963350642919d6d747288db041fe68a8dabb1aa3d3cef3587dbf2ec092592049" - }, - "downloads": -1, - "filename": "CacheControl-0.12.5.tar.gz", - "has_sig": false, - "md5_digest": "b9499189d24a2695f6ceb879b0764417", - "packagetype": "sdist", - "python_version": "source", - "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", - "size": 14383, - "upload_time": "2018-06-07T14:53:13", - "url": "https://files.pythonhosted.org/packages/5e/f0/2c193ed1f17c97ae539da7e1c2d48b80d8cccb1917163b26a91ca4355aa6/CacheControl-0.12.5.tar.gz" - } - ] -} diff --git a/tests/repositories/fixtures/pypi.org/json/cleo.json b/tests/repositories/fixtures/pypi.org/json/cleo.json index 88543fda1d7..69ae3afc0d8 100644 --- a/tests/repositories/fixtures/pypi.org/json/cleo.json +++ b/tests/repositories/fixtures/pypi.org/json/cleo.json @@ -2,10 +2,10 @@ "files": [ { "core-metadata": { - "sha256": "892426a14eeae04120b2baa0212d7090f3a22e64ffd5d0ad3bc4c515b59a9c89" + "sha256": "5627f48cfca57f878bf73ea222fa8ca2f24ad248061a2f0151f22219386838f9" }, "data-dist-info-metadata": { - "sha256": "892426a14eeae04120b2baa0212d7090f3a22e64ffd5d0ad3bc4c515b59a9c89" + "sha256": "5627f48cfca57f878bf73ea222fa8ca2f24ad248061a2f0151f22219386838f9" }, "filename": "cleo-1.0.0a5-py3-none-any.whl", "hashes": { @@ -34,7 +34,7 @@ } ], "meta": { - "_last-serial": 20402192, + "_last-serial": 0, "api-version": "1.1" }, "name": "cleo", diff --git a/tests/repositories/fixtures/pypi.org/json/cleo/1.0.0a5.json b/tests/repositories/fixtures/pypi.org/json/cleo/1.0.0a5.json index 5cc33953e91..77f8f32e7e4 100644 --- a/tests/repositories/fixtures/pypi.org/json/cleo/1.0.0a5.json +++ b/tests/repositories/fixtures/pypi.org/json/cleo/1.0.0a5.json @@ -20,6 +20,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/python-poetry/cleo", "keywords": "cli,commands", "license": "MIT", @@ -32,10 +33,11 @@ "project_urls": { "Homepage": "https://github.com/python-poetry/cleo" }, + "provides_extra": null, "release_url": "https://pypi.org/project/cleo/1.0.0a5/", "requires_dist": [ - "crashtest (>=0.3.1,<0.4.0)", - "pylev (>=1.3.0,<2.0.0)" + "pylev (>=1.3.0,<2.0.0)", + "crashtest (>=0.3.1,<0.4.0)" ], "requires_python": ">=3.7,<4.0", "summary": "Cleo allows you to create beautiful and testable command-line interfaces.", @@ -43,7 +45,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 14027784, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/clikit.json b/tests/repositories/fixtures/pypi.org/json/clikit.json index 8616c086091..bd12deb0357 100644 --- a/tests/repositories/fixtures/pypi.org/json/clikit.json +++ b/tests/repositories/fixtures/pypi.org/json/clikit.json @@ -1,27 +1,44 @@ { - "name": "clikit", "files": [ { + "core-metadata": { + "sha256": "bf1c55d7159f7b783967c3035898bcf4fee282a654fb70efd0fdafc6e782f8b8" + }, + "data-dist-info-metadata": { + "sha256": "bf1c55d7159f7b783967c3035898bcf4fee282a654fb70efd0fdafc6e782f8b8" + }, "filename": "clikit-0.2.4-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/7b/0d/bb4c8a2d0edca8c300373ed736fb4680cf73be5be2ff84544dee5f979c14/clikit-0.2.4-py2.py3-none-any.whl", "hashes": { "md5": "c3558fef2a1148bb1df96376def5c8fe", "sha256": "60900adbac91d6d2cefc88efe2639ce3090f4520106596ac855bee3763f276c0" }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 85786, + "upload-time": "2019-05-11T17:09:23.516387Z", + "url": "https://files.pythonhosted.org/packages/7b/0d/bb4c8a2d0edca8c300373ed736fb4680cf73be5be2ff84544dee5f979c14/clikit-0.2.4-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "clikit-0.2.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/c5/33/14fad4c82f256b0ef60dd25d4b6d8145b463da5274fd9cd842f06af318ed/clikit-0.2.4.tar.gz", "hashes": { "md5": "f7cdbad3508038a04561f646aae68146", "sha256": "0fdd41e86e8b118a8b1e94ef2835925ada541d481c9b3b2fc635fa68713e6125" }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 50980, + "upload-time": "2019-05-11T17:09:25.865051Z", + "url": "https://files.pythonhosted.org/packages/c5/33/14fad4c82f256b0ef60dd25d4b6d8145b463da5274fd9cd842f06af318ed/clikit-0.2.4.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 5256718 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "clikit", + "versions": [ + "0.2.4" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/clikit/0.2.4.json b/tests/repositories/fixtures/pypi.org/json/clikit/0.2.4.json index 00c7fbf0352..5f93b13a530 100644 --- a/tests/repositories/fixtures/pypi.org/json/clikit/0.2.4.json +++ b/tests/repositories/fixtures/pypi.org/json/clikit/0.2.4.json @@ -22,6 +22,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/sdispater/clikit", "keywords": "packaging,dependency,poetry", "license": "MIT", @@ -35,12 +36,13 @@ "Homepage": "https://github.com/sdispater/clikit", "Repository": "https://github.com/sdispater/clikit" }, + "provides_extra": null, "release_url": "https://pypi.org/project/clikit/0.2.4/", "requires_dist": [ - "enum34 (>=1.1,<2.0); python_version >= \"2.7\" and python_version < \"2.8\"", - "typing (>=3.6,<4.0); python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.4\" and python_version < \"3.5\"", + "pastel (>=0.1.0,<0.2.0)", "pylev (>=1.3,<2.0)", - "pastel (>=0.1.0,<0.2.0)" + "typing (>=3.6,<4.0); python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.4\" and python_version < \"3.5\"", + "enum34 (>=1.1,<2.0); python_version >= \"2.7\" and python_version < \"2.8\"" ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "CliKit is a group of utilities to build beautiful and testable command line interfaces.", @@ -48,7 +50,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 7436676, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/colorama.json b/tests/repositories/fixtures/pypi.org/json/colorama.json index 463302eb1ad..c58033e3674 100644 --- a/tests/repositories/fixtures/pypi.org/json/colorama.json +++ b/tests/repositories/fixtures/pypi.org/json/colorama.json @@ -1,25 +1,44 @@ { - "name": "colorama", "files": [ { + "core-metadata": { + "sha256": "b44948f8400b680c05976397672aa7542b3bf013a46af8eff2ca8e3a7bef00d8" + }, + "data-dist-info-metadata": { + "sha256": "b44948f8400b680c05976397672aa7542b3bf013a46af8eff2ca8e3a7bef00d8" + }, "filename": "colorama-0.3.9-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/db/c8/7dcf9dbcb22429512708fe3a547f8b6101c0d02137acbd892505aee57adf/colorama-0.3.9-py2.py3-none-any.whl", "hashes": { "md5": "faef2bbd3c2ecc43e0969877d67b4c92", "sha256": "5b632359f1ed2b7676a869812ba0edaacb99be04679b29eb56c07a5e137ab5a2" - } + }, + "requires-python": null, + "size": 20181, + "upload-time": "2017-04-27T07:12:36.597052Z", + "url": "https://files.pythonhosted.org/packages/db/c8/7dcf9dbcb22429512708fe3a547f8b6101c0d02137acbd892505aee57adf/colorama-0.3.9-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "colorama-0.3.9.tar.gz", - "url": "https://files.pythonhosted.org/packages/e6/76/257b53926889e2835355d74fec73d82662100135293e17d382e2b74d1669/colorama-0.3.9.tar.gz", "hashes": { "md5": "8323a5b84fdf7ad810804e51fc256b39", "sha256": "4c5a15209723ce1330a5c193465fe221098f761e9640d823a2ce7c03f983137f" - } + }, + "requires-python": null, + "size": 25053, + "upload-time": "2017-04-27T07:12:12.351237Z", + "url": "https://files.pythonhosted.org/packages/e6/76/257b53926889e2835355d74fec73d82662100135293e17d382e2b74d1669/colorama-0.3.9.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 2833818 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "colorama", + "versions": [ + "0.3.9" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/colorama/0.3.9.json b/tests/repositories/fixtures/pypi.org/json/colorama/0.3.9.json index e0fd27a132d..3f383c67c5a 100644 --- a/tests/repositories/fixtures/pypi.org/json/colorama/0.3.9.json +++ b/tests/repositories/fixtures/pypi.org/json/colorama/0.3.9.json @@ -22,6 +22,7 @@ "Topic :: Terminals" ], "description": "", + "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { @@ -29,6 +30,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/tartley/colorama", "keywords": "color colour terminal text ansi windows crossplatform xplatform", "license": "BSD", @@ -38,13 +40,20 @@ "package_url": "https://pypi.org/project/colorama/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/colorama/", + "project_urls": { + "Download": "UNKNOWN", + "Homepage": "https://github.com/tartley/colorama" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/colorama/0.3.9/", "requires_dist": null, "requires_python": null, "summary": "Cross-platform colored terminal text.", - "version": "0.3.9" + "version": "0.3.9", + "yanked": false, + "yanked_reason": null }, - "last_serial": 2833818, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -58,9 +67,13 @@ "md5_digest": "faef2bbd3c2ecc43e0969877d67b4c92", "packagetype": "bdist_wheel", "python_version": "2.7", + "requires_python": null, "size": 20181, "upload_time": "2017-04-27T07:12:36", - "url": "https://files.pythonhosted.org/packages/db/c8/7dcf9dbcb22429512708fe3a547f8b6101c0d02137acbd892505aee57adf/colorama-0.3.9-py2.py3-none-any.whl" + "upload_time_iso_8601": "2017-04-27T07:12:36.597052Z", + "url": "https://files.pythonhosted.org/packages/db/c8/7dcf9dbcb22429512708fe3a547f8b6101c0d02137acbd892505aee57adf/colorama-0.3.9-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", @@ -74,9 +87,14 @@ "md5_digest": "8323a5b84fdf7ad810804e51fc256b39", "packagetype": "sdist", "python_version": "source", + "requires_python": null, "size": 25053, "upload_time": "2017-04-27T07:12:12", - "url": "https://files.pythonhosted.org/packages/e6/76/257b53926889e2835355d74fec73d82662100135293e17d382e2b74d1669/colorama-0.3.9.tar.gz" + "upload_time_iso_8601": "2017-04-27T07:12:12.351237Z", + "url": "https://files.pythonhosted.org/packages/e6/76/257b53926889e2835355d74fec73d82662100135293e17d382e2b74d1669/colorama-0.3.9.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/discord-py.json b/tests/repositories/fixtures/pypi.org/json/discord-py.json index fd5845edbfe..1f5ab7ebab1 100644 --- a/tests/repositories/fixtures/pypi.org/json/discord-py.json +++ b/tests/repositories/fixtures/pypi.org/json/discord-py.json @@ -2,10 +2,10 @@ "files": [ { "core-metadata": { - "sha256": "9a67e27fe067ace2169e406619fcf39ac779d60060bb658cb85dc4682c85f634" + "sha256": "82a6364f64a513ebbd7108338b20ed5e84cbee20a93e3e02c2cbe2d824d1b54b" }, "data-dist-info-metadata": { - "sha256": "9a67e27fe067ace2169e406619fcf39ac779d60060bb658cb85dc4682c85f634" + "sha256": "82a6364f64a513ebbd7108338b20ed5e84cbee20a93e3e02c2cbe2d824d1b54b" }, "filename": "discord.py-2.0.0-py3-none-any.whl", "hashes": { @@ -34,7 +34,7 @@ } ], "meta": { - "_last-serial": 19260702, + "_last-serial": 0, "api-version": "1.1" }, "name": "discord-py", diff --git a/tests/repositories/fixtures/pypi.org/json/discord-py/2.0.0.json b/tests/repositories/fixtures/pypi.org/json/discord-py/2.0.0.json index 5201120cb2e..47a453f7fbc 100644 --- a/tests/repositories/fixtures/pypi.org/json/discord-py/2.0.0.json +++ b/tests/repositories/fixtures/pypi.org/json/discord-py/2.0.0.json @@ -27,6 +27,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/Rapptz/discord.py", "keywords": "", "license": "MIT", @@ -41,24 +42,25 @@ "Homepage": "https://github.com/Rapptz/discord.py", "Issue tracker": "https://github.com/Rapptz/discord.py/issues" }, + "provides_extra": null, "release_url": "https://pypi.org/project/discord.py/2.0.0/", "requires_dist": [ - "PyNaCl (<1.6,>=1.3.0) ; extra == 'voice'", - "typing-extensions (<5,>=4.3) ; extra == 'test'", - "pytest-mock ; extra == 'test'", - "pytest-cov ; extra == 'test'", - "pytest-asyncio ; extra == 'test'", - "pytest ; extra == 'test'", - "coverage[toml] ; extra == 'test'", - "cchardet ; extra == 'speed'", - "Brotli ; extra == 'speed'", - "aiodns (>=1.1) ; extra == 'speed'", - "orjson (>=3.5.4) ; extra == 'speed'", - "typing-extensions (<5,>=4.3) ; extra == 'docs'", - "sphinxcontrib-websupport ; extra == 'docs'", - "sphinxcontrib-trio (==1.1.2) ; extra == 'docs'", + "aiohttp (<4,>=3.7.4)", "sphinx (==4.4.0) ; extra == 'docs'", - "aiohttp (<4,>=3.7.4)" + "sphinxcontrib-trio (==1.1.2) ; extra == 'docs'", + "sphinxcontrib-websupport ; extra == 'docs'", + "typing-extensions (<5,>=4.3) ; extra == 'docs'", + "orjson (>=3.5.4) ; extra == 'speed'", + "aiodns (>=1.1) ; extra == 'speed'", + "Brotli ; extra == 'speed'", + "cchardet ; extra == 'speed'", + "coverage[toml] ; extra == 'test'", + "pytest ; extra == 'test'", + "pytest-asyncio ; extra == 'test'", + "pytest-cov ; extra == 'test'", + "pytest-mock ; extra == 'test'", + "typing-extensions (<5,>=4.3) ; extra == 'test'", + "PyNaCl (<1.6,>=1.3.0) ; extra == 'voice'" ], "requires_python": ">=3.8.0", "summary": "A Python wrapper for the Discord API", @@ -66,7 +68,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 14796560, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/filecache.json b/tests/repositories/fixtures/pypi.org/json/filecache.json new file mode 100644 index 00000000000..a031d57165f --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/filecache.json @@ -0,0 +1,42 @@ +{ + "files": [ + { + "core-metadata": { + "sha256": "3fed106198f49b73a473e1322cf26f28137f215c8998209b684c20ce01971505" + }, + "data-dist-info-metadata": { + "sha256": "3fed106198f49b73a473e1322cf26f28137f215c8998209b684c20ce01971505" + }, + "filename": "filecache-0.81-py3-none-any.whl", + "hashes": { + "sha256": "91ce1a42b532d0e9ad75364c13159bafc3015973d4a5a0dbf37e4b4feb194055" + }, + "requires-python": null, + "size": 4449, + "upload-time": "2020-05-29T20:07:06.928906Z", + "url": "https://files.pythonhosted.org/packages/eb/79/f96a2addff21798ea11aa51ae15052514e9ac0ab4ab9470ddd1a0da6fd3e/filecache-0.81-py3-none-any.whl", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "filecache-0.81.tar.gz", + "hashes": { + "sha256": "be071ad64937b51f38b03ecd82b9b68c08d0f570cdddb30aa8f90150fe54b30a" + }, + "requires-python": null, + "size": 6423, + "upload-time": "2020-05-29T20:07:07.751617Z", + "url": "https://files.pythonhosted.org/packages/b3/f5/647f13b1cae32f8d3b84866f6bac688b7923c5d7643b994e5e89865c9a2a/filecache-0.81.tar.gz", + "yanked": false + } + ], + "meta": { + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "filecache", + "versions": [ + "0.81" + ] +} diff --git a/tests/repositories/fixtures/pypi.org/json/filecache/0.81.json b/tests/repositories/fixtures/pypi.org/json/filecache/0.81.json new file mode 100644 index 00000000000..9b4d6edb635 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/filecache/0.81.json @@ -0,0 +1,93 @@ +{ + "info": { + "author": "ubershmekel", + "author_email": "ubershmekel@gmail.com", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 3", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: Utilities" + ], + "description": "", + "description_content_type": "text/markdown", + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "https://github.com/ubershmekel/filecache", + "keywords": "", + "license": "", + "maintainer": "", + "maintainer_email": "", + "name": "filecache", + "package_url": "https://pypi.org/project/filecache/", + "platform": "", + "project_url": "https://pypi.org/project/filecache/", + "project_urls": { + "Homepage": "https://github.com/ubershmekel/filecache" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/filecache/0.81/", + "requires_dist": null, + "requires_python": "", + "summary": "Persistent caching decorator", + "version": "0.81", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "eb79f96a2addff21798ea11aa51ae15052514e9ac0ab4ab9470ddd1a0da6fd3e", + "md5": "0979123d410d2e411025d2e369a10179", + "sha256": "91ce1a42b532d0e9ad75364c13159bafc3015973d4a5a0dbf37e4b4feb194055" + }, + "downloads": -1, + "filename": "filecache-0.81-py3-none-any.whl", + "has_sig": false, + "md5_digest": "0979123d410d2e411025d2e369a10179", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": null, + "size": 4449, + "upload_time": "2020-05-29T20:07:06", + "upload_time_iso_8601": "2020-05-29T20:07:06.928906Z", + "url": "https://files.pythonhosted.org/packages/eb/79/f96a2addff21798ea11aa51ae15052514e9ac0ab4ab9470ddd1a0da6fd3e/filecache-0.81-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "b3f5647f13b1cae32f8d3b84866f6bac688b7923c5d7643b994e5e89865c9a2a", + "md5": "f4c8b0e4aba2e37a4d2045a1470fa018", + "sha256": "be071ad64937b51f38b03ecd82b9b68c08d0f570cdddb30aa8f90150fe54b30a" + }, + "downloads": -1, + "filename": "filecache-0.81.tar.gz", + "has_sig": false, + "md5_digest": "f4c8b0e4aba2e37a4d2045a1470fa018", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 6423, + "upload_time": "2020-05-29T20:07:07", + "upload_time_iso_8601": "2020-05-29T20:07:07.751617Z", + "url": "https://files.pythonhosted.org/packages/b3/f5/647f13b1cae32f8d3b84866f6bac688b7923c5d7643b994e5e89865c9a2a/filecache-0.81.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/funcsigs.json b/tests/repositories/fixtures/pypi.org/json/funcsigs.json index fa281d8b055..df218b6264d 100644 --- a/tests/repositories/fixtures/pypi.org/json/funcsigs.json +++ b/tests/repositories/fixtures/pypi.org/json/funcsigs.json @@ -1,25 +1,42 @@ { - "name": "funcsigs", "files": [ { + "core-metadata": { + "sha256": "4288c421dc872125cc7bcfef2cbb953584a95dfc8fb21b766ac038af980559fe" + }, + "data-dist-info-metadata": { + "sha256": "4288c421dc872125cc7bcfef2cbb953584a95dfc8fb21b766ac038af980559fe" + }, "filename": "funcsigs-1.0.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/69/cb/f5be453359271714c01b9bd06126eaf2e368f1fddfff30818754b5ac2328/funcsigs-1.0.2-py2.py3-none-any.whl", "hashes": { - "md5": "bb61ae651a30926a4b4723e68f97238f", - "sha256": "510ab97424949e726b4b44294018e90142c9aadf8e737cf3a125b4cffed42e79" - } + "sha256": "330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca" + }, + "requires-python": null, + "size": 17697, + "upload-time": "2016-04-25T22:22:05.222685Z", + "url": "https://files.pythonhosted.org/packages/69/cb/f5be453359271714c01b9bd06126eaf2e368f1fddfff30818754b5ac2328/funcsigs-1.0.2-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "funcsigs-1.0.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/94/4a/db842e7a0545de1cdb0439bb80e6e42dfe82aaeaadd4072f2263a4fbed23/funcsigs-1.0.2.tar.gz", "hashes": { - "md5": "e6206f7ae6f315c05108d5b587cccc3e", - "sha256": "c55716fcd1228645c214b44568d1fb9af2e28668a9c58e72a17a89a75d24ecd6" - } + "sha256": "a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50" + }, + "requires-python": null, + "size": 27947, + "upload-time": "2016-04-25T22:22:33.882246Z", + "url": "https://files.pythonhosted.org/packages/94/4a/db842e7a0545de1cdb0439bb80e6e42dfe82aaeaadd4072f2263a4fbed23/funcsigs-1.0.2.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 2083703 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "funcsigs", + "versions": [ + "1.0.2" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/funcsigs/1.0.2.json b/tests/repositories/fixtures/pypi.org/json/funcsigs/1.0.2.json index 9b35de33490..604fd5816c3 100644 --- a/tests/repositories/fixtures/pypi.org/json/funcsigs/1.0.2.json +++ b/tests/repositories/fixtures/pypi.org/json/funcsigs/1.0.2.json @@ -21,6 +21,7 @@ "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "", + "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { @@ -28,6 +29,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://funcsigs.readthedocs.org", "keywords": null, "license": "ASL", @@ -37,45 +39,63 @@ "package_url": "https://pypi.org/project/funcsigs/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/funcsigs/", + "project_urls": { + "Download": "UNKNOWN", + "Homepage": "http://funcsigs.readthedocs.org" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/funcsigs/1.0.2/", "requires_dist": null, "requires_python": null, "summary": "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+", - "version": "1.0.2" + "version": "1.0.2", + "yanked": false, + "yanked_reason": null }, - "last_serial": 2083703, + "last_serial": 0, "urls": [ { "comment_text": "", "digests": { - "md5": "bb61ae651a30926a4b4723e68f97238f", - "sha256": "510ab97424949e726b4b44294018e90142c9aadf8e737cf3a125b4cffed42e79" + "blake2b_256": "69cbf5be453359271714c01b9bd06126eaf2e368f1fddfff30818754b5ac2328", + "md5": "701d58358171f34b6d1197de2923a35a", + "sha256": "330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca" }, "downloads": -1, "filename": "funcsigs-1.0.2-py2.py3-none-any.whl", - "has_sig": true, - "md5_digest": "bb61ae651a30926a4b4723e68f97238f", + "has_sig": false, + "md5_digest": "701d58358171f34b6d1197de2923a35a", "packagetype": "bdist_wheel", "python_version": "2.7", + "requires_python": null, "size": 17697, "upload_time": "2016-04-25T22:22:05", - "url": "https://files.pythonhosted.org/packages/69/cb/f5be453359271714c01b9bd06126eaf2e368f1fddfff30818754b5ac2328/funcsigs-1.0.2-py2.py3-none-any.whl" + "upload_time_iso_8601": "2016-04-25T22:22:05.222685Z", + "url": "https://files.pythonhosted.org/packages/69/cb/f5be453359271714c01b9bd06126eaf2e368f1fddfff30818754b5ac2328/funcsigs-1.0.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", "digests": { - "md5": "e6206f7ae6f315c05108d5b587cccc3e", - "sha256": "c55716fcd1228645c214b44568d1fb9af2e28668a9c58e72a17a89a75d24ecd6" + "blake2b_256": "944adb842e7a0545de1cdb0439bb80e6e42dfe82aaeaadd4072f2263a4fbed23", + "md5": "7e583285b1fb8a76305d6d68f4ccc14e", + "sha256": "a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50" }, "downloads": -1, "filename": "funcsigs-1.0.2.tar.gz", - "has_sig": true, - "md5_digest": "e6206f7ae6f315c05108d5b587cccc3e", + "has_sig": false, + "md5_digest": "7e583285b1fb8a76305d6d68f4ccc14e", "packagetype": "sdist", "python_version": "source", + "requires_python": null, "size": 27947, "upload_time": "2016-04-25T22:22:33", - "url": "https://files.pythonhosted.org/packages/94/4a/db842e7a0545de1cdb0439bb80e6e42dfe82aaeaadd4072f2263a4fbed23/funcsigs-1.0.2.tar.gz" + "upload_time_iso_8601": "2016-04-25T22:22:33.882246Z", + "url": "https://files.pythonhosted.org/packages/94/4a/db842e7a0545de1cdb0439bb80e6e42dfe82aaeaadd4072f2263a4fbed23/funcsigs-1.0.2.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/futures.json b/tests/repositories/fixtures/pypi.org/json/futures.json index 41bb30b02b0..6e889437873 100644 --- a/tests/repositories/fixtures/pypi.org/json/futures.json +++ b/tests/repositories/fixtures/pypi.org/json/futures.json @@ -2,10 +2,10 @@ "files": [ { "core-metadata": { - "sha256": "02a2b035758c39be414a32a2582d2c4f072465cb99b487c727d145d863052ffe" + "sha256": "e73888099c1e04d81a9824591e3efc584f5181ff1583e1ce2a90af6d1cc731f8" }, "data-dist-info-metadata": { - "sha256": "02a2b035758c39be414a32a2582d2c4f072465cb99b487c727d145d863052ffe" + "sha256": "e73888099c1e04d81a9824591e3efc584f5181ff1583e1ce2a90af6d1cc731f8" }, "filename": "futures-3.2.0-py2-none-any.whl", "hashes": { @@ -34,7 +34,7 @@ } ], "meta": { - "_last-serial": 15602876, + "_last-serial": 0, "api-version": "1.1" }, "name": "futures", diff --git a/tests/repositories/fixtures/pypi.org/json/futures/3.2.0.json b/tests/repositories/fixtures/pypi.org/json/futures/3.2.0.json index 5214a1bcc03..804b3e8cafb 100644 --- a/tests/repositories/fixtures/pypi.org/json/futures/3.2.0.json +++ b/tests/repositories/fixtures/pypi.org/json/futures/3.2.0.json @@ -42,7 +42,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 15602876, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/hbmqtt.json b/tests/repositories/fixtures/pypi.org/json/hbmqtt.json index 20f4a9764eb..8efff2776ac 100644 --- a/tests/repositories/fixtures/pypi.org/json/hbmqtt.json +++ b/tests/repositories/fixtures/pypi.org/json/hbmqtt.json @@ -1,19 +1,52 @@ { "files": [ { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "hbmqtt-0.9.6-py3.8.egg", + "hashes": { + "sha256": "57799a933500caadb472000ba0c1e043d4768608cd8142104f89c53930d8613c" + }, + "requires-python": null, + "size": 186560, + "upload-time": "2020-01-25T14:13:44.484402Z", + "url": "https://files.pythonhosted.org/packages/4f/4b/69014d0fd585b45bfdb77ef0e70bcf035fc8fc798c2a0610fd7cfae56cfd/hbmqtt-0.9.6-py3.8.egg", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "hbmqtt-0.9.6.linux-x86_64.tar.gz", + "hashes": { + "sha256": "c83ba91dc5cf9a01f83afb5380701504f69bdf9ea1c071f4dfdc1cba412fcd63" + }, + "requires-python": null, + "size": 126180, + "upload-time": "2020-01-25T14:12:53.948778Z", + "url": "https://files.pythonhosted.org/packages/ee/27/912d1d8c307a72985edf0b6ad9fc1c32e22bfc42efbd0244902c43bd9307/hbmqtt-0.9.6.linux-x86_64.tar.gz", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "hbmqtt-0.9.6.tar.gz", "hashes": { "md5": "b284e3118882f169aa618a856cd91c5f", "sha256": "379f1d9044997c69308ac2e01621c817b5394e1fbe0696e62538ae2dd0aa7e07" }, - "requires-python": "", + "requires-python": null, + "size": 74727, + "upload-time": "2020-01-25T14:12:45.640961Z", "url": "https://files.pythonhosted.org/packages/b4/7c/7e1d47e740915bd628f4038083469c5919e759a638f45abab01e09e933cb/hbmqtt-0.9.6.tar.gz", "yanked": false } ], "meta": { - "_last-serial": 6518769, - "api-version": "1.0" + "_last-serial": 0, + "api-version": "1.1" }, - "name": "hbmqtt" + "name": "hbmqtt", + "versions": [ + "0.9.6" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/hbmqtt/0.9.6.json b/tests/repositories/fixtures/pypi.org/json/hbmqtt/0.9.6.json index 48ccf5b404f..1a43aeba905 100644 --- a/tests/repositories/fixtures/pypi.org/json/hbmqtt/0.9.6.json +++ b/tests/repositories/fixtures/pypi.org/json/hbmqtt/0.9.6.json @@ -25,6 +25,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/beerfactory/hbmqtt", "keywords": "", "license": "MIT", @@ -37,6 +38,7 @@ "project_urls": { "Homepage": "https://github.com/beerfactory/hbmqtt" }, + "provides_extra": null, "release_url": "https://pypi.org/project/hbmqtt/0.9.6/", "requires_dist": null, "requires_python": "", @@ -45,11 +47,12 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 6518769, + "last_serial": 0, "urls": [ { "comment_text": "", "digests": { + "blake2b_256": "ee27912d1d8c307a72985edf0b6ad9fc1c32e22bfc42efbd0244902c43bd9307", "md5": "e7ecbb2bf3aa2b3b5b2a47dc5289039a", "sha256": "c83ba91dc5cf9a01f83afb5380701504f69bdf9ea1c071f4dfdc1cba412fcd63" }, @@ -70,6 +73,7 @@ { "comment_text": "", "digests": { + "blake2b_256": "4f4b69014d0fd585b45bfdb77ef0e70bcf035fc8fc798c2a0610fd7cfae56cfd", "md5": "d7896681b8d7d27b53302350b5b3c9c2", "sha256": "57799a933500caadb472000ba0c1e043d4768608cd8142104f89c53930d8613c" }, diff --git a/tests/repositories/fixtures/pypi.org/json/importlib-metadata.json b/tests/repositories/fixtures/pypi.org/json/importlib-metadata.json index ee4ff1bafec..5ac034226d3 100644 --- a/tests/repositories/fixtures/pypi.org/json/importlib-metadata.json +++ b/tests/repositories/fixtures/pypi.org/json/importlib-metadata.json @@ -1,27 +1,42 @@ { - "name": "importlib-metadata", "files": [ { - "hashes": { - "md5": "7cfd9d7d6dbaf8c0ea81cc0c86a63c30", - "sha256": "7e161a9fc58a218ba5d2d49827331b977cc421fd42f681488fb90c0ce9ad0097" + "core-metadata": { + "sha256": "d176e226c843ad287df418105af818b0545801d6827ab3e800e457913be05260" + }, + "data-dist-info-metadata": { + "sha256": "d176e226c843ad287df418105af818b0545801d6827ab3e800e457913be05260" }, "filename": "importlib_metadata-1.7.0-py2.py3-none-any.whl", - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", - "url": "https://files.pythonhosted.org/packages/8e/58/cdea07eb51fc2b906db0968a94700866fc46249bdc75cac23f9d13168929/importlib_metadata-1.7.0-py2.py3-none-any.whl" + "hashes": { + "sha256": "dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070" + }, + "requires-python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "size": 31809, + "upload-time": "2020-06-26T21:38:16.079439Z", + "url": "https://files.pythonhosted.org/packages/8e/58/cdea07eb51fc2b906db0968a94700866fc46249bdc75cac23f9d13168929/importlib_metadata-1.7.0-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "importlib_metadata-1.7.0.tar.gz", "hashes": { - "md5": "35624f96c0aceaa5959f79a1a14f3586", - "sha256": "7a20a5d402d450dd394334e4c6f4f48e728cdef1e52d72f75837a6a455927a1a" + "sha256": "90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83" }, - "filename": "importlib_metadata-1.7.0.tar.gz", - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", - "url": "https://files.pythonhosted.org/packages/e2/ae/0b037584024c1557e537d25482c306cf6327b5a09b6c4b893579292c1c38/importlib_metadata-1.7.0.tar.gz" + "requires-python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", + "size": 29233, + "upload-time": "2020-06-26T21:38:17.338581Z", + "url": "https://files.pythonhosted.org/packages/e2/ae/0b037584024c1557e537d25482c306cf6327b5a09b6c4b893579292c1c38/importlib_metadata-1.7.0.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3879671 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "importlib-metadata", + "versions": [ + "1.7.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/importlib-metadata/1.7.0.json b/tests/repositories/fixtures/pypi.org/json/importlib-metadata/1.7.0.json index bcc44460c10..de578c77d22 100644 --- a/tests/repositories/fixtures/pypi.org/json/importlib-metadata/1.7.0.json +++ b/tests/repositories/fixtures/pypi.org/json/importlib-metadata/1.7.0.json @@ -20,6 +20,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://importlib-metadata.readthedocs.io/", "keywords": "", "license": "Apache Software License", @@ -32,6 +33,7 @@ "project_urls": { "Homepage": "http://importlib-metadata.readthedocs.io/" }, + "provides_extra": null, "release_url": "https://pypi.org/project/importlib-metadata/1.7.0/", "requires_dist": [ "zipp (>=0.5)", @@ -50,62 +52,19 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 10821863, - "releases": { - "1.7.0": [ - { - "comment_text": "", - "digests": { - "md5": "8ae1f31228e29443c08e07501a99d1b8", - "sha256": "dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070" - }, - "downloads": -1, - "filename": "importlib_metadata-1.7.0-py2.py3-none-any.whl", - "has_sig": false, - "md5_digest": "8ae1f31228e29443c08e07501a99d1b8", - "packagetype": "bdist_wheel", - "python_version": "py2.py3", - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", - "size": 31809, - "upload_time": "2020-06-26T21:38:16", - "upload_time_iso_8601": "2020-06-26T21:38:16.079439Z", - "url": "https://files.pythonhosted.org/packages/8e/58/cdea07eb51fc2b906db0968a94700866fc46249bdc75cac23f9d13168929/importlib_metadata-1.7.0-py2.py3-none-any.whl", - "yanked": false, - "yanked_reason": null - }, - { - "comment_text": "", - "digests": { - "md5": "4505ea85600cca1e693a4f8f5dd27ba8", - "sha256": "90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83" - }, - "downloads": -1, - "filename": "importlib_metadata-1.7.0.tar.gz", - "has_sig": false, - "md5_digest": "4505ea85600cca1e693a4f8f5dd27ba8", - "packagetype": "sdist", - "python_version": "source", - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", - "size": 29233, - "upload_time": "2020-06-26T21:38:17", - "upload_time_iso_8601": "2020-06-26T21:38:17.338581Z", - "url": "https://files.pythonhosted.org/packages/e2/ae/0b037584024c1557e537d25482c306cf6327b5a09b6c4b893579292c1c38/importlib_metadata-1.7.0.tar.gz", - "yanked": false, - "yanked_reason": null - } - ] - }, + "last_serial": 0, "urls": [ { "comment_text": "", "digests": { - "md5": "7cfd9d7d6dbaf8c0ea81cc0c86a63c30", - "sha256": "7e161a9fc58a218ba5d2d49827331b977cc421fd42f681488fb90c0ce9ad0097" + "blake2b_256": "8e58cdea07eb51fc2b906db0968a94700866fc46249bdc75cac23f9d13168929", + "md5": "8ae1f31228e29443c08e07501a99d1b8", + "sha256": "dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070" }, "downloads": -1, "filename": "importlib_metadata-1.7.0-py2.py3-none-any.whl", "has_sig": false, - "md5_digest": "7cfd9d7d6dbaf8c0ea81cc0c86a63c30", + "md5_digest": "8ae1f31228e29443c08e07501a99d1b8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", @@ -119,13 +78,14 @@ { "comment_text": "", "digests": { - "md5": "35624f96c0aceaa5959f79a1a14f3586", - "sha256": "7a20a5d402d450dd394334e4c6f4f48e728cdef1e52d72f75837a6a455927a1a" + "blake2b_256": "e2ae0b037584024c1557e537d25482c306cf6327b5a09b6c4b893579292c1c38", + "md5": "4505ea85600cca1e693a4f8f5dd27ba8", + "sha256": "90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83" }, "downloads": -1, "filename": "importlib_metadata-1.7.0.tar.gz", "has_sig": false, - "md5_digest": "35624f96c0aceaa5959f79a1a14f3586", + "md5_digest": "4505ea85600cca1e693a4f8f5dd27ba8", "packagetype": "sdist", "python_version": "source", "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", @@ -136,5 +96,6 @@ "yanked": false, "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/ipython.json b/tests/repositories/fixtures/pypi.org/json/ipython.json index d5f7bef227d..d4a0c25b84e 100644 --- a/tests/repositories/fixtures/pypi.org/json/ipython.json +++ b/tests/repositories/fixtures/pypi.org/json/ipython.json @@ -2,15 +2,14 @@ "files": [ { "core-metadata": { - "sha256": "ad06c78c59547c822f72c2758b51935ae8e4056bd8909a8fd8912bf7d9f88fa7" + "sha256": "16762b4f9bbc29f0aa70a7dbd69dee034a28cbdcd72c7c70f09b5bc6da762592" }, "data-dist-info-metadata": { - "sha256": "ad06c78c59547c822f72c2758b51935ae8e4056bd8909a8fd8912bf7d9f88fa7" + "sha256": "16762b4f9bbc29f0aa70a7dbd69dee034a28cbdcd72c7c70f09b5bc6da762592" }, "filename": "ipython-4.1.0rc1-py2.py3-none-any.whl", "hashes": { - "md5": "ae0b233f09e1047a0240d30345b8ff91", - "sha256": "b593bcf0c53490f56809805a94b289403c8025859583a71f50c2305860ad187d" + "sha256": "4d0a08f3fd8837502bf33e9497a5ab28fe63e2fa4201765f378cb139c7a60d5f" }, "requires-python": null, "size": 736900, @@ -23,8 +22,7 @@ "data-dist-info-metadata": false, "filename": "ipython-4.1.0rc1.tar.gz", "hashes": { - "md5": "1bdec8cbb110f7c7b991c8d45f626fd4", - "sha256": "d5203d06ac3225a746f856b592aeaffa3d1a7f1efa535263b06bdebc094d9701" + "sha256": "6244a8e3293088ee31c1854abe1a1e7a409cf3ac2fb7579aa9616bdfadd3d4dc" }, "requires-python": null, "size": 4933377, @@ -37,8 +35,7 @@ "data-dist-info-metadata": false, "filename": "ipython-4.1.0rc1.zip", "hashes": { - "md5": "1f18b85e1d93dc10554ade23864f02cc", - "sha256": "8fe8ae7e62942f58b24b908fa2bee3dce0e2470a8cd22ea753f2de9bedf5ffc5" + "sha256": "efa3a5a676648cb18e2a2d3cd6353f3c83f0f704df8eb0eb6ae7d0dcbf187ea1" }, "requires-python": null, "size": 5100723, @@ -48,10 +45,10 @@ }, { "core-metadata": { - "sha256": "130f1323b932eb7b6fefa2928c20eaeebfa90ef94c06347a3a960566b98bdcd0" + "sha256": "07bb0f56a1a5d60d319a01d196c2593ea972f2285e85e473131282ef64b83e59" }, "data-dist-info-metadata": { - "sha256": "130f1323b932eb7b6fefa2928c20eaeebfa90ef94c06347a3a960566b98bdcd0" + "sha256": "07bb0f56a1a5d60d319a01d196c2593ea972f2285e85e473131282ef64b83e59" }, "filename": "ipython-5.7.0-py2-none-any.whl", "hashes": { @@ -66,10 +63,10 @@ }, { "core-metadata": { - "sha256": "5251032152a45b01a679c73fab3a836053167987c9343251cd29bd39b8f9f1c7" + "sha256": "891e312c0f4969308ab703c5e4437dab51f4cac0b190e1e51045ec4a5cad2de4" }, "data-dist-info-metadata": { - "sha256": "5251032152a45b01a679c73fab3a836053167987c9343251cd29bd39b8f9f1c7" + "sha256": "891e312c0f4969308ab703c5e4437dab51f4cac0b190e1e51045ec4a5cad2de4" }, "filename": "ipython-5.7.0-py3-none-any.whl", "hashes": { @@ -98,10 +95,10 @@ }, { "core-metadata": { - "sha256": "3b26900950637e01c03a8de278805adb022c5bbb1e94db2f31d137b5266b7726" + "sha256": "865b29decaca03261c0df6ce2a374ef5f3df4c3f9f7b3388c534a703d45a12ef" }, "data-dist-info-metadata": { - "sha256": "3b26900950637e01c03a8de278805adb022c5bbb1e94db2f31d137b5266b7726" + "sha256": "865b29decaca03261c0df6ce2a374ef5f3df4c3f9f7b3388c534a703d45a12ef" }, "filename": "ipython-7.5.0-py3-none-any.whl", "hashes": { @@ -130,7 +127,7 @@ } ], "meta": { - "_last-serial": 22152965, + "_last-serial": 0, "api-version": "1.1" }, "name": "ipython", diff --git a/tests/repositories/fixtures/pypi.org/json/ipython/4.1.0rc1.json b/tests/repositories/fixtures/pypi.org/json/ipython/4.1.0rc1.json index 150ef97f33e..a895c2e79a2 100644 --- a/tests/repositories/fixtures/pypi.org/json/ipython/4.1.0rc1.json +++ b/tests/repositories/fixtures/pypi.org/json/ipython/4.1.0rc1.json @@ -2,7 +2,7 @@ "info": { "author": "The IPython Development Team", "author_email": "ipython-dev@scipy.org", - "bugtrack_url": "", + "bugtrack_url": null, "classifiers": [ "Framework :: IPython", "Intended Audience :: Developers", @@ -15,6 +15,7 @@ "Topic :: System :: Shells" ], "description": "", + "description_content_type": null, "docs_url": null, "download_url": "https://github.com/ipython/ipython/downloads", "downloads": { @@ -22,6 +23,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://ipython.org", "keywords": "Interactive,Interpreter,Shell,Parallel,Distributed,Web-based computing,Qt console,Embedding", "license": "BSD", @@ -31,6 +33,11 @@ "package_url": "https://pypi.org/project/ipython/", "platform": "Linux,Mac OSX,Windows XP/Vista/7/8", "project_url": "https://pypi.org/project/ipython/", + "project_urls": { + "Download": "https://github.com/ipython/ipython/downloads", + "Homepage": "http://ipython.org" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/ipython/4.1.0rc1/", "requires_dist": [ "pickleshare", @@ -67,57 +74,75 @@ ], "requires_python": "", "summary": "IPython: Productive Interactive Computing", - "version": "4.1.0rc1" + "version": "4.1.0rc1", + "yanked": false, + "yanked_reason": null }, - "last_serial": 3740674, + "last_serial": 0, "urls": [ { "comment_text": "", "digests": { - "md5": "ae0b233f09e1047a0240d30345b8ff91", - "sha256": "b593bcf0c53490f56809805a94b289403c8025859583a71f50c2305860ad187d" + "blake2b_256": "ac0204a5d372b4e64f9c97b2846646aec1ce4532885005aa4ba51eb20b80e17f", + "md5": "512f0431c850c75a12baa9f8c4a9f12f", + "sha256": "4d0a08f3fd8837502bf33e9497a5ab28fe63e2fa4201765f378cb139c7a60d5f" }, "downloads": -1, "filename": "ipython-4.1.0rc1-py2.py3-none-any.whl", "has_sig": false, - "md5_digest": "ae0b233f09e1047a0240d30345b8ff91", + "md5_digest": "512f0431c850c75a12baa9f8c4a9f12f", "packagetype": "bdist_wheel", "python_version": "py2.py3", + "requires_python": null, "size": 736900, "upload_time": "2016-01-26T19:58:35", - "url": "https://files.pythonhosted.org/packages/ac/02/04a5d372b4e64f9c97b2846646aec1ce4532885005aa4ba51eb20b80e17f/ipython-4.1.0rc1-py2.py3-none-any.whl" + "upload_time_iso_8601": "2016-01-26T19:58:35.544443Z", + "url": "https://files.pythonhosted.org/packages/ac/02/04a5d372b4e64f9c97b2846646aec1ce4532885005aa4ba51eb20b80e17f/ipython-4.1.0rc1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", "digests": { - "md5": "1bdec8cbb110f7c7b991c8d45f626fd4", - "sha256": "d5203d06ac3225a746f856b592aeaffa3d1a7f1efa535263b06bdebc094d9701" + "blake2b_256": "a0def71f0c8b8a26ef28cc968fbf1859729ad3e68146cd2eb4a759e9c88da218", + "md5": "2aff56d8e78341f64663bcbc81366376", + "sha256": "6244a8e3293088ee31c1854abe1a1e7a409cf3ac2fb7579aa9616bdfadd3d4dc" }, "downloads": -1, "filename": "ipython-4.1.0rc1.tar.gz", "has_sig": false, - "md5_digest": "1bdec8cbb110f7c7b991c8d45f626fd4", + "md5_digest": "2aff56d8e78341f64663bcbc81366376", "packagetype": "sdist", "python_version": "source", + "requires_python": null, "size": 4933377, "upload_time": "2016-01-26T19:58:53", - "url": "https://files.pythonhosted.org/packages/a0/de/f71f0c8b8a26ef28cc968fbf1859729ad3e68146cd2eb4a759e9c88da218/ipython-4.1.0rc1.tar.gz" + "upload_time_iso_8601": "2016-01-26T19:58:53.938491Z", + "url": "https://files.pythonhosted.org/packages/a0/de/f71f0c8b8a26ef28cc968fbf1859729ad3e68146cd2eb4a759e9c88da218/ipython-4.1.0rc1.tar.gz", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", "digests": { - "md5": "c641fd1d26083c589503ede5b9321f47", - "sha256": "83bf3b3b5d3b7afdfc885c5906a9e146dc840143e75ba62f241afb0e4c701a94" + "blake2b_256": "71f09d670266b840b8b921dc7106ecddd892f6fb893424883498e1ba3ec3a3a1", + "md5": "a9ff233f176dd99b076b81dc8904ab7a", + "sha256": "efa3a5a676648cb18e2a2d3cd6353f3c83f0f704df8eb0eb6ae7d0dcbf187ea1" }, "downloads": -1, "filename": "ipython-4.1.0rc1.zip", "has_sig": false, - "md5_digest": "c641fd1d26083c589503ede5b9321f47", + "md5_digest": "a9ff233f176dd99b076b81dc8904ab7a", "packagetype": "sdist", "python_version": "source", + "requires_python": null, "size": 5100723, "upload_time": "2016-01-26T19:59:14", - "url": "https://files.pythonhosted.org/packages/71/f0/9d670266b840b8b921dc7106ecddd892f6fb893424883498e1ba3ec3a3a1/ipython-4.1.0rc1.zip" + "upload_time_iso_8601": "2016-01-26T19:59:14.449245Z", + "url": "https://files.pythonhosted.org/packages/71/f0/9d670266b840b8b921dc7106ecddd892f6fb893424883498e1ba3ec3a3a1/ipython-4.1.0rc1.zip", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/ipython/5.7.0.json b/tests/repositories/fixtures/pypi.org/json/ipython/5.7.0.json index 3d46159c746..71c5a405aa3 100644 --- a/tests/repositories/fixtures/pypi.org/json/ipython/5.7.0.json +++ b/tests/repositories/fixtures/pypi.org/json/ipython/5.7.0.json @@ -87,7 +87,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 22152965, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/ipython/7.5.0.json b/tests/repositories/fixtures/pypi.org/json/ipython/7.5.0.json index 59ec524e312..c4b455cb1ba 100644 --- a/tests/repositories/fixtures/pypi.org/json/ipython/7.5.0.json +++ b/tests/repositories/fixtures/pypi.org/json/ipython/7.5.0.json @@ -90,7 +90,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 22152965, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/isort.json b/tests/repositories/fixtures/pypi.org/json/isort.json index 49644c68803..d2c0cf86c28 100644 --- a/tests/repositories/fixtures/pypi.org/json/isort.json +++ b/tests/repositories/fixtures/pypi.org/json/isort.json @@ -1,33 +1,62 @@ { - "name": "isort", "files": [ { + "core-metadata": { + "sha256": "4a736288a055765f102d09f6b8bac7d5a2ba13a82cc9e46e80c3f65ef2497d3c" + }, + "data-dist-info-metadata": { + "sha256": "4a736288a055765f102d09f6b8bac7d5a2ba13a82cc9e46e80c3f65ef2497d3c" + }, "filename": "isort-4.3.4-py2-none-any.whl", - "url": "https://files.pythonhosted.org/packages/41/d8/a945da414f2adc1d9e2f7d6e7445b27f2be42766879062a2e63616ad4199/isort-4.3.4-py2-none-any.whl", "hashes": { "md5": "e84fb6f2278ee4d0bd719a4d44863d9f", "sha256": "3bbfc8f6119a46a48064487afb0b3ca9daa4b09fbfd94336a24c7616b71db2ca" - } + }, + "requires-python": null, + "size": 45393, + "upload-time": "2018-02-12T15:06:38.441257Z", + "url": "https://files.pythonhosted.org/packages/41/d8/a945da414f2adc1d9e2f7d6e7445b27f2be42766879062a2e63616ad4199/isort-4.3.4-py2-none-any.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bd3a28432bb89f731dc82c08c1ee1497c874e85eb8290371547db13d3adc5a34" + }, + "data-dist-info-metadata": { + "sha256": "bd3a28432bb89f731dc82c08c1ee1497c874e85eb8290371547db13d3adc5a34" + }, "filename": "isort-4.3.4-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/1f/2c/22eee714d7199ae0464beda6ad5fedec8fee6a2f7ffd1e8f1840928fe318/isort-4.3.4-py3-none-any.whl", "hashes": { "md5": "baa2e5dc4e89511b6bc54e969d040a08", "sha256": "e7aa083302c758b358e10a3a1c707adcc9f8ab57795e99246ac72eeffe7f2b20" - } + }, + "requires-python": null, + "size": 45352, + "upload-time": "2018-02-12T15:06:20.089641Z", + "url": "https://files.pythonhosted.org/packages/1f/2c/22eee714d7199ae0464beda6ad5fedec8fee6a2f7ffd1e8f1840928fe318/isort-4.3.4-py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "isort-4.3.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/b1/de/a628d16fdba0d38cafb3d7e34d4830f2c9cb3881384ce5c08c44762e1846/isort-4.3.4.tar.gz", "hashes": { "md5": "9244631852cf8bd8559f7ab78bf4ec78", "sha256": "234ad07e1e2780c27fa56364eefa734bee991b0d744337ef7e7ce3d5b1b59f39" - } + }, + "requires-python": null, + "size": 56070, + "upload-time": "2018-02-12T15:06:16.498194Z", + "url": "https://files.pythonhosted.org/packages/b1/de/a628d16fdba0d38cafb3d7e34d4830f2c9cb3881384ce5c08c44762e1846/isort-4.3.4.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3575149 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "isort", + "versions": [ + "4.3.4" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/isort/4.3.4.json b/tests/repositories/fixtures/pypi.org/json/isort/4.3.4.json index d434a1b16e3..44ec4ecf9fb 100644 --- a/tests/repositories/fixtures/pypi.org/json/isort/4.3.4.json +++ b/tests/repositories/fixtures/pypi.org/json/isort/4.3.4.json @@ -30,6 +30,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/timothycrosley/isort", "keywords": "Refactor", "license": "MIT", @@ -42,6 +43,7 @@ "project_urls": { "Homepage": "https://github.com/timothycrosley/isort" }, + "provides_extra": null, "release_url": "https://pypi.org/project/isort/4.3.4/", "requires_dist": null, "requires_python": "", @@ -50,7 +52,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 11968646, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/jupyter.json b/tests/repositories/fixtures/pypi.org/json/jupyter.json index e15282129c1..7bd87597f92 100644 --- a/tests/repositories/fixtures/pypi.org/json/jupyter.json +++ b/tests/repositories/fixtures/pypi.org/json/jupyter.json @@ -1,33 +1,58 @@ { - "name": "jupyter", "files": [ { + "core-metadata": { + "sha256": "89666fe631d5e97add0c96b87457f91671b0ce522e4f55d88886507984a5f743" + }, + "data-dist-info-metadata": { + "sha256": "89666fe631d5e97add0c96b87457f91671b0ce522e4f55d88886507984a5f743" + }, "filename": "jupyter-1.0.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/83/df/0f5dd132200728a86190397e1ea87cd76244e42d39ec5e88efd25b2abd7e/jupyter-1.0.0-py2.py3-none-any.whl", "hashes": { "md5": "b2f5e2daab779c7bda0be38925ab1b92", "sha256": "83c4591b9c7392ea5f91e0d9f8e98d894f76e8e669260788f0fcb281ec0b3b1f" - } + }, + "requires-python": null, + "size": 2736, + "upload-time": "2015-08-12T00:42:58.951595Z", + "url": "https://files.pythonhosted.org/packages/83/df/0f5dd132200728a86190397e1ea87cd76244e42d39ec5e88efd25b2abd7e/jupyter-1.0.0-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "jupyter-1.0.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/c9/a9/371d0b8fe37dd231cf4b2cff0a9f0f25e98f3a73c3771742444be27f2944/jupyter-1.0.0.tar.gz", "hashes": { "md5": "78acaec88533ea6b6e761e7d086a1d04", "sha256": "3ef1e86ba0556ea5922b846416a41acfd2625830d996c7d06d80c90bed1dc193" - } + }, + "requires-python": null, + "size": 12916, + "upload-time": "2015-08-12T00:43:08.537857Z", + "url": "https://files.pythonhosted.org/packages/c9/a9/371d0b8fe37dd231cf4b2cff0a9f0f25e98f3a73c3771742444be27f2944/jupyter-1.0.0.tar.gz", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "jupyter-1.0.0.zip", - "url": "https://files.pythonhosted.org/packages/fc/21/a372b73e3a498b41b92ed915ada7de2ad5e16631546329c03e484c3bf4e9/jupyter-1.0.0.zip", "hashes": { "md5": "7b7a957694a73ac0c19fe46c216c0ea0", "sha256": "4a855b9717c3ea24fd8ca4fd91ab5995894aecc4d20e7f39c28786a2c1869fae" - } + }, + "requires-python": null, + "size": 16690, + "upload-time": "2015-08-12T00:43:12.460314Z", + "url": "https://files.pythonhosted.org/packages/fc/21/a372b73e3a498b41b92ed915ada7de2ad5e16631546329c03e484c3bf4e9/jupyter-1.0.0.zip", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 1673841 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "jupyter", + "versions": [ + "1.0.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/jupyter/1.0.0.json b/tests/repositories/fixtures/pypi.org/json/jupyter/1.0.0.json index 644b4618729..bc047c3eee7 100644 --- a/tests/repositories/fixtures/pypi.org/json/jupyter/1.0.0.json +++ b/tests/repositories/fixtures/pypi.org/json/jupyter/1.0.0.json @@ -24,6 +24,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://jupyter.org", "keywords": null, "license": "BSD", @@ -37,6 +38,7 @@ "Download": "UNKNOWN", "Homepage": "http://jupyter.org" }, + "provides_extra": null, "release_url": "https://pypi.org/project/jupyter/1.0.0/", "requires_dist": null, "requires_python": null, @@ -45,7 +47,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 1673841, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/lockfile.json b/tests/repositories/fixtures/pypi.org/json/lockfile.json deleted file mode 100644 index e5b45c870d2..00000000000 --- a/tests/repositories/fixtures/pypi.org/json/lockfile.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "lockfile", - "files": [ - { - "filename": "lockfile-0.12.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl", - "hashes": { - "md5": "71d44ac2adeca84c00c0291e1635382a", - "sha256": "62e668c1cb0ef8eeb837d21c2f5a5748ea6eed3d079669df290fda8172825f90" - } - }, - { - "filename": "lockfile-0.12.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/17/47/72cb04a58a35ec495f96984dddb48232b551aafb95bde614605b754fe6f7/lockfile-0.12.2.tar.gz", - "hashes": { - "md5": "303430a1d9089ff9326cecbe57e35a32", - "sha256": "58c5fd9fc313dc5bf5702eeab043cde1bed7149b09bec681a82064226a331a37" - } - } - ], - "meta": { - "api-version": "1.0", - "_last-serial": 2139845 - } -} diff --git a/tests/repositories/fixtures/pypi.org/json/lockfile/0.12.2.json b/tests/repositories/fixtures/pypi.org/json/lockfile/0.12.2.json deleted file mode 100644 index 36ffa5d3fbc..00000000000 --- a/tests/repositories/fixtures/pypi.org/json/lockfile/0.12.2.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "info": { - "author": "OpenStack", - "author_email": "openstack-dev@lists.openstack.org", - "bugtrack_url": null, - "classifiers": [ - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Operating System :: MacOS", - "Operating System :: Microsoft :: Windows :: Windows NT/2000", - "Operating System :: POSIX", - "Operating System :: POSIX :: Linux", - "Programming Language :: Python", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.3", - "Topic :: Software Development :: Libraries :: Python Modules" - ], - "description": "", - "description_content_type": null, - "docs_url": "https://pythonhosted.org/lockfile/", - "download_url": "", - "downloads": { - "last_day": -1, - "last_month": -1, - "last_week": -1 - }, - "home_page": "http://launchpad.net/pylockfile", - "keywords": "", - "license": "", - "maintainer": "", - "maintainer_email": "", - "name": "lockfile", - "package_url": "https://pypi.org/project/lockfile/", - "platform": "UNKNOWN", - "project_url": "https://pypi.org/project/lockfile/", - "project_urls": { - "Homepage": "http://launchpad.net/pylockfile" - }, - "release_url": "https://pypi.org/project/lockfile/0.12.2/", - "requires_dist": null, - "requires_python": "", - "summary": "Platform-independent file locking module", - "version": "0.12.2" - }, - "last_serial": 2139845, - "urls": [ - { - "comment_text": "", - "digests": { - "md5": "71d44ac2adeca84c00c0291e1635382a", - "sha256": "62e668c1cb0ef8eeb837d21c2f5a5748ea6eed3d079669df290fda8172825f90" - }, - "downloads": -1, - "filename": "lockfile-0.12.2-py2.py3-none-any.whl", - "has_sig": false, - "md5_digest": "71d44ac2adeca84c00c0291e1635382a", - "packagetype": "bdist_wheel", - "python_version": "py2.py3", - "requires_python": null, - "size": 13564, - "upload_time": "2015-11-25T18:29:51", - "url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl" - }, - { - "comment_text": "", - "digests": { - "md5": "303430a1d9089ff9326cecbe57e35a32", - "sha256": "58c5fd9fc313dc5bf5702eeab043cde1bed7149b09bec681a82064226a331a37" - }, - "downloads": -1, - "filename": "lockfile-0.12.2.tar.gz", - "has_sig": false, - "md5_digest": "303430a1d9089ff9326cecbe57e35a32", - "packagetype": "sdist", - "python_version": "source", - "requires_python": null, - "size": 20874, - "upload_time": "2015-11-25T18:29:58", - "url": "https://files.pythonhosted.org/packages/17/47/72cb04a58a35ec495f96984dddb48232b551aafb95bde614605b754fe6f7/lockfile-0.12.2.tar.gz" - } - ] -} diff --git a/tests/repositories/fixtures/pypi.org/json/pygame-music-grid.json b/tests/repositories/fixtures/pypi.org/json/mocked/invalid-version-package.json similarity index 56% rename from tests/repositories/fixtures/pypi.org/json/pygame-music-grid.json rename to tests/repositories/fixtures/pypi.org/json/mocked/invalid-version-package.json index 9c26ae2ffd5..b8e92531226 100644 --- a/tests/repositories/fixtures/pypi.org/json/pygame-music-grid.json +++ b/tests/repositories/fixtures/pypi.org/json/mocked/invalid-version-package.json @@ -1,17 +1,17 @@ { - "name": "pygame-music-grid", + "name": "invalid-version-package", "files": [ { - "filename": "pygame_music_grid-.9-cp27-cp27m-win32.whl", - "url": "https://files.pythonhosted.org/packages/12/9b/efdbaa3c9694b6315a4410e0d494ad50c5ade22ce33f4b482bfaea3930fd/pygame_music_grid-.9-cp27-cp27m-win32.whl", + "filename": "invalid_version_package-.9-cp27-cp27m-win32.whl", + "url": "https://files.pythonhosted.org/packages/12/9b/efdbaa3c9694b6315a4410e0d494ad50c5ade22ce33f4b482bfaea3930fd/invalid_version_package-.9-cp27-cp27m-win32.whl", "hashes": { "md5": "76e2c2e8adea20377d9a7e6b6713c952", "sha256": "8d6d96001aa7f0a6a4a95e8143225b5d06e41b1131044913fecb8f85a125714b" } }, { - "filename": "pygame_music_grid-3.13-cp27-cp27m-win32.whl", - "url": "https://files.pythonhosted.org/packages/b8/2e/9c2285870c9de070a1fa5ede702ab5fb329901b3cc4028c24f44eda27c5f/pygame_music_grid-3.13-cp27-cp27m-win32.whl", + "filename": "invalid_version_package-3.13-cp27-cp27m-win32.whl", + "url": "https://files.pythonhosted.org/packages/b8/2e/9c2285870c9de070a1fa5ede702ab5fb329901b3cc4028c24f44eda27c5f/invalid_version_package-3.13-cp27-cp27m-win32.whl", "hashes": { "md5": "a83441aa7004e474bed6f6daeb61f27a", "sha256": "d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f" @@ -20,6 +20,6 @@ ], "meta": { "api-version": "1.0", - "_last-serial": 710340 + "_last-serial": 0 } } diff --git a/tests/repositories/fixtures/pypi.org/json/isort-metadata/4.3.4.json b/tests/repositories/fixtures/pypi.org/json/mocked/isort-metadata/4.3.4.json similarity index 100% rename from tests/repositories/fixtures/pypi.org/json/isort-metadata/4.3.4.json rename to tests/repositories/fixtures/pypi.org/json/mocked/isort-metadata/4.3.4.json diff --git a/tests/repositories/fixtures/pypi.org/json/mocked/six-unknown-version.json b/tests/repositories/fixtures/pypi.org/json/mocked/six-unknown-version.json new file mode 100644 index 00000000000..a784f42fbc6 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/mocked/six-unknown-version.json @@ -0,0 +1,40 @@ +{ + "files": [ + { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "six_unknown_version-1.11.0.tar.gz", + "hashes": { + "md5": "b126a063c665f4c66f23bfd8dc6ebff5", + "sha256": "1d9f63b87ee9f0aee49e9d9f8d7883319836bc43f17321b488bc38933827d2c0" + }, + "requires-python": null, + "size": 29860, + "upload-time": "2017-09-17T18:46:54.492027Z", + "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six_unknown_version-1.11.0.tar.gz", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "six_unknown_version-unknown.tar.gz", + "hashes": { + "md5": "25d3568604f921dd23532b88a0ce17e7", + "sha256": "268a4ccb159c1a2d2c79336b02e75058387b0cdbb4cea2f07846a758f48a356d" + }, + "requires-python": null, + "size": 29860, + "upload-time": "2017-09-17T18:46:54.492027Z", + "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six_unknown_version-unknown.tar.gz", + "yanked": false + } + ], + "meta": { + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "six-unknown-version", + "versions": [ + "1.11.0" + ] +} diff --git a/tests/repositories/fixtures/pypi.org/json/mocked/six-unknown-version/1.11.0.json b/tests/repositories/fixtures/pypi.org/json/mocked/six-unknown-version/1.11.0.json new file mode 100644 index 00000000000..0bc1dc7633c --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/mocked/six-unknown-version/1.11.0.json @@ -0,0 +1,69 @@ +{ + "info": { + "author": "Benjamin Peterson", + "author_email": "benjamin@python.org", + "bugtrack_url": null, + "classifiers": [ + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 3", + "Topic :: Software Development :: Libraries", + "Topic :: Utilities" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://pypi.python.org/pypi/six/", + "keywords": "", + "license": "MIT", + "maintainer": "", + "maintainer_email": "", + "name": "six-unknown-version", + "package_url": "https://pypi.org/project/six/", + "platform": "", + "project_url": "https://pypi.org/project/six/", + "project_urls": { + "Homepage": "http://pypi.python.org/pypi/six/" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/six/1.11.0/", + "requires_dist": null, + "requires_python": "", + "summary": "Python 2 and 3 compatibility utilities", + "version": "1.11.0", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "md5": "b126a063c665f4c66f23bfd8dc6ebff5", + "sha256": "1d9f63b87ee9f0aee49e9d9f8d7883319836bc43f17321b488bc38933827d2c0" + }, + "downloads": -1, + "filename": "six_unknown_version-1.11.0.tar.gz", + "has_sig": false, + "md5_digest": "25d3568604f921dd23532b88a0ce17e7", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 29860, + "upload_time": "2017-09-17T18:46:54", + "upload_time_iso_8601": "2017-09-17T18:46:54.492027Z", + "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six_unknown_version-1.11.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/mocked/with-extra-dependency.json b/tests/repositories/fixtures/pypi.org/json/mocked/with-extra-dependency.json new file mode 100644 index 00000000000..69bf7ad04e6 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/mocked/with-extra-dependency.json @@ -0,0 +1,30 @@ +{ + "files": [ + { + "core-metadata": { + "sha256": "e98cf244e0e09b017a43e1f03ac551c6b04755176e7c06ce52d6ceddc25cfad2" + }, + "data-dist-info-metadata": { + "sha256": "e98cf244e0e09b017a43e1f03ac551c6b04755176e7c06ce52d6ceddc25cfad2" + }, + "filename": "with_extra_dependency-0.12.4-py3-none-any.whl", + "hashes": { + "md5": "632fcf45cc28aed4a4dce1324d1bd1d1", + "sha256": "d88b34efa115392ee42c55d6f82cdf5e5e08221ef2e18a16ae696a80008c3499" + }, + "requires-python": null, + "size": 6718, + "upload-time": "2017-02-01T23:26:20.148511Z", + "url": "https://files.pythonhosted.org/packages/9b/7e/7d701686013c0d7dae62e0977467232a6adc2e562c23878eb3cd4f97d02e/with_extra_dependency-0.12.4-py3-none-any.whl", + "yanked": false + } + ], + "meta": { + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "with-extra-dependency", + "versions": [ + "0.12.4" + ] +} diff --git a/tests/repositories/fixtures/pypi.org/json/mocked/with-extra-dependency/0.12.4.json b/tests/repositories/fixtures/pypi.org/json/mocked/with-extra-dependency/0.12.4.json new file mode 100644 index 00000000000..15f687a18a8 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/mocked/with-extra-dependency/0.12.4.json @@ -0,0 +1,71 @@ +{ + "info": { + "author": "Benjamin Peterson", + "author_email": "benjamin@python.org", + "bugtrack_url": null, + "classifiers": [ + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 3", + "Topic :: Software Development :: Libraries", + "Topic :: Utilities" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://pypi.python.org/pypi/six/", + "keywords": "", + "license": "MIT", + "maintainer": "", + "maintainer_email": "", + "name": "with-extra-dependency", + "package_url": "https://pypi.org/project/six/", + "platform": "", + "project_url": "https://pypi.org/project/six/", + "project_urls": { + "Homepage": "http://pypi.python.org/pypi/six/" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/six/0.12.4/", + "requires_dist": [ + "filecache; extra == 'filecache'" + ], + "requires_python": "", + "summary": "Python 2 and 3 compatibility utilities", + "version": "0.12.4", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "md5": "b126a063c665f4c66f23bfd8dc6ebff5", + "sha256": "1d9f63b87ee9f0aee49e9d9f8d7883319836bc43f17321b488bc38933827d2c0" + }, + "downloads": -1, + "filename": "with_extra_dependency-0.12.4.tar.gz", + "has_sig": false, + "md5_digest": "25d3568604f921dd23532b88a0ce17e7", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 29860, + "upload_time": "2017-09-17T18:46:54", + "upload_time_iso_8601": "2017-09-17T18:46:54.492027Z", + "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/with_extra_dependency-0.12.4.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/mocked/with-transitive-extra-dependency.json b/tests/repositories/fixtures/pypi.org/json/mocked/with-transitive-extra-dependency.json new file mode 100644 index 00000000000..7303293776a --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/mocked/with-transitive-extra-dependency.json @@ -0,0 +1,30 @@ +{ + "files": [ + { + "core-metadata": { + "sha256": "2e0d683c7b4e771e915184e69ed28e4ce7c239ca89b9025f7e74d63b37c656b6" + }, + "data-dist-info-metadata": { + "sha256": "2e0d683c7b4e771e915184e69ed28e4ce7c239ca89b9025f7e74d63b37c656b6" + }, + "filename": "with_transitive_extra_dependency-0.12.4-py3-none-any.whl", + "hashes": { + "md5": "632fcf45cc28aed4a4dce1324d1bd1d1", + "sha256": "d88b34efa115392ee42c55d6f82cdf5e5e08221ef2e18a16ae696a80008c3499" + }, + "requires-python": null, + "size": 6718, + "upload-time": "2017-02-01T23:26:20.148511Z", + "url": "https://files.pythonhosted.org/packages/9b/7e/7d701686013c0d7dae62e0977467232a6adc2e562c23878eb3cd4f97d02e/with_transitive_extra_dependency-0.12.4-py3-none-any.whl", + "yanked": false + } + ], + "meta": { + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "with-transitive-extra-dependency", + "versions": [ + "0.12.4" + ] +} diff --git a/tests/repositories/fixtures/pypi.org/json/mocked/with-transitive-extra-dependency/0.12.4.json b/tests/repositories/fixtures/pypi.org/json/mocked/with-transitive-extra-dependency/0.12.4.json new file mode 100644 index 00000000000..04a1dca1b92 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/mocked/with-transitive-extra-dependency/0.12.4.json @@ -0,0 +1,71 @@ +{ + "info": { + "author": "Benjamin Peterson", + "author_email": "benjamin@python.org", + "bugtrack_url": null, + "classifiers": [ + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 3", + "Topic :: Software Development :: Libraries", + "Topic :: Utilities" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://pypi.python.org/pypi/six/", + "keywords": "", + "license": "MIT", + "maintainer": "", + "maintainer_email": "", + "name": "with-transitive-extra-dependency", + "package_url": "https://pypi.org/project/six/", + "platform": "", + "project_url": "https://pypi.org/project/six/", + "project_urls": { + "Homepage": "http://pypi.python.org/pypi/six/" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/six/0.12.4/", + "requires_dist": [ + "with-extra-dependency[filecache] (>=0.12.4,<0.13.0)" + ], + "requires_python": "", + "summary": "Python 2 and 3 compatibility utilities", + "version": "0.12.4", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "md5": "b126a063c665f4c66f23bfd8dc6ebff5", + "sha256": "1d9f63b87ee9f0aee49e9d9f8d7883319836bc43f17321b488bc38933827d2c0" + }, + "downloads": -1, + "filename": "with_transitive_extra_dependency-0.12.4.tar.gz", + "has_sig": false, + "md5_digest": "25d3568604f921dd23532b88a0ce17e7", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 29860, + "upload_time": "2017-09-17T18:46:54", + "upload_time_iso_8601": "2017-09-17T18:46:54.492027Z", + "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/with_transitive_extra_dependency-0.12.4.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/more-itertools.json b/tests/repositories/fixtures/pypi.org/json/more-itertools.json index 22bdf37b2e8..9c3f884f82f 100644 --- a/tests/repositories/fixtures/pypi.org/json/more-itertools.json +++ b/tests/repositories/fixtures/pypi.org/json/more-itertools.json @@ -1,33 +1,62 @@ { - "name": "more-itertools", "files": [ { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "more-itertools-4.1.0.tar.gz", + "hashes": { + "md5": "bf351a1050242ce3af7e475a4da1a26b", + "sha256": "bab2dc6f4be8f9a4a72177842c5283e2dff57c167439a03e3d8d901e854f0f2e" + }, + "requires-python": null, + "size": 51310, + "upload-time": "2018-01-21T15:34:22.533243Z", + "url": "https://files.pythonhosted.org/packages/db/0b/f5660bf6299ec5b9f17bd36096fa8148a1c843fa77ddfddf9bebac9301f7/more-itertools-4.1.0.tar.gz", + "yanked": false + }, + { + "core-metadata": { + "sha256": "59c3513ac4a78ad61b2a0eda88807985c4bb71cd36e6917f2f9c0ea121a7c029" + }, + "data-dist-info-metadata": { + "sha256": "59c3513ac4a78ad61b2a0eda88807985c4bb71cd36e6917f2f9c0ea121a7c029" + }, "filename": "more_itertools-4.1.0-py2-none-any.whl", - "url": "https://files.pythonhosted.org/packages/4a/88/c28e2a2da8f3dc3a391d9c97ad949f2ea0c05198222e7e6af176e5bf9b26/more_itertools-4.1.0-py2-none-any.whl", "hashes": { "md5": "c70269eabc5fae5e0d93c2eca638720e", "sha256": "5dd7dfd88d2fdaea446da478ffef8d7151fdf26ee92ac7ed7b14e8d71efe4b62" - } + }, + "requires-python": null, + "size": 47987, + "upload-time": "2018-01-21T15:34:19.304356Z", + "url": "https://files.pythonhosted.org/packages/4a/88/c28e2a2da8f3dc3a391d9c97ad949f2ea0c05198222e7e6af176e5bf9b26/more_itertools-4.1.0-py2-none-any.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "59c3513ac4a78ad61b2a0eda88807985c4bb71cd36e6917f2f9c0ea121a7c029" + }, + "data-dist-info-metadata": { + "sha256": "59c3513ac4a78ad61b2a0eda88807985c4bb71cd36e6917f2f9c0ea121a7c029" + }, "filename": "more_itertools-4.1.0-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/7a/46/886917c6a4ce49dd3fff250c01c5abac5390d57992751384fe61befc4877/more_itertools-4.1.0-py3-none-any.whl", "hashes": { "md5": "26d7c309ef806b4e563d2a7e4ceafb14", "sha256": "29b1e1661aaa56875ce090fa219fa84dfc13daecb52cd4fae321f6f57b419ec4" - } - }, - { - "filename": "more-itertools-4.1.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/db/0b/f5660bf6299ec5b9f17bd36096fa8148a1c843fa77ddfddf9bebac9301f7/more-itertools-4.1.0.tar.gz", - "hashes": { - "md5": "bf351a1050242ce3af7e475a4da1a26b", - "sha256": "bab2dc6f4be8f9a4a72177842c5283e2dff57c167439a03e3d8d901e854f0f2e" - } + }, + "requires-python": null, + "size": 47988, + "upload-time": "2018-01-21T15:34:20.567853Z", + "url": "https://files.pythonhosted.org/packages/7a/46/886917c6a4ce49dd3fff250c01c5abac5390d57992751384fe61befc4877/more_itertools-4.1.0-py3-none-any.whl", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3508946 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "more-itertools", + "versions": [ + "4.1.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/more-itertools/4.1.0.json b/tests/repositories/fixtures/pypi.org/json/more-itertools/4.1.0.json index 9157397727b..d7ae1841f01 100644 --- a/tests/repositories/fixtures/pypi.org/json/more-itertools/4.1.0.json +++ b/tests/repositories/fixtures/pypi.org/json/more-itertools/4.1.0.json @@ -2,7 +2,7 @@ "info": { "author": "Erik Rose", "author_email": "erikrose@grinchcentral.com", - "bugtrack_url": "", + "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", @@ -18,6 +18,7 @@ "Topic :: Software Development :: Libraries" ], "description": "", + "description_content_type": null, "docs_url": "https://pythonhosted.org/more-itertools/", "download_url": "", "downloads": { @@ -25,6 +26,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/erikrose/more-itertools", "keywords": "itertools,iterator,iteration,filter,peek,peekable,collate,chunk,chunked", "license": "MIT", @@ -34,15 +36,21 @@ "package_url": "https://pypi.org/project/more-itertools/", "platform": "", "project_url": "https://pypi.org/project/more-itertools/", + "project_urls": { + "Homepage": "https://github.com/erikrose/more-itertools" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/more-itertools/4.1.0/", "requires_dist": [ "six (<2.0.0,>=1.0.0)" ], "requires_python": "", "summary": "More routines for operating on iterables, beyond itertools", - "version": "4.1.0" + "version": "4.1.0", + "yanked": false, + "yanked_reason": null }, - "last_serial": 3508946, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -56,9 +64,13 @@ "md5_digest": "c70269eabc5fae5e0d93c2eca638720e", "packagetype": "bdist_wheel", "python_version": "py2", + "requires_python": null, "size": 47987, "upload_time": "2018-01-21T15:34:19", - "url": "https://files.pythonhosted.org/packages/4a/88/c28e2a2da8f3dc3a391d9c97ad949f2ea0c05198222e7e6af176e5bf9b26/more_itertools-4.1.0-py2-none-any.whl" + "upload_time_iso_8601": "2018-01-21T15:34:19.304356Z", + "url": "https://files.pythonhosted.org/packages/4a/88/c28e2a2da8f3dc3a391d9c97ad949f2ea0c05198222e7e6af176e5bf9b26/more_itertools-4.1.0-py2-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", @@ -72,9 +84,13 @@ "md5_digest": "26d7c309ef806b4e563d2a7e4ceafb14", "packagetype": "bdist_wheel", "python_version": "py3", + "requires_python": null, "size": 47988, "upload_time": "2018-01-21T15:34:20", - "url": "https://files.pythonhosted.org/packages/7a/46/886917c6a4ce49dd3fff250c01c5abac5390d57992751384fe61befc4877/more_itertools-4.1.0-py3-none-any.whl" + "upload_time_iso_8601": "2018-01-21T15:34:20.567853Z", + "url": "https://files.pythonhosted.org/packages/7a/46/886917c6a4ce49dd3fff250c01c5abac5390d57992751384fe61befc4877/more_itertools-4.1.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", @@ -88,9 +104,14 @@ "md5_digest": "bf351a1050242ce3af7e475a4da1a26b", "packagetype": "sdist", "python_version": "source", + "requires_python": null, "size": 51310, "upload_time": "2018-01-21T15:34:22", - "url": "https://files.pythonhosted.org/packages/db/0b/f5660bf6299ec5b9f17bd36096fa8148a1c843fa77ddfddf9bebac9301f7/more-itertools-4.1.0.tar.gz" + "upload_time_iso_8601": "2018-01-21T15:34:22.533243Z", + "url": "https://files.pythonhosted.org/packages/db/0b/f5660bf6299ec5b9f17bd36096fa8148a1c843fa77ddfddf9bebac9301f7/more-itertools-4.1.0.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/pastel.json b/tests/repositories/fixtures/pypi.org/json/pastel.json index 1aee564768a..b5ef49183fe 100644 --- a/tests/repositories/fixtures/pypi.org/json/pastel.json +++ b/tests/repositories/fixtures/pypi.org/json/pastel.json @@ -2,10 +2,10 @@ "files": [ { "core-metadata": { - "sha256": "cf50590355f03d1956c461705e74e4cf1f34730179656436d3c2a8dede08c4f7" + "sha256": "a3d071a0b389c60bee1f22fa02aea80322ff957ba0704d4c385f48291af2125d" }, "data-dist-info-metadata": { - "sha256": "cf50590355f03d1956c461705e74e4cf1f34730179656436d3c2a8dede08c4f7" + "sha256": "a3d071a0b389c60bee1f22fa02aea80322ff957ba0704d4c385f48291af2125d" }, "filename": "pastel-0.1.0-py3-none-any.whl", "hashes": { @@ -34,7 +34,7 @@ } ], "meta": { - "_last-serial": 8202286, + "_last-serial": 0, "api-version": "1.1" }, "name": "pastel", diff --git a/tests/repositories/fixtures/pypi.org/json/pastel/0.1.0.json b/tests/repositories/fixtures/pypi.org/json/pastel/0.1.0.json index 103dafbb4e8..0c9f7a832b5 100644 --- a/tests/repositories/fixtures/pypi.org/json/pastel/0.1.0.json +++ b/tests/repositories/fixtures/pypi.org/json/pastel/0.1.0.json @@ -46,7 +46,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 8202286, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/pluggy.json b/tests/repositories/fixtures/pypi.org/json/pluggy.json index 204851f5e62..112bbdd40e4 100644 --- a/tests/repositories/fixtures/pypi.org/json/pluggy.json +++ b/tests/repositories/fixtures/pypi.org/json/pluggy.json @@ -1,17 +1,62 @@ { - "name": "pluggy", "files": [ { + "core-metadata": { + "sha256": "4d9f559e9a7cda8e28dcedbc0f37ef6335a7560e3386c8016358ed4c5f3785a6" + }, + "data-dist-info-metadata": { + "sha256": "4d9f559e9a7cda8e28dcedbc0f37ef6335a7560e3386c8016358ed4c5f3785a6" + }, + "filename": "pluggy-0.6.0-py2-none-any.whl", + "hashes": { + "md5": "de6f342e8044d0071eefc3c9cda33055", + "sha256": "9b835f86bfe5498c87ace7f4899cb1b0c40e71c9277377f6851c74a307879285" + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 11953, + "upload-time": "2018-04-15T17:55:28.983278Z", + "url": "https://files.pythonhosted.org/packages/82/05/43e3947125a2137cba4746135c75934ceed1863f27e050fc560052104a71/pluggy-0.6.0-py2-none-any.whl", + "yanked": false + }, + { + "core-metadata": { + "sha256": "77f2f50376e7e82c6302a126af0eaf929596851f0586ced7ac1d5d381c9b6f19" + }, + "data-dist-info-metadata": { + "sha256": "77f2f50376e7e82c6302a126af0eaf929596851f0586ced7ac1d5d381c9b6f19" + }, + "filename": "pluggy-0.6.0-py3-none-any.whl", + "hashes": { + "md5": "f2fc2c3179edccaa7728650178c9133c", + "sha256": "8c646771f5eab7557d1f3924077c55408e86bdfb700f7d86a6d83abeabff4c66" + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 13723, + "upload-time": "2018-04-15T17:55:22.927924Z", + "url": "https://files.pythonhosted.org/packages/ba/65/ded3bc40bbf8d887f262f150fbe1ae6637765b5c9534bd55690ed2c0b0f7/pluggy-0.6.0-py3-none-any.whl", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "pluggy-0.6.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz", "hashes": { "md5": "ef8a88abcd501afd47cb22245fe4315a", "sha256": "a982e208d054867661d27c6d2a86b17ba05fbb6b1bdc01f42660732dd107f865" - } + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 19678, + "upload-time": "2017-11-24T16:33:11.250495Z", + "url": "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3361295 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "pluggy", + "versions": [ + "0.6.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/pluggy/0.6.0.json b/tests/repositories/fixtures/pypi.org/json/pluggy/0.6.0.json index d551cd42025..370a77fbcff 100644 --- a/tests/repositories/fixtures/pypi.org/json/pluggy/0.6.0.json +++ b/tests/repositories/fixtures/pypi.org/json/pluggy/0.6.0.json @@ -23,6 +23,7 @@ "Topic :: Utilities" ], "description": "", + "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { @@ -30,6 +31,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/pytest-dev/pluggy", "keywords": "", "license": "MIT license", @@ -39,14 +41,60 @@ "package_url": "https://pypi.org/project/pluggy/", "platform": "unix", "project_url": "https://pypi.org/project/pluggy/", + "project_urls": { + "Homepage": "https://github.com/pytest-dev/pluggy" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/pluggy/0.6.0/", "requires_dist": null, "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "plugin and hook calling mechanisms for python", - "version": "0.6.0" + "version": "0.6.0", + "yanked": false, + "yanked_reason": null }, - "last_serial": 3361295, + "last_serial": 0, "urls": [ + { + "comment_text": "", + "digests": { + "md5": "de6f342e8044d0071eefc3c9cda33055", + "sha256": "9b835f86bfe5498c87ace7f4899cb1b0c40e71c9277377f6851c74a307879285" + }, + "downloads": -1, + "filename": "pluggy-0.6.0-py2-none-any.whl", + "has_sig": false, + "md5_digest": "de6f342e8044d0071eefc3c9cda33055", + "packagetype": "bdist_wheel", + "python_version": "py2", + "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 11953, + "upload_time": "2018-04-15T17:55:28", + "upload_time_iso_8601": "2018-04-15T17:55:28.983278Z", + "url": "https://files.pythonhosted.org/packages/82/05/43e3947125a2137cba4746135c75934ceed1863f27e050fc560052104a71/pluggy-0.6.0-py2-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "md5": "f2fc2c3179edccaa7728650178c9133c", + "sha256": "8c646771f5eab7557d1f3924077c55408e86bdfb700f7d86a6d83abeabff4c66" + }, + "downloads": -1, + "filename": "pluggy-0.6.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "f2fc2c3179edccaa7728650178c9133c", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 13723, + "upload_time": "2018-04-15T17:55:22", + "upload_time_iso_8601": "2018-04-15T17:55:22.927924Z", + "url": "https://files.pythonhosted.org/packages/ba/65/ded3bc40bbf8d887f262f150fbe1ae6637765b5c9534bd55690ed2c0b0f7/pluggy-0.6.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, { "comment_text": "", "digests": { @@ -59,9 +107,14 @@ "md5_digest": "ef8a88abcd501afd47cb22245fe4315a", "packagetype": "sdist", "python_version": "source", + "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 19678, "upload_time": "2017-11-24T16:33:11", - "url": "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz" + "upload_time_iso_8601": "2017-11-24T16:33:11.250495Z", + "url": "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/poetry-core.json b/tests/repositories/fixtures/pypi.org/json/poetry-core.json index 5809479e33f..8ae5d6a07aa 100644 --- a/tests/repositories/fixtures/pypi.org/json/poetry-core.json +++ b/tests/repositories/fixtures/pypi.org/json/poetry-core.json @@ -1,19 +1,44 @@ { "files": [ { + "core-metadata": { + "sha256": "7901e9c07999287d28be06df377c9e8529ec602c583dc7e2f22c1211d5f747e3" + }, + "data-dist-info-metadata": { + "sha256": "7901e9c07999287d28be06df377c9e8529ec602c583dc7e2f22c1211d5f747e3" + }, + "filename": "poetry_core-1.5.0-py3-none-any.whl", + "hashes": { + "md5": "be7589b4902793e66d7d979bd8581591", + "sha256": "e216b70f013c47b82a72540d34347632c5bfe59fd54f5fe5d51f6a68b19aaf84" + }, + "requires-python": ">=3.7,<4.0", + "size": 464992, + "upload-time": "2023-01-28T10:52:52.445537Z", + "url": "https://files.pythonhosted.org/packages/2d/99/6b0c5fe90e247b2b7b96a27cdf39ee59a02aab3c01d7243fc0c63cd7fb73/poetry_core-1.5.0-py3-none-any.whl", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "poetry_core-1.5.0.tar.gz", "hashes": { "md5": "3f9b36a7a94cd235bfd5f05794828445", "sha256": "0ae8d28caf5c12ec1714b16d2e7157ddd52397ea6bfdeba5a9432e449a0184da" }, "requires-python": ">=3.7,<4.0", + "size": 448812, + "upload-time": "2023-01-28T10:52:53.916268Z", "url": "https://files.pythonhosted.org/packages/57/bb/2435fef60bb01f6c0891d9482c7053b50e90639f0f74d7658e99bdd4da69/poetry_core-1.5.0.tar.gz", "yanked": false } ], "meta": { - "_last-serial": 16600250, - "api-version": "1.0" + "_last-serial": 0, + "api-version": "1.1" }, - "name": "poetry-core" + "name": "poetry-core", + "versions": [ + "1.5.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/poetry-core/1.5.0.json b/tests/repositories/fixtures/pypi.org/json/poetry-core/1.5.0.json index 0eace86e46e..978e33c283b 100644 --- a/tests/repositories/fixtures/pypi.org/json/poetry-core/1.5.0.json +++ b/tests/repositories/fixtures/pypi.org/json/poetry-core/1.5.0.json @@ -23,6 +23,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/python-poetry/poetry-core", "keywords": "packaging,dependency,poetry", "license": "MIT", @@ -37,6 +38,7 @@ "Homepage": "https://github.com/python-poetry/poetry-core", "Repository": "https://github.com/python-poetry/poetry-core" }, + "provides_extra": null, "release_url": "https://pypi.org/project/poetry-core/1.5.0/", "requires_dist": [ "importlib-metadata (>=1.7.0) ; python_version < \"3.8\"" @@ -47,7 +49,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 16600250, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/poetry.json b/tests/repositories/fixtures/pypi.org/json/poetry.json deleted file mode 100644 index 854f3c7e6e7..00000000000 --- a/tests/repositories/fixtures/pypi.org/json/poetry.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "poetry", - "files": [ - { - "filename": "poetry-0.12.4-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/1b/af/013cdcc6f9d4c0bf025b3924981991a8b034db7818fd324c525b7e8a2b6c/poetry-0.12.4-py2.py3-none-any.whl", - "hashes": { - "md5": "763b00c6295dfdc3d0223eb35eadffb3", - "sha256": "1819c1587198652bafb1698b6ef1f70f4ff85682e536ca991509e9b1e679cc21" - }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - }, - { - "filename": "poetry-0.12.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/b5/4f/8a864e12a4a03f13467d5ac3d0cc67e75130ae966e3528e9ecbe3df980d6/poetry-0.12.4.tar.gz", - "hashes": { - "md5": "49660b27968a8b2cfe0c451e4489a8ae", - "sha256": "484b55eea5617b4bc20ca538cfcc7e0fcb870fb1390abab4d0af33f22718434d" - }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - } - ], - "meta": { - "api-version": "1.0", - "_last-serial": 4399781 - } -} diff --git a/tests/repositories/fixtures/pypi.org/json/poetry/0.12.4.json b/tests/repositories/fixtures/pypi.org/json/poetry/0.12.4.json deleted file mode 100644 index 5e41f3e2858..00000000000 --- a/tests/repositories/fixtures/pypi.org/json/poetry/0.12.4.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "info": { - "author": "Sébastien Eustace", - "author_email": "sebastien@eustace.io", - "bugtrack_url": null, - "classifiers": [ - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Topic :: Software Development :: Build Tools", - "Topic :: Software Development :: Libraries :: Python Modules" - ], - "description": "", - "description_content_type": "text/markdown", - "docs_url": null, - "download_url": "", - "downloads": { - "last_day": -1, - "last_month": -1, - "last_week": -1 - }, - "home_page": "https://python-poetry.org/", - "keywords": "packaging,dependency,poetry", - "license": "MIT", - "maintainer": "Sébastien Eustace", - "maintainer_email": "sebastien@eustace.io", - "name": "poetry", - "package_url": "https://pypi.org/project/poetry/", - "platform": "", - "project_url": "https://pypi.org/project/poetry/", - "project_urls": { - "Documentation": "https://python-poetry.org/docs", - "Homepage": "https://python-poetry.org/", - "Repository": "https://github.com/python-poetry/poetry" - }, - "release_url": "https://pypi.org/project/poetry/0.12.4/", - "requires_dist": [ - "cachecontrol[filecache] (>=0.12.4,<0.13.0)" - ], - "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", - "summary": "Python dependency management and packaging made easy.", - "version": "0.12.4" - }, - "last_serial": 4399781, - "urls": [ - { - "comment_text": "", - "digests": { - "md5": "763b00c6295dfdc3d0223eb35eadffb3", - "sha256": "1819c1587198652bafb1698b6ef1f70f4ff85682e536ca991509e9b1e679cc21" - }, - "downloads": -1, - "filename": "poetry-0.12.4-py2.py3-none-any.whl", - "has_sig": false, - "md5_digest": "763b00c6295dfdc3d0223eb35eadffb3", - "packagetype": "bdist_wheel", - "python_version": "py2.py3", - "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", - "size": 630184, - "upload_time": "2018-10-21T16:33:56", - "url": "https://files.pythonhosted.org/packages/1b/af/013cdcc6f9d4c0bf025b3924981991a8b034db7818fd324c525b7e8a2b6c/poetry-0.12.4-py2.py3-none-any.whl" - }, - { - "comment_text": "", - "digests": { - "md5": "49660b27968a8b2cfe0c451e4489a8ae", - "sha256": "484b55eea5617b4bc20ca538cfcc7e0fcb870fb1390abab4d0af33f22718434d" - }, - "downloads": -1, - "filename": "poetry-0.12.4.tar.gz", - "has_sig": false, - "md5_digest": "49660b27968a8b2cfe0c451e4489a8ae", - "packagetype": "sdist", - "python_version": "source", - "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", - "size": 146262, - "upload_time": "2018-10-21T16:33:58", - "url": "https://files.pythonhosted.org/packages/b5/4f/8a864e12a4a03f13467d5ac3d0cc67e75130ae966e3528e9ecbe3df980d6/poetry-0.12.4.tar.gz" - } - ] -} diff --git a/tests/repositories/fixtures/pypi.org/json/py.json b/tests/repositories/fixtures/pypi.org/json/py.json index d2e4aaea1cb..4d0c746b260 100644 --- a/tests/repositories/fixtures/pypi.org/json/py.json +++ b/tests/repositories/fixtures/pypi.org/json/py.json @@ -1,25 +1,44 @@ { - "name": "py", "files": [ { + "core-metadata": { + "sha256": "6922e816d9a839c9735c50ad24e50bdc0e42c3727cf742f5121e3d6bf58d79e2" + }, + "data-dist-info-metadata": { + "sha256": "6922e816d9a839c9735c50ad24e50bdc0e42c3727cf742f5121e3d6bf58d79e2" + }, "filename": "py-1.5.3-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/67/a5/f77982214dd4c8fd104b066f249adea2c49e25e8703d284382eb5e9ab35a/py-1.5.3-py2.py3-none-any.whl", "hashes": { "md5": "98652ecee6fc3bb5393a17828f93e1fb", "sha256": "43ee6c7f95e0ec6a906de49906b79d138d89728fff17109d49f086abc2fdd985" - } + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 84903, + "upload-time": "2018-03-22T10:06:50.318783Z", + "url": "https://files.pythonhosted.org/packages/67/a5/f77982214dd4c8fd104b066f249adea2c49e25e8703d284382eb5e9ab35a/py-1.5.3-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "py-1.5.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz", "hashes": { "md5": "623e80cfc06df930414a9ce4bf0fd6c9", "sha256": "2df2c513c3af11de15f58189ba5539ddc4768c6f33816dc5c03950c8bd6180fa" - } + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 202335, + "upload-time": "2018-03-22T10:06:52.627078Z", + "url": "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3694828 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "py", + "versions": [ + "1.5.3" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/py/1.5.3.json b/tests/repositories/fixtures/pypi.org/json/py/1.5.3.json index fcad09a3e16..003cb228076 100644 --- a/tests/repositories/fixtures/pypi.org/json/py/1.5.3.json +++ b/tests/repositories/fixtures/pypi.org/json/py/1.5.3.json @@ -2,7 +2,7 @@ "info": { "author": "holger krekel, Ronny Pfannschmidt, Benjamin Peterson and others", "author_email": "pytest-dev@python.org", - "bugtrack_url": "https://github.com/pytest-dev/py/issues", + "bugtrack_url": null, "classifiers": [ "Development Status :: 6 - Mature", "Intended Audience :: Developers", @@ -24,6 +24,7 @@ "Topic :: Utilities" ], "description": "", + "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { @@ -31,6 +32,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://py.readthedocs.io/", "keywords": "", "license": "MIT license", @@ -40,13 +42,19 @@ "package_url": "https://pypi.org/project/py/", "platform": "unix", "project_url": "https://pypi.org/project/py/", + "project_urls": { + "Homepage": "http://py.readthedocs.io/" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/py/1.5.3/", "requires_dist": null, "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "library with cross-python path, ini-parsing, io, code, log facilities", - "version": "1.5.3" + "version": "1.5.3", + "yanked": false, + "yanked_reason": null }, - "last_serial": 3694828, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -60,9 +68,13 @@ "md5_digest": "98652ecee6fc3bb5393a17828f93e1fb", "packagetype": "bdist_wheel", "python_version": "py2.py3", + "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 84903, "upload_time": "2018-03-22T10:06:50", - "url": "https://files.pythonhosted.org/packages/67/a5/f77982214dd4c8fd104b066f249adea2c49e25e8703d284382eb5e9ab35a/py-1.5.3-py2.py3-none-any.whl" + "upload_time_iso_8601": "2018-03-22T10:06:50.318783Z", + "url": "https://files.pythonhosted.org/packages/67/a5/f77982214dd4c8fd104b066f249adea2c49e25e8703d284382eb5e9ab35a/py-1.5.3-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", @@ -76,9 +88,14 @@ "md5_digest": "623e80cfc06df930414a9ce4bf0fd6c9", "packagetype": "sdist", "python_version": "source", + "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 202335, "upload_time": "2018-03-22T10:06:52", - "url": "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz" + "upload_time_iso_8601": "2018-03-22T10:06:52.627078Z", + "url": "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/pylev.json b/tests/repositories/fixtures/pypi.org/json/pylev.json index 52f24de0e21..80756bda9a1 100644 --- a/tests/repositories/fixtures/pypi.org/json/pylev.json +++ b/tests/repositories/fixtures/pypi.org/json/pylev.json @@ -1,17 +1,42 @@ { - "name": "pylev", "files": [ { + "core-metadata": { + "sha256": "4a5b8c2be7e6f09ffe9a9b8018091c79074f61601fbbb693d6a3bd93bb4d5242" + }, + "data-dist-info-metadata": { + "sha256": "4a5b8c2be7e6f09ffe9a9b8018091c79074f61601fbbb693d6a3bd93bb4d5242" + }, "filename": "pylev-1.3.0-py2.py3-none-any.whl", + "hashes": { + "sha256": "1d29a87beb45ebe1e821e7a3b10da2b6b2f4c79b43f482c2df1a1f748a6e114e" + }, + "requires-python": null, + "size": 4927, + "upload-time": "2014-10-23T00:24:34.125905Z", "url": "https://files.pythonhosted.org/packages/40/1c/7dff1d242bf1e19f9c6202f0ba4e6fd18cc7ecb8bc85b17b2d16c806e228/pylev-1.3.0-py2.py3-none-any.whl", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "pylev-1.3.0.tar.gz", "hashes": { - "md5": "4a18ac5d436decb5e4ef80633930559e", - "sha256": "79fe82d35708f7308ec60e7f424b15fc294fb43aca6c673679051a73be1b1e1d" - } + "sha256": "063910098161199b81e453025653ec53556c1be7165a9b7c50be2f4d57eae1c3" + }, + "requires-python": null, + "size": 3193, + "upload-time": "2014-10-23T00:24:19.460779Z", + "url": "https://files.pythonhosted.org/packages/cc/61/dab2081d3d86dcf0b9f5dcfb11b256d76cd14aad7ccdd7c8dd5e7f7e41a0/pylev-1.3.0.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 1279536 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "pylev", + "versions": [ + "1.3.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/pylev/1.3.0.json b/tests/repositories/fixtures/pypi.org/json/pylev/1.3.0.json index 37d59287459..4efc77e47ad 100644 --- a/tests/repositories/fixtures/pypi.org/json/pylev/1.3.0.json +++ b/tests/repositories/fixtures/pypi.org/json/pylev/1.3.0.json @@ -20,6 +20,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://github.com/toastdriven/pylev", "keywords": null, "license": "UNKNOWN", @@ -33,6 +34,7 @@ "Download": "UNKNOWN", "Homepage": "http://github.com/toastdriven/pylev" }, + "provides_extra": null, "release_url": "https://pypi.org/project/pylev/1.3.0/", "requires_dist": null, "requires_python": null, @@ -41,18 +43,19 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 10513237, + "last_serial": 0, "urls": [ { "comment_text": "", "digests": { - "md5": "4a18ac5d436decb5e4ef80633930559e", - "sha256": "79fe82d35708f7308ec60e7f424b15fc294fb43aca6c673679051a73be1b1e1d" + "blake2b_256": "401c7dff1d242bf1e19f9c6202f0ba4e6fd18cc7ecb8bc85b17b2d16c806e228", + "md5": "6da14dfce5034873fc5c2d7a6e83dc29", + "sha256": "1d29a87beb45ebe1e821e7a3b10da2b6b2f4c79b43f482c2df1a1f748a6e114e" }, "downloads": -1, "filename": "pylev-1.3.0-py2.py3-none-any.whl", "has_sig": false, - "md5_digest": "4a18ac5d436decb5e4ef80633930559e", + "md5_digest": "6da14dfce5034873fc5c2d7a6e83dc29", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, @@ -66,13 +69,14 @@ { "comment_text": "", "digests": { - "md5": "4a43a124071fbaceee448320adce16df", - "sha256": "80a7c3932ef653ae7f1d09fb0fd73476b48db58c85a31e6ef401848562c395f0" + "blake2b_256": "cc61dab2081d3d86dcf0b9f5dcfb11b256d76cd14aad7ccdd7c8dd5e7f7e41a0", + "md5": "3be579cfc32ce5140cc04001f898741b", + "sha256": "063910098161199b81e453025653ec53556c1be7165a9b7c50be2f4d57eae1c3" }, "downloads": -1, "filename": "pylev-1.3.0.tar.gz", "has_sig": false, - "md5_digest": "4a43a124071fbaceee448320adce16df", + "md5_digest": "3be579cfc32ce5140cc04001f898741b", "packagetype": "sdist", "python_version": "source", "requires_python": null, diff --git a/tests/repositories/fixtures/pypi.org/json/pytest.json b/tests/repositories/fixtures/pypi.org/json/pytest.json index 6403f8a9a43..40cc11d5521 100644 --- a/tests/repositories/fixtures/pypi.org/json/pytest.json +++ b/tests/repositories/fixtures/pypi.org/json/pytest.json @@ -1,25 +1,77 @@ { - "name": "pytest", "files": [ { + "core-metadata": { + "sha256": "3825a201ef8accd23ae8e728ac48c8f06fdf04cbdf2aa5f0729cbcab5d06a833" + }, + "data-dist-info-metadata": { + "sha256": "3825a201ef8accd23ae8e728ac48c8f06fdf04cbdf2aa5f0729cbcab5d06a833" + }, "filename": "pytest-3.5.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/ed/96/271c93f75212c06e2a7ec3e2fa8a9c90acee0a4838dc05bf379ea09aae31/pytest-3.5.0-py2.py3-none-any.whl", "hashes": { "md5": "d3b1e9aea9e5b9e7a226d8b08aa43662", "sha256": "28e4d9c2ae3196d74805c2eba24f350ae4c791a5b9b397c79b41506a48dc64ca" - } + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 194247, + "upload-time": "2018-03-22T23:47:54.595523Z", + "url": "https://files.pythonhosted.org/packages/ed/96/271c93f75212c06e2a7ec3e2fa8a9c90acee0a4838dc05bf379ea09aae31/pytest-3.5.0-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "pytest-3.5.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/2d/56/6019153cdd743300c5688ab3b07702355283e53c83fbf922242c053ffb7b/pytest-3.5.0.tar.gz", "hashes": { "md5": "ccd78dac54112045f561c4df86631f19", "sha256": "677b1d6decd29c041fe64276f29f79fbe66e40c59e445eb251366b4a8ab8bf68" - } + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 830816, + "upload-time": "2018-03-22T23:47:56.511852Z", + "url": "https://files.pythonhosted.org/packages/2d/56/6019153cdd743300c5688ab3b07702355283e53c83fbf922242c053ffb7b/pytest-3.5.0.tar.gz", + "yanked": false + }, + { + "core-metadata": { + "sha256": "8a80e51c143666a2d213dc466ec5be4ab558c6d84457173f4ed079f4331ebb71" + }, + "data-dist-info-metadata": { + "sha256": "8a80e51c143666a2d213dc466ec5be4ab558c6d84457173f4ed079f4331ebb71" + }, + "filename": "pytest-3.5.1-py2.py3-none-any.whl", + "hashes": { + "md5": "f1de372a436700e3a785e85c11d15821", + "sha256": "6d3e83b1c1697d220137e436980e73b3ca674f643e666d7c24b0321cb57b76a4" + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 192143, + "upload-time": "2018-04-24T21:37:43.104462Z", + "url": "https://files.pythonhosted.org/packages/76/52/fc48d02492d9e6070cb672d9133382e83084f567f88eff1c27bd2c6c27a8/pytest-3.5.1-py2.py3-none-any.whl", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "pytest-3.5.1.tar.gz", + "hashes": { + "md5": "961104636090457187851ccb9ef0f677", + "sha256": "b8fe151f3e181801dd38583a1c03818fbc662a8fce96c9063a0af624613e78f8" + }, + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 830571, + "upload-time": "2018-04-24T21:37:44.492084Z", + "url": "https://files.pythonhosted.org/packages/b2/85/24954df0ea8156599563b753de54383a5d702081093b7953334e4701b8d8/pytest-3.5.1.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3697219 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "pytest", + "versions": [ + "3.5.0", + "3.5.1" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/pytest/3.5.0.json b/tests/repositories/fixtures/pypi.org/json/pytest/3.5.0.json index 84db5b64a75..5bd873edb87 100644 --- a/tests/repositories/fixtures/pypi.org/json/pytest/3.5.0.json +++ b/tests/repositories/fixtures/pypi.org/json/pytest/3.5.0.json @@ -2,7 +2,7 @@ "info": { "author": "Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others", "author_email": "", - "bugtrack_url": "https://github.com/pytest-dev/pytest/issues", + "bugtrack_url": null, "classifiers": [ "Development Status :: 6 - Mature", "Intended Audience :: Developers", @@ -22,6 +22,7 @@ "Topic :: Utilities" ], "description": "", + "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { @@ -29,6 +30,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://pytest.org", "keywords": "test unittest", "license": "MIT license", @@ -38,6 +40,10 @@ "package_url": "https://pypi.org/project/pytest/", "platform": "unix", "project_url": "https://pypi.org/project/pytest/", + "project_urls": { + "Homepage": "http://pytest.org" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/pytest/3.5.0/", "requires_dist": [ "py (>=1.5.0)", @@ -51,9 +57,11 @@ ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "pytest: simple powerful testing with Python", - "version": "3.5.0" + "version": "3.5.0", + "yanked": false, + "yanked_reason": null }, - "last_serial": 3697219, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -67,9 +75,13 @@ "md5_digest": "d3b1e9aea9e5b9e7a226d8b08aa43662", "packagetype": "bdist_wheel", "python_version": "py2.py3", + "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 194247, "upload_time": "2018-03-22T23:47:54", - "url": "https://files.pythonhosted.org/packages/ed/96/271c93f75212c06e2a7ec3e2fa8a9c90acee0a4838dc05bf379ea09aae31/pytest-3.5.0-py2.py3-none-any.whl" + "upload_time_iso_8601": "2018-03-22T23:47:54.595523Z", + "url": "https://files.pythonhosted.org/packages/ed/96/271c93f75212c06e2a7ec3e2fa8a9c90acee0a4838dc05bf379ea09aae31/pytest-3.5.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", @@ -83,9 +95,14 @@ "md5_digest": "ccd78dac54112045f561c4df86631f19", "packagetype": "sdist", "python_version": "source", + "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 830816, "upload_time": "2018-03-22T23:47:56", - "url": "https://files.pythonhosted.org/packages/2d/56/6019153cdd743300c5688ab3b07702355283e53c83fbf922242c053ffb7b/pytest-3.5.0.tar.gz" + "upload_time_iso_8601": "2018-03-22T23:47:56.511852Z", + "url": "https://files.pythonhosted.org/packages/2d/56/6019153cdd743300c5688ab3b07702355283e53c83fbf922242c053ffb7b/pytest-3.5.0.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/pytest/3.5.1.json b/tests/repositories/fixtures/pypi.org/json/pytest/3.5.1.json index 780be8b8e2b..b5c27a3f94b 100644 --- a/tests/repositories/fixtures/pypi.org/json/pytest/3.5.1.json +++ b/tests/repositories/fixtures/pypi.org/json/pytest/3.5.1.json @@ -30,6 +30,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://pytest.org", "keywords": "test unittest", "license": "MIT license", @@ -44,6 +45,7 @@ "Source": "https://github.com/pytest-dev/pytest", "Tracker": "https://github.com/pytest-dev/pytest/issues" }, + "provides_extra": null, "release_url": "https://pypi.org/project/pytest/3.5.1/", "requires_dist": [ "py (>=1.5.0)", @@ -61,7 +63,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 13600682, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/python-language-server.json b/tests/repositories/fixtures/pypi.org/json/python-language-server.json index c17601e5776..a8e3b08a408 100644 --- a/tests/repositories/fixtures/pypi.org/json/python-language-server.json +++ b/tests/repositories/fixtures/pypi.org/json/python-language-server.json @@ -16,7 +16,7 @@ } ], "meta": { - "_last-serial": 8878952, + "_last-serial": 0, "api-version": "1.1" }, "name": "python-language-server", diff --git a/tests/repositories/fixtures/pypi.org/json/python-language-server/0.21.2.json b/tests/repositories/fixtures/pypi.org/json/python-language-server/0.21.2.json index c249c2b8324..76975d7f695 100644 --- a/tests/repositories/fixtures/pypi.org/json/python-language-server/0.21.2.json +++ b/tests/repositories/fixtures/pypi.org/json/python-language-server/0.21.2.json @@ -35,7 +35,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 8878952, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/pyyaml.json b/tests/repositories/fixtures/pypi.org/json/pyyaml.json index f890908c1a0..cc61c6aec04 100644 --- a/tests/repositories/fixtures/pypi.org/json/pyyaml.json +++ b/tests/repositories/fixtures/pypi.org/json/pyyaml.json @@ -1,97 +1,195 @@ { - "name": "PyYAML", "files": [ { + "core-metadata": { + "sha256": "eb5621acdfd1a084efcc04d1a5292117422c616dc2ea004d8e760aadbd3f8388" + }, + "data-dist-info-metadata": { + "sha256": "eb5621acdfd1a084efcc04d1a5292117422c616dc2ea004d8e760aadbd3f8388" + }, "filename": "PyYAML-3.13-cp27-cp27m-win32.whl", - "url": "https://files.pythonhosted.org/packages/b8/2e/9c2285870c9de070a1fa5ede702ab5fb329901b3cc4028c24f44eda27c5f/PyYAML-3.13-cp27-cp27m-win32.whl", "hashes": { - "md5": "57862339584f6f631cb2cd434c0dce22", - "sha256": "0cac9398d467c1d43b14380faeaa90dfc99223c0cf8d08ddb5168156240e9fc0" - } + "sha256": "d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f" + }, + "requires-python": null, + "size": 191712, + "upload-time": "2018-07-05T22:53:15.231061Z", + "url": "https://files.pythonhosted.org/packages/b8/2e/9c2285870c9de070a1fa5ede702ab5fb329901b3cc4028c24f44eda27c5f/PyYAML-3.13-cp27-cp27m-win32.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "eb5621acdfd1a084efcc04d1a5292117422c616dc2ea004d8e760aadbd3f8388" + }, + "data-dist-info-metadata": { + "sha256": "eb5621acdfd1a084efcc04d1a5292117422c616dc2ea004d8e760aadbd3f8388" + }, "filename": "PyYAML-3.13-cp27-cp27m-win_amd64.whl", - "url": "https://files.pythonhosted.org/packages/df/4d/1ef8d60464a171112401e17a3a3e88fdb1d5b44af7606e8652b2f39ee9ce/PyYAML-3.13-cp27-cp27m-win_amd64.whl", "hashes": { - "md5": "595ab135b3b5d73984b6aa3c430804dc", - "sha256": "22604446b01612af63e369c6bed7a2c454eda9bd5ccb7edf9bfbfd39a14ae464" - } + "sha256": "e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537" + }, + "requires-python": null, + "size": 209872, + "upload-time": "2018-07-05T22:53:16.904443Z", + "url": "https://files.pythonhosted.org/packages/df/4d/1ef8d60464a171112401e17a3a3e88fdb1d5b44af7606e8652b2f39ee9ce/PyYAML-3.13-cp27-cp27m-win_amd64.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, + "data-dist-info-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, "filename": "PyYAML-3.13-cp34-cp34m-win32.whl", - "url": "https://files.pythonhosted.org/packages/35/f0/cf0363b5c431c3a828284903aeacc6bdbba342fd4d7871dda9a3b0b00d15/PyYAML-3.13-cp34-cp34m-win32.whl", "hashes": { - "md5": "febd1e0a6e54bc16ead1a355a41ef2a0", - "sha256": "8e537c28684698935e2c86a5ed6bc5af736e46712e9a7f8a4c69f3694f4b6bc3" - } + "sha256": "558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3" + }, + "requires-python": null, + "size": 192898, + "upload-time": "2018-07-05T22:53:19.190872Z", + "url": "https://files.pythonhosted.org/packages/35/f0/cf0363b5c431c3a828284903aeacc6bdbba342fd4d7871dda9a3b0b00d15/PyYAML-3.13-cp34-cp34m-win32.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, + "data-dist-info-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, "filename": "PyYAML-3.13-cp34-cp34m-win_amd64.whl", - "url": "https://files.pythonhosted.org/packages/8c/bc/8950092a86259dc511e02a4c3a517ed4b28a254e4da134e3c04e5264e5a3/PyYAML-3.13-cp34-cp34m-win_amd64.whl", "hashes": { - "md5": "ca6e472447f541d5a1bf5ff998e8fc2e", - "sha256": "a1ecddafcc43a383acb99f241ca7da0011082dd7a9236495ba8a87fbad0c40d2" - } + "sha256": "d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04" + }, + "requires-python": null, + "size": 206242, + "upload-time": "2018-07-05T22:53:20.770605Z", + "url": "https://files.pythonhosted.org/packages/8c/bc/8950092a86259dc511e02a4c3a517ed4b28a254e4da134e3c04e5264e5a3/PyYAML-3.13-cp34-cp34m-win_amd64.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, + "data-dist-info-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, "filename": "PyYAML-3.13-cp35-cp35m-win32.whl", - "url": "https://files.pythonhosted.org/packages/29/33/8bbcd3740d9e96cfb57427b8db7a12093402a3a83f2054887e027b2849de/PyYAML-3.13-cp35-cp35m-win32.whl", "hashes": { - "md5": "2f45666423475f050b5b5785930e5876", - "sha256": "e0aa0b28e3faf7a8bcb8f4ab3d28e4fb01d687bcfb75e5f6b12d53b82f99b6cc" - } + "sha256": "a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1" + }, + "requires-python": null, + "size": 187499, + "upload-time": "2018-07-05T22:53:22.576919Z", + "url": "https://files.pythonhosted.org/packages/29/33/8bbcd3740d9e96cfb57427b8db7a12093402a3a83f2054887e027b2849de/PyYAML-3.13-cp35-cp35m-win32.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, + "data-dist-info-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, "filename": "PyYAML-3.13-cp35-cp35m-win_amd64.whl", - "url": "https://files.pythonhosted.org/packages/ad/d4/d895fb7ac1b0828151b829a32cefc8a8b58b4499570520b91af20982b880/PyYAML-3.13-cp35-cp35m-win_amd64.whl", "hashes": { - "md5": "a21cdc697d03b9b446f95e6d6b5ab93e", - "sha256": "b96803e106c5ebbae46018e0523ec7dc970d95b2cf8761d6c0a2c75d8d5c027b" - } + "sha256": "bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613" + }, + "requires-python": null, + "size": 205387, + "upload-time": "2018-07-05T22:53:24.438646Z", + "url": "https://files.pythonhosted.org/packages/ad/d4/d895fb7ac1b0828151b829a32cefc8a8b58b4499570520b91af20982b880/PyYAML-3.13-cp35-cp35m-win_amd64.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, + "data-dist-info-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, "filename": "PyYAML-3.13-cp36-cp36m-win32.whl", - "url": "https://files.pythonhosted.org/packages/fb/51/0c49c6caafe8d9a27ad9b0ca9f91adda5a5072b9efbbe7585fb97a4c71c4/PyYAML-3.13-cp36-cp36m-win32.whl", "hashes": { - "md5": "088e59a995c3387ebe666841bc02ab1b", - "sha256": "9a3dbf2d52067e59d74d161655e6d841596cd736ad17f5fdadd9eb9416faddef" - } + "sha256": "40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a" + }, + "requires-python": null, + "size": 188186, + "upload-time": "2018-07-05T22:53:25.923669Z", + "url": "https://files.pythonhosted.org/packages/fb/51/0c49c6caafe8d9a27ad9b0ca9f91adda5a5072b9efbbe7585fb97a4c71c4/PyYAML-3.13-cp36-cp36m-win32.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, + "data-dist-info-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, "filename": "PyYAML-3.13-cp36-cp36m-win_amd64.whl", - "url": "https://files.pythonhosted.org/packages/4f/ca/5fad249c5032270540c24d2189b0ddf1396aac49b0bdc548162edcf14131/PyYAML-3.13-cp36-cp36m-win_amd64.whl", "hashes": { - "md5": "a4db4b28a9d04264f93d1aaf0d0ae88d", - "sha256": "cc1531e17d6de77b03971719feb1e8e5ff976bea3d645c3772dbb9fbb91ffde1" - } + "sha256": "3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b" + }, + "requires-python": null, + "size": 206277, + "upload-time": "2018-07-05T22:53:27.386610Z", + "url": "https://files.pythonhosted.org/packages/4f/ca/5fad249c5032270540c24d2189b0ddf1396aac49b0bdc548162edcf14131/PyYAML-3.13-cp36-cp36m-win_amd64.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, + "data-dist-info-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, "filename": "PyYAML-3.13-cp37-cp37m-win32.whl", - "url": "https://files.pythonhosted.org/packages/5c/ed/d6557f70daaaab6ee5cd2f8ccf7bedd63081e522e38679c03840e1acc114/PyYAML-3.13-cp37-cp37m-win32.whl", "hashes": { - "md5": "60fd8936e8bdf917a750172f33b62d51", - "sha256": "a0184bd61052fa6942d65c294468116eaf00f43669437d46ad5530f7005c7f37" - } + "sha256": "e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" + }, + "requires-python": null, + "size": 188313, + "upload-time": "2018-07-05T22:53:28.995194Z", + "url": "https://files.pythonhosted.org/packages/5c/ed/d6557f70daaaab6ee5cd2f8ccf7bedd63081e522e38679c03840e1acc114/PyYAML-3.13-cp37-cp37m-win32.whl", + "yanked": false }, { + "core-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, + "data-dist-info-metadata": { + "sha256": "bb6a78439e80d7904471d134b006d366645dfdf9241495f8a9626f778f9dc5bd" + }, "filename": "PyYAML-3.13-cp37-cp37m-win_amd64.whl", - "url": "https://files.pythonhosted.org/packages/bf/96/d02ef8e1f3073e07ffdc240444e5041f403f29c0775f9f1653f18221082f/PyYAML-3.13-cp37-cp37m-win_amd64.whl", "hashes": { - "md5": "36d19ecd2632ba0e0a362f2a28d9244a", - "sha256": "84492bd518aeafdf1d2bceae160a60d748f75eb815533d96b8232205161f21f4" - } + "sha256": "aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1" + }, + "requires-python": null, + "size": 206614, + "upload-time": "2018-07-05T22:53:30.864210Z", + "url": "https://files.pythonhosted.org/packages/bf/96/d02ef8e1f3073e07ffdc240444e5041f403f29c0775f9f1653f18221082f/PyYAML-3.13-cp37-cp37m-win_amd64.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "PyYAML-3.13.tar.gz", - "url": "https://files.pythonhosted.org/packages/9e/a3/1d13970c3f36777c583f136c136f804d70f500168edc1edea6daa7200769/PyYAML-3.13.tar.gz", "hashes": { - "md5": "406a166b8ce8df5790f7689ad45d201e", - "sha256": "e6c07f136ba90afc1b049d7577b4f955845d796f359324662758f403929fd481" - } + "sha256": "3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf" + }, + "requires-python": null, + "size": 270607, + "upload-time": "2018-07-05T22:52:16.800539Z", + "url": "https://files.pythonhosted.org/packages/9e/a3/1d13970c3f36777c583f136c136f804d70f500168edc1edea6daa7200769/PyYAML-3.13.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 4034753 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "pyyaml", + "versions": [ + "3.13.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/pyyaml/3.13.0.json b/tests/repositories/fixtures/pypi.org/json/pyyaml/3.13.0.json index b923da45330..234665f10da 100644 --- a/tests/repositories/fixtures/pypi.org/json/pyyaml/3.13.0.json +++ b/tests/repositories/fixtures/pypi.org/json/pyyaml/3.13.0.json @@ -26,6 +26,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://pyyaml.org/wiki/PyYAML", "keywords": "", "license": "MIT", @@ -39,6 +40,7 @@ "Download": "http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz", "Homepage": "http://pyyaml.org/wiki/PyYAML" }, + "provides_extra": null, "release_url": "https://pypi.org/project/PyYAML/3.13/", "requires_dist": null, "requires_python": "", @@ -47,18 +49,19 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 11716096, + "last_serial": 0, "urls": [ { "comment_text": "", "digests": { - "md5": "57862339584f6f631cb2cd434c0dce22", - "sha256": "0cac9398d467c1d43b14380faeaa90dfc99223c0cf8d08ddb5168156240e9fc0" + "blake2b_256": "b82e9c2285870c9de070a1fa5ede702ab5fb329901b3cc4028c24f44eda27c5f", + "md5": "a83441aa7004e474bed6f6daeb61f27a", + "sha256": "d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f" }, "downloads": -1, "filename": "PyYAML-3.13-cp27-cp27m-win32.whl", "has_sig": false, - "md5_digest": "57862339584f6f631cb2cd434c0dce22", + "md5_digest": "a83441aa7004e474bed6f6daeb61f27a", "packagetype": "bdist_wheel", "python_version": "cp27", "requires_python": null, @@ -72,13 +75,14 @@ { "comment_text": "", "digests": { - "md5": "595ab135b3b5d73984b6aa3c430804dc", - "sha256": "22604446b01612af63e369c6bed7a2c454eda9bd5ccb7edf9bfbfd39a14ae464" + "blake2b_256": "df4d1ef8d60464a171112401e17a3a3e88fdb1d5b44af7606e8652b2f39ee9ce", + "md5": "dd05ba2d6cb042452a3849dea13b94f0", + "sha256": "e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537" }, "downloads": -1, "filename": "PyYAML-3.13-cp27-cp27m-win_amd64.whl", "has_sig": false, - "md5_digest": "595ab135b3b5d73984b6aa3c430804dc", + "md5_digest": "dd05ba2d6cb042452a3849dea13b94f0", "packagetype": "bdist_wheel", "python_version": "cp27", "requires_python": null, @@ -92,13 +96,14 @@ { "comment_text": "", "digests": { - "md5": "febd1e0a6e54bc16ead1a355a41ef2a0", - "sha256": "8e537c28684698935e2c86a5ed6bc5af736e46712e9a7f8a4c69f3694f4b6bc3" + "blake2b_256": "35f0cf0363b5c431c3a828284903aeacc6bdbba342fd4d7871dda9a3b0b00d15", + "md5": "49365caa070d53e30deceae118e4fea8", + "sha256": "558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3" }, "downloads": -1, "filename": "PyYAML-3.13-cp34-cp34m-win32.whl", "has_sig": false, - "md5_digest": "febd1e0a6e54bc16ead1a355a41ef2a0", + "md5_digest": "49365caa070d53e30deceae118e4fea8", "packagetype": "bdist_wheel", "python_version": "cp34", "requires_python": null, @@ -112,13 +117,14 @@ { "comment_text": "", "digests": { - "md5": "ca6e472447f541d5a1bf5ff998e8fc2e", - "sha256": "a1ecddafcc43a383acb99f241ca7da0011082dd7a9236495ba8a87fbad0c40d2" + "blake2b_256": "8cbc8950092a86259dc511e02a4c3a517ed4b28a254e4da134e3c04e5264e5a3", + "md5": "0c486a54c19dd18b9e65a559886935c4", + "sha256": "d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04" }, "downloads": -1, "filename": "PyYAML-3.13-cp34-cp34m-win_amd64.whl", "has_sig": false, - "md5_digest": "ca6e472447f541d5a1bf5ff998e8fc2e", + "md5_digest": "0c486a54c19dd18b9e65a559886935c4", "packagetype": "bdist_wheel", "python_version": "cp34", "requires_python": null, @@ -132,13 +138,14 @@ { "comment_text": "", "digests": { - "md5": "2f45666423475f050b5b5785930e5876", - "sha256": "e0aa0b28e3faf7a8bcb8f4ab3d28e4fb01d687bcfb75e5f6b12d53b82f99b6cc" + "blake2b_256": "29338bbcd3740d9e96cfb57427b8db7a12093402a3a83f2054887e027b2849de", + "md5": "53ce2b9f6b741fb2f070d12839b5789e", + "sha256": "a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1" }, "downloads": -1, "filename": "PyYAML-3.13-cp35-cp35m-win32.whl", "has_sig": false, - "md5_digest": "2f45666423475f050b5b5785930e5876", + "md5_digest": "53ce2b9f6b741fb2f070d12839b5789e", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": null, @@ -152,13 +159,14 @@ { "comment_text": "", "digests": { - "md5": "a21cdc697d03b9b446f95e6d6b5ab93e", - "sha256": "b96803e106c5ebbae46018e0523ec7dc970d95b2cf8761d6c0a2c75d8d5c027b" + "blake2b_256": "add4d895fb7ac1b0828151b829a32cefc8a8b58b4499570520b91af20982b880", + "md5": "1b70e7ced4c82364bda4ac9094d6e259", + "sha256": "bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613" }, "downloads": -1, "filename": "PyYAML-3.13-cp35-cp35m-win_amd64.whl", "has_sig": false, - "md5_digest": "a21cdc697d03b9b446f95e6d6b5ab93e", + "md5_digest": "1b70e7ced4c82364bda4ac9094d6e259", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": null, @@ -172,13 +180,14 @@ { "comment_text": "", "digests": { - "md5": "088e59a995c3387ebe666841bc02ab1b", - "sha256": "9a3dbf2d52067e59d74d161655e6d841596cd736ad17f5fdadd9eb9416faddef" + "blake2b_256": "fb510c49c6caafe8d9a27ad9b0ca9f91adda5a5072b9efbbe7585fb97a4c71c4", + "md5": "8f62197b853b5b387ff588df05cee7a6", + "sha256": "40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a" }, "downloads": -1, "filename": "PyYAML-3.13-cp36-cp36m-win32.whl", "has_sig": false, - "md5_digest": "088e59a995c3387ebe666841bc02ab1b", + "md5_digest": "8f62197b853b5b387ff588df05cee7a6", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": null, @@ -192,13 +201,14 @@ { "comment_text": "", "digests": { - "md5": "a4db4b28a9d04264f93d1aaf0d0ae88d", - "sha256": "cc1531e17d6de77b03971719feb1e8e5ff976bea3d645c3772dbb9fbb91ffde1" + "blake2b_256": "4fca5fad249c5032270540c24d2189b0ddf1396aac49b0bdc548162edcf14131", + "md5": "ff7280dd032d202b417871d39febadec", + "sha256": "3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b" }, "downloads": -1, "filename": "PyYAML-3.13-cp36-cp36m-win_amd64.whl", "has_sig": false, - "md5_digest": "a4db4b28a9d04264f93d1aaf0d0ae88d", + "md5_digest": "ff7280dd032d202b417871d39febadec", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": null, @@ -212,13 +222,14 @@ { "comment_text": "", "digests": { - "md5": "60fd8936e8bdf917a750172f33b62d51", - "sha256": "a0184bd61052fa6942d65c294468116eaf00f43669437d46ad5530f7005c7f37" + "blake2b_256": "5cedd6557f70daaaab6ee5cd2f8ccf7bedd63081e522e38679c03840e1acc114", + "md5": "03ac720a2dcb18f2f1a3d026d281d778", + "sha256": "e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" }, "downloads": -1, "filename": "PyYAML-3.13-cp37-cp37m-win32.whl", "has_sig": false, - "md5_digest": "60fd8936e8bdf917a750172f33b62d51", + "md5_digest": "03ac720a2dcb18f2f1a3d026d281d778", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": null, @@ -232,13 +243,14 @@ { "comment_text": "", "digests": { - "md5": "36d19ecd2632ba0e0a362f2a28d9244a", - "sha256": "84492bd518aeafdf1d2bceae160a60d748f75eb815533d96b8232205161f21f4" + "blake2b_256": "bf96d02ef8e1f3073e07ffdc240444e5041f403f29c0775f9f1653f18221082f", + "md5": "02ab28701247a80e059daa6efe11e67d", + "sha256": "aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1" }, "downloads": -1, "filename": "PyYAML-3.13-cp37-cp37m-win_amd64.whl", "has_sig": false, - "md5_digest": "36d19ecd2632ba0e0a362f2a28d9244a", + "md5_digest": "02ab28701247a80e059daa6efe11e67d", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": null, @@ -252,13 +264,14 @@ { "comment_text": "", "digests": { - "md5": "406a166b8ce8df5790f7689ad45d201e", - "sha256": "e6c07f136ba90afc1b049d7577b4f955845d796f359324662758f403929fd481" + "blake2b_256": "9ea31d13970c3f36777c583f136c136f804d70f500168edc1edea6daa7200769", + "md5": "b78b96636d68ac581c0e2f38158c224f", + "sha256": "3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf" }, "downloads": -1, "filename": "PyYAML-3.13.tar.gz", "has_sig": false, - "md5_digest": "406a166b8ce8df5790f7689ad45d201e", + "md5_digest": "b78b96636d68ac581c0e2f38158c224f", "packagetype": "sdist", "python_version": "source", "requires_python": null, @@ -270,71 +283,5 @@ "yanked_reason": null } ], - "vulnerabilities": [ - { - "aliases": [ - "CVE-2017-18342" - ], - "details": "In PyYAML before 5.1, the yaml.load() API could execute arbitrary code if used with untrusted data. The load() function has been deprecated in version 5.1 and the 'UnsafeLoader' has been introduced for backward compatibility with the function.", - "fixed_in": [ - "5.1" - ], - "id": "PYSEC-2018-49", - "link": "https://osv.dev/vulnerability/PYSEC-2018-49", - "source": "osv", - "summary": null - }, - { - "aliases": [ - "CVE-2020-14343" - ], - "details": "A vulnerability was discovered in the PyYAML library in versions before 5.4, where it is susceptible to arbitrary code execution when it processes untrusted YAML files through the full_load method or with the FullLoader loader. Applications that use the library to process untrusted input may be vulnerable to this flaw. This flaw allows an attacker to execute arbitrary code on the system by abusing the python/object/new constructor. This flaw is due to an incomplete fix for CVE-2020-1747.", - "fixed_in": [ - "5.4" - ], - "id": "PYSEC-2021-142", - "link": "https://osv.dev/vulnerability/PYSEC-2021-142", - "source": "osv", - "summary": null - }, - { - "aliases": [ - "CVE-2017-18342" - ], - "details": "In PyYAML before 4.1, the yaml.load() API could execute arbitrary code. In other words, yaml.safe_load is not used.", - "fixed_in": [ - "4.1" - ], - "id": "GHSA-rprw-h62v-c2w7", - "link": "https://osv.dev/vulnerability/GHSA-rprw-h62v-c2w7", - "source": "osv", - "summary": null - }, - { - "aliases": [ - "CVE-2020-14343" - ], - "details": "A vulnerability was discovered in the PyYAML library in versions before 5.4, where it is susceptible to arbitrary code execution when it processes untrusted YAML files through the full_load method or with the FullLoader loader. Applications that use the library to process untrusted input may be vulnerable to this flaw. This flaw allows an attacker to execute arbitrary code on the system by abusing the python/object/new constructor. This flaw is due to an incomplete fix for CVE-2020-1747.", - "fixed_in": [ - "5.4" - ], - "id": "GHSA-8q59-q68h-6hv4", - "link": "https://osv.dev/vulnerability/GHSA-8q59-q68h-6hv4", - "source": "osv", - "summary": null - }, - { - "aliases": [ - "CVE-2020-1747" - ], - "details": "A vulnerability was discovered in the PyYAML library in versions before 5.3.1, where it is susceptible to arbitrary code execution when it processes untrusted YAML files through the full_load method or with the FullLoader loader. Applications that use the library to process untrusted input may be vulnerable to this flaw. An attacker could use this flaw to execute arbitrary code on the system by abusing the python/object/new constructor.", - "fixed_in": [ - "5.3.1" - ], - "id": "GHSA-6757-jp84-gxfx", - "link": "https://osv.dev/vulnerability/GHSA-6757-jp84-gxfx", - "source": "osv", - "summary": null - } - ] + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/requests.json b/tests/repositories/fixtures/pypi.org/json/requests.json index f8f42777276..ab38c2b3721 100644 --- a/tests/repositories/fixtures/pypi.org/json/requests.json +++ b/tests/repositories/fixtures/pypi.org/json/requests.json @@ -1,1456 +1,199 @@ { - "name": "requests", - "files": [ - { - "filename": "requests-0.10.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/62/35/0230421b8c4efad6624518028163329ad0c2df9e58e6b3bee013427bf8f6/requests-0.10.0.tar.gz", - "hashes": { - "md5": "c90a48af18eb4170dbe4832c1104440c", - "sha256": "210a82e678c45d433a4ad1f105974b3102a8ab5198872dc0a3238a8750d4c65e" - } - }, - { - "filename": "requests-0.10.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/b4/56/ba2d803383ec32d70f8faa7df5eb37ee9b3fc662ff68b7ab01ad9740b83a/requests-0.10.1.tar.gz", - "hashes": { - "md5": "699147d2143bff95238befa58980b912", - "sha256": "da6031575a30c7b65ea99465183468349b3645e6bf5322e49d53f565b27ed2b5" - } - }, - { - "filename": "requests-0.10.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/58/1e/6b84552b6553f5beaf7cb0fe15115e7e4673326ed9188ad5338559ee8285/requests-0.10.2.tar.gz", - "hashes": { - "md5": "47c3cf85a0112d423137b43989663bef", - "sha256": "1546ef1e291ae337086369b621096fb0f69f88f6f67f60b1f6b7c18d1ca278e1" - } - }, - { - "filename": "requests-0.10.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/01/44/39988315e036b79fe70428273053617266bf20d1363e91082346fae8450d/requests-0.10.3.tar.gz", - "hashes": { - "md5": "a055af00593f4828c3becd0ccfab503f", - "sha256": "8eeb24328304b015cbd59a49670e2738b77034b225b566729ddb19941899e490" - } - }, - { - "filename": "requests-0.10.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/94/ac/5fa21e435ba8050d14db92ce29763c28196b727d4079dc608d39177fbf9b/requests-0.10.4.tar.gz", - "hashes": { - "md5": "5e465e9e739bcc9f71935ca4e9706168", - "sha256": "2ad4cc51d7595ca6f97373a0d697999e0cbdbbf1ba665d18f0f3dcec12b8be77" - } - }, - { - "filename": "requests-0.10.6.tar.gz", - "url": "https://files.pythonhosted.org/packages/b4/1f/8f5430040fcf4391dc5bd324424a569e2e0d96595952b21eb82403602d98/requests-0.10.6.tar.gz", - "hashes": { - "md5": "c889401445de3cbbac98509208a73b83", - "sha256": "31134b4f35951730dcce59f2af334478b68caa5728902a1d6bd5e115ec677d8b" - } - }, - { - "filename": "requests-0.10.7.tar.gz", - "url": "https://files.pythonhosted.org/packages/c5/cd/0597f9c040db24ca6d23cc74faa102554cb0a93bdbffb855d7749547921f/requests-0.10.7.tar.gz", - "hashes": { - "md5": "a3ac9d431981dcfd592fd0f35c499e4a", - "sha256": "80f32a74bed8cf081a3a25512f8725e09ceda217101ea706efced262bb05aec6" - } - }, - { - "filename": "requests-0.10.8.tar.gz", - "url": "https://files.pythonhosted.org/packages/9a/05/4ab34c6aae63a01aef2fd8be3573a99c197cc76a67f8cee751cb3a7784fb/requests-0.10.8.tar.gz", - "hashes": { - "md5": "0fc89a30eef76b2393cbc7ebace91750", - "sha256": "bec280d924a8be87b3377ee78a976334a6e7c944a8fe09bbd9447e669b984dae" - } - }, - { - "filename": "requests-0.11.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/d7/ee/6826f31ae3e0e68606cb9086c3904582b3982bbccc73f34d6dc9912b48ad/requests-0.11.1.tar.gz", - "hashes": { - "md5": "c903c32a0e1f04889e693da8e9c71872", - "sha256": "fd4260541d0e559c78e2b3072bd79f36e0f8ef935bcbbadaa8c98cd8b5a62897" - } - }, - { - "filename": "requests-0.11.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/b6/52/ad2911cf5586f2372a296a93a94d0324e4ffdd225975241562c450594795/requests-0.11.2.tar.gz", - "hashes": { - "md5": "5acd23600c897bf1560dca18005b428c", - "sha256": "547bf78a774a6018271d6e5c40613ec554642ba4d6cdf45813e7894145293c57" - } - }, - { - "filename": "requests-0.12.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/3a/ac/0372d6b7fbde19444d5cc560f296e70b26283d2bac0665b576dd3f5e6b60/requests-0.12.0.tar.gz", - "hashes": { - "md5": "c38bacf4d6a065f3c47463e63efdfb5a", - "sha256": "8a88a291599444be608940c227b6114212220d8126c512af821f1ab207fe5072" - } - }, - { - "filename": "requests-0.12.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/3a/0a/7c62c06702ddb4d3bc50d27f5b8e094d6e66a3374fc2eedf264742f84805/requests-0.12.1.tar.gz", - "hashes": { - "md5": "fe9e0515d09733d0eb9e2031c03401b2", - "sha256": "9ce56b87180c06728d96ca734055675abf8f5cc3136e0d7712a6260430685589" - } - }, - { - "filename": "requests-0.13.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/86/1b/88d3753931419a226bb4e4c1d354cd2d40acff3482b37e30dd84ba8a243b/requests-0.13.0.tar.gz", - "hashes": { - "md5": "7d41e51c273806456faab61370d5147e", - "sha256": "03a2001843546147ddb6972d0661e2002b9be4ccbbbd2177ee10f05bd1910109" - } - }, - { - "filename": "requests-0.13.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/0d/63/0e6c6b817ab38fb3e38a192d6631d698fe78308a68659af3aa523cd736d4/requests-0.13.1.tar.gz", - "hashes": { - "md5": "31a08091feeefe60817e45122d933219", - "sha256": "31f3ae96787fe74a78c7dd9626bf997fd4eabacc040b7b33fbd8632d2c2a97f6" - } - }, - { - "filename": "requests-0.13.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/62/ca/338cf287e172099e4500cfa2cb580d2c9a1874427a8a14324d7a4c9d01b1/requests-0.13.2.tar.gz", - "hashes": { - "md5": "fac5635391778e2394a411d37e69ae5e", - "sha256": "37684324da8aca40e88fa2f7faa526cc116d74e979c2ac5d9119fe6e1bb5ced5" - } - }, - { - "filename": "requests-0.13.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/54/9d/1ee0bd44e9334b6382ed5226d4bc33518d0d0b03ed806af6444d1c80ed83/requests-0.13.3.tar.gz", - "hashes": { - "md5": "54387d7df6c69580b906dcb5a2bd0724", - "sha256": "79503a14a43d6ae0b0b2e92f88ed0b01015528b8a8ab47721c28aa993aa4db2b" - } - }, - { - "filename": "requests-0.13.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/04/75/52e169351e24a9faa8bfac69a07ea3551b845ca6354f22da15c5da3d5100/requests-0.13.4.tar.gz", - "hashes": { - "md5": "286cd3352509691e81c520accc5b9e48", - "sha256": "94672e92c23fefe516c5310b84d97b4ea19ef373003a7ba7af1057102a87f345" - } - }, - { - "filename": "requests-0.13.5.tar.gz", - "url": "https://files.pythonhosted.org/packages/ba/d1/919f6240a37ce5aade82da39809e1f28a5f2899a29a0ca10c381ba70efbb/requests-0.13.5.tar.gz", - "hashes": { - "md5": "805fd122b4cfd224e15ff2f5288c5ba0", - "sha256": "c6abb4b15a3f2aaad18c22b214b9b35d69ec4e2730c5b922f95f17a88981f957" - } - }, - { - "filename": "requests-0.13.6.tar.gz", - "url": "https://files.pythonhosted.org/packages/02/56/a6203485b552f9e8e8f16bd4e576446f94737ccbc563957e7510c8e401e4/requests-0.13.6.tar.gz", - "hashes": { - "md5": "9ea0f38cc4bf444be5a4c90f127211f2", - "sha256": "3cca63908f1b941d2da61ef0e8baf7bf014cc0df6512e172b8d2ac87be82b916" - } - }, - { - "filename": "requests-0.13.7.tar.gz", - "url": "https://files.pythonhosted.org/packages/b4/48/e82ded36a3cee7c0ef9605b44c4615ffe4a37f8b6c8b17fdbc15fae18daa/requests-0.13.7.tar.gz", - "hashes": { - "md5": "9212044f915d44fe3010cb923c0e08e5", - "sha256": "d9c6cf2890a0dc1200407f99130d334ef5ab5270bed3d9b4c14b0bb9c6cc3400" - } - }, - { - "filename": "requests-0.13.8.tar.gz", - "url": "https://files.pythonhosted.org/packages/db/1e/1f37495384a628887e10ecd61d45dba455ceec4b8b5b463512b4700e5b3d/requests-0.13.8.tar.gz", - "hashes": { - "md5": "d01596bd344db94763b2e4dfaa7bc7b9", - "sha256": "3ef37004f6394b111a27f0b6d0a64be83f7e4bccfbbbcdd21455400af5f4fbd4" - } - }, - { - "filename": "requests-0.13.9.tar.gz", - "url": "https://files.pythonhosted.org/packages/01/da/da83c242c5a77c58aa86072d68fd2855aa9b4d3b1a8bac4b402531b25ff1/requests-0.13.9.tar.gz", - "hashes": { - "md5": "66d52b8f47be517fc91a6e18d6b9ce82", - "sha256": "d887bb1c06948a8930d6e73a1f942f9febe9157a299a984994c20c84b2c21e20" - } - }, - { - "filename": "requests-0.14.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/4e/31/50a12e5b5e585e0b00ce2592c9b45f2ae109575e3707a341afd7550a8d1a/requests-0.14.0.tar.gz", - "hashes": { - "md5": "a809c747e4f09b92147721ebc3e23dd6", - "sha256": "4e690ba0275ab4a8c9a5c7a6eb14e79e1adad0f84331fc638a18d7751f41ac3b" - } - }, - { - "filename": "requests-0.14.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/40/1d/63a729208e1e93cf2cbda953b9f20ec9b101eb964e3f6205d1c2e294f294/requests-0.14.1.tar.gz", - "hashes": { - "md5": "3de30600072cbc7214ae342d1d08aa46", - "sha256": "4f563b907782b2c95dd2cbaf882a96133e567d46290a0e7aafa0c6f3efad19ba" - } - }, - { - "filename": "requests-0.14.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/fa/d1/0dd60e1146e79e7b193e7b0189d8c13ef100d55cbfe65e1825ac5f03c397/requests-0.14.2.tar.gz", - "hashes": { - "md5": "488508ba3e8270992ad5b3fb54d364ca", - "sha256": "0e3345a8ac0d712bf17bd9d3276415050c5f972265ab62993cd4540a3a1aaaef" - } - }, - { - "filename": "requests-0.2.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/ba/bb/dfa0141a32d773c47e4dede1a617c59a23b74dd302e449cf85413fc96bc4/requests-0.2.0.tar.gz", - "hashes": { - "md5": "637ae94cb6f2f1d9ea9020293055964a", - "sha256": "813202ace4d9301a3c00740c700e012fb9f3f8c73ddcfe02ab558a8df6f175fd" - } - }, - { - "filename": "requests-0.2.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/4b/ad/d536b2e572e843fda13e4458c67f937b05ce359722c1e4cdad35ba05b6e3/requests-0.2.1.tar.gz", - "hashes": { - "md5": "7e9590f3985ece46fc8306e906b458c7", - "sha256": "d54eb33499f018fc6bd297613bf866f8d134629c8e02964aab6ef951f460e41e" - } - }, - { - "filename": "requests-0.2.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/82/3c/3b5beca192da920c0c2ba67119d66ba1e4b1e766f40898e5e684d697ca1c/requests-0.2.2.tar.gz", - "hashes": { - "md5": "a703489b1a4a650698ddcf84857360c6", - "sha256": "b3289694b2ddf6adb4f7e1f470b9771330c76125611222b9c702f0e2e9733cbc" - } - }, - { - "filename": "requests-0.2.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/6f/7e/5c2d7d9102c6ab847bd1215f96255e894fbfc81c8abf2c1714ae2a504913/requests-0.2.3.tar.gz", - "hashes": { - "md5": "102243646fc0cffdc82269f4bb5c6d5d", - "sha256": "8e374b75aaae7f85325e9bb126e96cb77a3bfc17e81ee74a0e96916aac1cc2ba" - } - }, - { - "filename": "requests-0.2.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/dc/02/789859c27162bb91ecf6b72ed4ce1af3ed1710255265ad0901c4d4e25666/requests-0.2.4.tar.gz", - "hashes": { - "md5": "62dbe8cf12bc1ccd03776e74f59e9ef6", - "sha256": "ef1bd1a81022e9bf574ecfe69cbd8597e79371b890d29bd3847dd946102c8eed" - } - }, - { - "filename": "requests-0.3.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/96/2b/88e9d6bf2e9d75cda77bf4fdc03720f4ba262beb532f9510a4a7f3e45660/requests-0.3.0.tar.gz", - "hashes": { - "md5": "aa1306575a78ba8b5e625dd2645d2ef0", - "sha256": "57eed745eb2a2e3c7e1dd935ccd49eb2eac51cfcdace4a97fb44de5da70f0035" - } - }, - { - "filename": "requests-0.3.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/5e/c0/76fac9445cd8b6394eacae1e098ca0c97767cc0112e45e68521f553df003/requests-0.3.1.tar.gz", - "hashes": { - "md5": "3f4701e2ab414cd7018804a70328c527", - "sha256": "05dddfd656d25b7738778d2b4e8fa72e53b5357a2f80a319e6e1fa59edb03339" - } - }, - { - "filename": "requests-0.3.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/d5/f1/16b57088f11cd5c6c82834bad6475826309cee44edaae860e9f65c084703/requests-0.3.2.tar.gz", - "hashes": { - "md5": "bde777f4c5b7bbb09033901c443962b3", - "sha256": "78ecf812ee865b62be106100a3c6f24058c7901ad995351b8818f18ea97ce848" - } - }, - { - "filename": "requests-0.3.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/f1/64/8a2ba81294381bb90e8fb4b6fa750e0dca3f2d19e8caaeeae5e7bb6b3753/requests-0.3.3.tar.gz", - "hashes": { - "md5": "84c762c116617ba4dd03c19e2b61eb53", - "sha256": "ccbbc41c4c009baecf41e993727048c65c440fefadb217b11e73f63cd0cae09a" - } - }, - { - "filename": "requests-0.3.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/ed/1b/8682a0cfe92f67e30fb9ac7982cb785a1230ca4385dc1353513f5b87b9f4/requests-0.3.4.tar.gz", - "hashes": { - "md5": "55152cc2b135bc8989dc4fa279295f8b", - "sha256": "e72a42a0317f33114b48c972d3056bad3265b92450d4e0e51ad0b384e43bc6d9" - } - }, - { - "filename": "requests-0.4.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/56/c3/0887d5d6c18a366308b3dc7024210b4c89ff9ae92ae5fb87cf8fe58bcae2/requests-0.4.0.tar.gz", - "hashes": { - "md5": "77a7a7edd54169c6fa7ace49dcb0b20c", - "sha256": "35185852569456de25a654c5f9a43a1b8e4dc18a2a676985bbb9d5e7e5a9703e" - } - }, - { - "filename": "requests-0.4.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/b3/54/dbc9b89a66a15ab9f3e2595de1b1ebd1da954efcb30a329c98710e014c05/requests-0.4.1.tar.gz", - "hashes": { - "md5": "812ff0ce63d14f7b940bacd880d54ee0", - "sha256": "f978616765803e9e0e9943136b34be0da69d74ba8fbd064cbfcf28f33ca54d8a" - } - }, - { - "filename": "requests-0.5.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/0c/4d/d67bd4e4b17148aad88e6d75c62763ec27363d18038ed75019239e1516d0/requests-0.5.0.tar.gz", - "hashes": { - "md5": "6dfdc1688217d774d524e056ec6605a6", - "sha256": "747c8c79e9c75ba8608c7628e39d533a0234ff78a80569e40ba64865abc0e521" - } - }, - { - "filename": "requests-0.5.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/5f/1c/8d145fbdb23986063a8a0c954d484a793024137a99ac7f3da603717fe64a/requests-0.5.1.tar.gz", - "hashes": { - "md5": "33a6e65d6a4e5b2d91df76256f607b81", - "sha256": "cfed662472d48e7bd6bfd8d7f79fe9072fc873b2e372fe3b9178a26daabebccc" - } - }, - { - "filename": "requests-0.6.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/0b/b8/932de3bc1b8630357de85bc0c794ee1a7d343cb8008b470a0c9d15e84341/requests-0.6.0.tar.gz", - "hashes": { - "md5": "235e9fb6bfd71a48c0f00c0d5aef8896", - "sha256": "2c5036387b75dfb0ff3971604bd1e691cf6a55dc6c397df7adf9fc4804bc7f48" - } - }, - { - "filename": "requests-0.6.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/a6/1f/f948fb7ba68b69b13a1fbbb70d7706e889c7b7d3e9867b498ca7971126db/requests-0.6.1.tar.gz", - "hashes": { - "md5": "07770334d48bd69ede1cc28cd0dd7680", - "sha256": "2656b23db25398e990e6f5d75dfbd960454a1fe573aeedc651773ddd2a8a3bbc" - } - }, - { - "filename": "requests-0.6.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/55/19/986305b95fae17c58c95e191943a282bce19f82535af4530890c483937ad/requests-0.6.2.tar.gz", - "hashes": { - "md5": "0583bb5393b9cfcb022dc2aef7d6ffc8", - "sha256": "b5419f909fc21b8eb037dc4bade29530c28993610b68213b7f7633bf10bcabbc" - } - }, - { - "filename": "requests-0.6.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/e1/3f/9235f98536b1393ef8a8e2dbd27273588fc3246000b93b0d763325b2e30c/requests-0.6.3.tar.gz", - "hashes": { - "md5": "35a954ae85b358e498fb0e602f1dce9d", - "sha256": "bde3e2ea45f6e47acd24ff55628fc7325cacd75746ee2d2b63c093554131fe41" - } - }, - { - "filename": "requests-0.6.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/97/e0/a2bc7317b13caf227a75c8151b562b62a2e9f5d4ab4ad59694bfdbf5c35c/requests-0.6.4.tar.gz", - "hashes": { - "md5": "e0eec314178ad9a7bb14f2ec32f35ba3", - "sha256": "151f105506913a6b84f6119400ca94732ec39f5b4e0991ca2fc840ddb4e37816" - } - }, - { - "filename": "requests-0.6.5.tar.gz", - "url": "https://files.pythonhosted.org/packages/a8/a6/38b9de830719e4cd62ddf51f240654200658d0315aa9e908eda90ee64879/requests-0.6.5.tar.gz", - "hashes": { - "md5": "52f8bc956e027c8a0eb2684f6928169d", - "sha256": "bb332c171913c2f57cea805d013601af86a46b9aef9b7ef76bdcbed14f939bd7" - } - }, - { - "filename": "requests-0.6.6.tar.gz", - "url": "https://files.pythonhosted.org/packages/df/8d/4b1bb15e8814fefa2cdf8f971a479b459d07f8176094bd59742720f31270/requests-0.6.6.tar.gz", - "hashes": { - "md5": "2180dacebc0e30ba730d083739907af6", - "sha256": "6670aee5fe3bb545e1f7e8bb073a06be65344b467cd698b0ad58e7d7792dc2bb" - } - }, - { - "filename": "requests-0.7.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/5c/8c/0399c9554b04b2b267d81239773657ddc720799a08565b6c21f7aed652df/requests-0.7.0.tar.gz", - "hashes": { - "md5": "83a1a7d79218756efd19b254eeb6b1f0", - "sha256": "13570c41a218affafe3f3e01db16d1f6cd238d3bd7a1d52cc435bf9de3df099a" - } - }, - { - "filename": "requests-0.7.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/00/c8/8cf0f078100ce5fe7ff35927d8861e2e36daed9be2db56690f3ad80ccec4/requests-0.7.1.tar.gz", - "hashes": { - "md5": "4821c6902d8e83c910c69c6492388e5f", - "sha256": "6795818f5f46d7ecf53965d96e2ceae66bf652c79703292973b7c56afb88b946" - } - }, - { - "filename": "requests-0.7.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/7c/af/b46199ae37c032801bcdc5dbb1c82a59613883ee690ff4fd2b5dc3140130/requests-0.7.2.tar.gz", - "hashes": { - "md5": "03eb97ed6aacb4102fd434bbfc13ce17", - "sha256": "7e58616c2c943116c7fb7595ebc3b00c5016ede5e6b14cf4bd72a812a5534aef" - } - }, - { - "filename": "requests-0.7.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/3d/54/c4a7dcfccac9e6dd738e9ed86848a9a5b07a4345e5949f8795cfdc0ea95f/requests-0.7.3.tar.gz", - "hashes": { - "md5": "267f6f7d1109775d24a288f798e3ab4a", - "sha256": "2e7a0cb6251da5dd8c185f5d404e110d29e47afec7c8e60d78806436360a40d7" - } - }, - { - "filename": "requests-0.7.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/64/50/219c9ff86e6fecfb89bdfe1093aea523f14882657186f806462887220267/requests-0.7.4.tar.gz", - "hashes": { - "md5": "c015765399b8c1e309c84ade0d38f07b", - "sha256": "3101a857831c6b6ec1f88ccebc8a19d38af6a10372537f437cd978c5775b4286" - } - }, - { - "filename": "requests-0.7.5.tar.gz", - "url": "https://files.pythonhosted.org/packages/2b/9e/1be659005a6bb394b02e12804fcaf8cd85050958a459945708b21e362b32/requests-0.7.5.tar.gz", - "hashes": { - "md5": "9a12281a811ca25d347d806c456d96f1", - "sha256": "ae10f2c5d112768a2e62282dd6b33db230c10ef7a2c3b1cf404806598bacd0b6" - } - }, - { - "filename": "requests-0.7.6.tar.gz", - "url": "https://files.pythonhosted.org/packages/de/f0/8fc024ef4f25ef5690c2121215029f88e1895b60c867c1a39134045b181e/requests-0.7.6.tar.gz", - "hashes": { - "md5": "728b21bf3914d69a4ff1012c66d9b6ba", - "sha256": "667f9c9cc447c9ee09d34d891db488f2695c99d025fae3ec8d02e235eb7eba95" - } - }, - { - "filename": "requests-0.8.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/6a/85/32d23f3dbc43e54631bb9bd76d34c2448cc2f2f0de29babfb1a6a79b4d60/requests-0.8.0.tar.gz", - "hashes": { - "md5": "64dc0095cb645aa7f0083957950d524d", - "sha256": "62b557533f685c4a0af4e38dddc598c38f5ce0bd8e3b15b20809d1606f3843dd" - } - }, - { - "filename": "requests-0.8.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/ae/fb/b1d6916b5278c44a1a2beb919d7ab96327051c3d47db9d6ee6978743444e/requests-0.8.1.tar.gz", - "hashes": { - "md5": "6135f837fbd113fc62904c60dcc5c70d", - "sha256": "23756d85cbf7dec36dd624853e76b380c2b538c21769adba1dcced9de0409f68" - } - }, - { - "filename": "requests-0.8.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/65/5d/e69bad1f71d5284113165738d563a997d0d1ac968f939d1375f3df7c59fc/requests-0.8.2.tar.gz", - "hashes": { - "md5": "bdbbd7f45688e23e87eec52835959943", - "sha256": "826244e9612aa9a548d1289bef7bbce07eee4872ca21ca80631094d1c512b121" - } - }, - { - "filename": "requests-0.8.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/f8/17/42ab05005c88e8d301fe0ee9b24e34139422268d0d7b8b11f98107c2a794/requests-0.8.3.tar.gz", - "hashes": { - "md5": "93e4cd27ab646fb613a926fede1cc4f5", - "sha256": "7277ec1fc8b8251bc1ce628651cbfad886704a77aea9f6203dcc042a4f12d214" - } - }, - { - "filename": "requests-0.8.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/aa/a7/ec41790a8fb50f8d359568f82cd37a994af5d0159cccb543d147a7eea751/requests-0.8.4.tar.gz", - "hashes": { - "md5": "642e5c70250989e4feda9c50be57b100", - "sha256": "3ef7efbe083bcb6f7b1144c7665b5b1f6bd4fc7043dc50ccd564edf62b814c2b" - } - }, - { - "filename": "requests-0.8.5.tar.gz", - "url": "https://files.pythonhosted.org/packages/fc/f8/329450760dddd7e437eef0cd16a8d48582405e72495cf79a77a82e2f0047/requests-0.8.5.tar.gz", - "hashes": { - "md5": "5f2975ee9e57f4ea000e5a3f50fc85d1", - "sha256": "1db43116f612b016169d9a994d16aea9c166c55355bac2e05fae75e0ff610f4c" - } - }, - { - "filename": "requests-0.8.6.tar.gz", - "url": "https://files.pythonhosted.org/packages/4e/9b/a78a3bb2913576fad3ec6f18b8d26dd9579268f6b2191d73f4ec40e09490/requests-0.8.6.tar.gz", - "hashes": { - "md5": "21b03926ab38417a704ebce57972571a", - "sha256": "b9ad56ff5971b7a4005598e5a9588584ee1153fbf027ed76a7d13585f71489f7" - } - }, - { - "filename": "requests-0.8.7.tar.gz", - "url": "https://files.pythonhosted.org/packages/a7/83/bb447075090f4a3a60082765051d476b62f375d0f8174ebe9545d4bb8938/requests-0.8.7.tar.gz", - "hashes": { - "md5": "e4d4ee3a90396908bd04b50bf2136617", - "sha256": "2c5b08f7afe8d5ffc1c4f7819e74d5309a52b2f2eb1d78cc144cb57aa10380fe" - } - }, - { - "filename": "requests-0.8.8.tar.gz", - "url": "https://files.pythonhosted.org/packages/b7/1d/5c7973ca22bc95d53eba28a7dab7088f1ded7db0d174ea467afaaf898dfc/requests-0.8.8.tar.gz", - "hashes": { - "md5": "bfb182cfd3ed839b97744c553b87f502", - "sha256": "70352c48f106fe4a15537bdb4a029ebbb80c1ae1b6836a9033f2b3d7e52e01fd" - } - }, - { - "filename": "requests-0.8.9.tar.gz", - "url": "https://files.pythonhosted.org/packages/3a/72/9f39b173ee93645013563df119d28841f47b0ca2ebe04afcefd438e42f30/requests-0.8.9.tar.gz", - "hashes": { - "md5": "ff5b3bf5bc3ad19930d3f3afe51f182b", - "sha256": "870780642a14f5e30a9ef8c419aeb405e5bd4340d4fefbf1e8493dde39225337" - } - }, - { - "filename": "requests-0.9.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/89/ce/0115444a1f9d833768160e678c21483e271466918966c11212f040b5f2af/requests-0.9.0.tar.gz", - "hashes": { - "md5": "5f6f03ec76f68a7a3f35120ab5a6c589", - "sha256": "43b26edb5c47e0ccf9612d3cf13639a1e7e6c774af5375a684cfa00e747f21b1" - } - }, - { - "filename": "requests-0.9.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/48/aa/1077a5fef0c4fbdad8ce127166ca474c67788b7609137d26e17ab46ee16d/requests-0.9.1.tar.gz", - "hashes": { - "md5": "8ed4667edb5d57945b74a9137adbb8bd", - "sha256": "0c6fc89ce4f8976dd8ddb1a9e896315a47fb3f1dba95417fd3fa8e626ca9a1e7" - } - }, - { - "filename": "requests-0.9.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/68/a1/fac8e1fa783d167cc49debc5b5328ca57eac9d53b58c34d17ce7592cdc6d/requests-0.9.2.tar.gz", - "hashes": { - "md5": "65b36d99a4d2f78a22f08c95d2475e33", - "sha256": "eb9a3b0031af396fb6825be897655546f4c54e19669fddb5df72a4a688ae0555" - } - }, - { - "filename": "requests-0.9.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/62/12/0840d1bba04e5d60e469610ad78e02e89e6828e776adaef4116413cf5fd0/requests-0.9.3.tar.gz", - "hashes": { - "md5": "b13b6fbfa8fc3fc3c25bae300748053f", - "sha256": "3c0dd7c014474e0cdd00cad661abd74c88c14183d260d0555dfa51fc5b29abc5" - } - }, - { - "filename": "requests-1.0.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/46/da/94c0fd6ff79b85befc3b528cf3771700def274c52b347bf12eeaa466f34c/requests-1.0.0.tar.gz", - "hashes": { - "md5": "099c9035c4b30a7ae5484b1beabc7407", - "sha256": "f10d8fbcc02a58056ab44f79ff9b3f9fe78e410296527885250bbb36d15be8c6" - } - }, - { - "filename": "requests-1.0.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/b8/03/fb15922d14fa0b01a0ff4e2920bb8c08546d970ff387454ba892a67d5243/requests-1.0.1.tar.gz", - "hashes": { - "md5": "2e938f26f2bdf2899862c751bfa7eff5", - "sha256": "c69222b7c02a8e46d61c3b986e6a3e766db0539235aaafc056c75b8dcf6f5eec" - } - }, - { - "filename": "requests-1.0.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/32/35/f2908b62b155b1737ab80b1a69142d007522bb0d1b3a0d3f8909595762f5/requests-1.0.2.tar.gz", - "hashes": { - "md5": "e5c1a5a5472cd61f144743dd25a2a29f", - "sha256": "3c81f3ae43916161b8d98d7b329b19533b0d0332b7a774794964e6b08760b0c7" - } - }, - { - "filename": "requests-1.0.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/7f/76/66c01dd9afe4c5062e0c838bbd98ead7fa6b52984c7e26100a42c3eb965a/requests-1.0.3.tar.gz", - "hashes": { - "md5": "a3169a33973d4b5b51843ead01c5e999", - "sha256": "c7b50dc01b751e5ef8785951a74d0c2373bb0f87b45dca75dc2c5477b7e30f44" - } - }, - { - "filename": "requests-1.0.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/5d/e8/f27e0868b9a49946b3f800722e02b19efebde22ae534276df3e5f6cca41d/requests-1.0.4.tar.gz", - "hashes": { - "md5": "0b7448f9e1a077a7218720575003a1b6", - "sha256": "f363690a47dd4d6d6e7605fc686b668097a114cd946dffdf21fe0c6a6a46f9e6" - } - }, - { - "filename": "requests-1.1.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/e8/ff/d19b7461d84a5804c5cdc29791305530a2b774fe928b497e74ac9b304c79/requests-1.1.0.tar.gz", - "hashes": { - "md5": "a0158815af244c32041a3147ee09abf3", - "sha256": "21a81ddf1a3c2f956524538966ae19c38cae251f5629821588cdc8246a1335f7" - } - }, - { - "filename": "requests-1.2.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/37/e4/74cb55b3da7777a1dc7cd7985c3cb12e83e213c03b0f9ca20d2c0e92b3c3/requests-1.2.0.tar.gz", - "hashes": { - "md5": "22af2682233770e5468a986f451c51c0", - "sha256": "cfa615644ae38efe8423ce9edb23470a4615a9147fa3cea5026afb47c9bb3913" - } - }, - { - "filename": "requests-1.2.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/3b/9e/bfa03431335e778854da3d562697e067df40870a78ca81b35089822c6583/requests-1.2.1.tar.gz", - "hashes": { - "md5": "4d019670b94b17e329007d64e67e045e", - "sha256": "946b7c856aa62f4ad31de2b9bb501cfdcdb4afdc882ee76bd4664f57caefaa44" - } - }, - { - "filename": "requests-1.2.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/c0/44/84a4b7a4e9d5fd1b358dbabd03f17e3dd91ce8881fc3446fbd2fd996be88/requests-1.2.2.tar.gz", - "hashes": { - "md5": "1f655ab7f2aa7447a1657ed69786f436", - "sha256": "56929d7b5dec9b37a9a8520f15202bada0ad55d2888a7c3243b9b194f2ef603d" - } - }, - { - "filename": "requests-1.2.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/61/79/efc316760a906763de872d7328c9bf8c5af28708a35fdae57fbb4ee005f7/requests-1.2.3.tar.gz", - "hashes": { - "md5": "adbd3f18445f7fe5e77f65c502e264fb", - "sha256": "156bf3ec27ba9ec7e0cf8fbe02808718099d218de403eb64a714d73ba1a29ab1" - } - }, - { - "filename": "requests-2.0.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/bf/78/be2b4c440ea767336d8448fe671fe1d78ca499e49d77dac90f92191cca0e/requests-2.0.0-py2.py3-none-any.whl", - "hashes": { - "md5": "6af9c16dbddd2fc751ae4f1606d041e8", - "sha256": "2ef65639cb9600443f85451df487818c31f993ab288f313d29cc9db4f3cbe6ed" - } - }, - { - "filename": "requests-2.0.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/8e/88/102742c48605aef8d39fa719d932c67783d789679628fa1433cb4b2c7a2a/requests-2.0.0.tar.gz", - "hashes": { - "md5": "856fc825c17483e25fd55db115028e3f", - "sha256": "78536038f54cff6ade3be6863403146665b5a3923dd61108c98d8b64141f9d70" - } - }, - { - "filename": "requests-2.0.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/8f/ea/140f18072bbcd81885a9490abb171792fd2961fd7f366be58396f4c6d634/requests-2.0.1-py2.py3-none-any.whl", - "hashes": { - "md5": "d524f9a38a29efe1732fd130e5ebe433", - "sha256": "f4ebc402e0ea5a87a3d42e300b76c292612d8467024f45f9858a8768f9fb6f6e" - } - }, - { - "filename": "requests-2.0.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/1c/8e/376c93bb72bdae6a754797b8e31370df1e996e8b7dcc928e66691dbf611a/requests-2.0.1.tar.gz", - "hashes": { - "md5": "38e61c2856d2ba2782286730241975e6", - "sha256": "8cfddb97667c2a9edaf28b506d2479f1b8dc0631cbdcd0ea8c8864def59c698b" - } - }, - { - "filename": "requests-2.1.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/1e/97/f0a8e5e71c75a2abf5ec91438b84ec1a40a5e1b5f985c06721a3ebe57c0a/requests-2.1.0-py2.py3-none-any.whl", - "hashes": { - "md5": "0848cbc0cc7edd150cb8d6ddc25ca906", - "sha256": "fcef306d62b1c061eb00b8402cf136ff0ea1daf7a53b60cdef9563a22850072c" - } - }, - { - "filename": "requests-2.1.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/51/5d/3729c242ed7693f29941fd9d40e936d4994b0aa704dfd0c023312fcce8a3/requests-2.1.0.tar.gz", - "hashes": { - "md5": "28543001831f46b1ff40686ebc027deb", - "sha256": "a57307f3a5f35ec9e1254aaf3e0484063ee3ee6b5f123fb35c5b2673492efa71" - } - }, - { - "filename": "requests-2.10.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/99/b4/63d99ba8e189c47d906b43bae18af4396e336f2b1bfec86af31efe2d2cb8/requests-2.10.0-py2.py3-none-any.whl", - "hashes": { - "md5": "abf5a77de3e8a5973c738cca884502a0", - "sha256": "09bc1b5f3a56cd8c48d433213a8cba51a67d12936568f73b5f1793fcb0c0979e" - } - }, - { - "filename": "requests-2.10.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/49/6f/183063f01aae1e025cf0130772b55848750a2f3a89bfa11b385b35d7329d/requests-2.10.0.tar.gz", - "hashes": { - "md5": "a36f7a64600f1bfec4d55ae021d232ae", - "sha256": "63f1815788157130cee16a933b2ee184038e975f0017306d723ac326b5525b54" - } - }, - { - "filename": "requests-2.11.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/f8/90/42d5e0d9b5c4c3629a3d99823bbc3748fb85616f0f7a45e79ba7908d4642/requests-2.11.0-py2.py3-none-any.whl", - "hashes": { - "md5": "369b7333bf2f710143a1b6678f2f214c", - "sha256": "8b9b147f3dff1fc4055ff794ff931f735ed25e87efe667ed7c845a4bafae9b73" - } - }, - { - "filename": "requests-2.11.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/8d/66/649f861f980c0a168dd4cccc4dd0ed8fa5bd6c1bed3bea9a286434632771/requests-2.11.0.tar.gz", - "hashes": { - "md5": "147afc07d8967cf46359701551a6cb69", - "sha256": "b2ff053e93ef11ea08b0e596a1618487c4e4c5f1006d7a1706e3671c57dea385" - } - }, - { - "filename": "requests-2.11.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/ea/03/92d3278bf8287c5caa07dbd9ea139027d5a3592b0f4d14abf072f890fab2/requests-2.11.1-py2.py3-none-any.whl", - "hashes": { - "md5": "b4269c6fb64b9361288620ba028fd385", - "sha256": "545c4855cd9d7c12671444326337013766f4eea6068c3f0307fb2dc2696d580e" - } - }, - { - "filename": "requests-2.11.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/2e/ad/e627446492cc374c284e82381215dcd9a0a87c4f6e90e9789afefe6da0ad/requests-2.11.1.tar.gz", - "hashes": { - "md5": "ad5f9c47b5c5dfdb28363ad7546b0763", - "sha256": "5acf980358283faba0b897c73959cecf8b841205bb4b2ad3ef545f46eae1a133" - } - }, - { - "filename": "requests-2.12.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/00/93/9c5c04821578c2ee11af83189c5cbd8338724b5e04e1de5dc3643bbc5bbf/requests-2.12.0-py2.py3-none-any.whl", - "hashes": { - "md5": "018b0e512fc0c0c3f30c7fa3c376bb7a", - "sha256": "a7d8f8f46603b78f03a925227f33988276fbe6c1f3c8cb20174ba9bfc5114c4d" - } - }, - { - "filename": "requests-2.12.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/6a/97/7b856a8c8a0efebebb0bbba70c7ee879ee3f9654f28928665b64026ef09a/requests-2.12.0.tar.gz", - "hashes": { - "md5": "d0d3e5fb81c6b4d87c08ed5cad677337", - "sha256": "57b6c314a2c5f014dce634a0e1eeeb1707741b2e30bc7fee9c5b01fa216d57a3" - } - }, - { - "filename": "requests-2.12.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/9b/31/e9925a2b9a06f97c3450bac6107928d3533bfe64ca5615442504104321e8/requests-2.12.1-py2.py3-none-any.whl", - "hashes": { - "md5": "384ec19e410ffeb43951782c11d3223b", - "sha256": "3f3f27a9d0f9092935efc78054ef324eb9f8166718270aefe036dfa1e4f68e1e" - } - }, - { - "filename": "requests-2.12.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/6e/40/7434b2d9fe24107ada25ec90a1fc646e97f346130a2c51aa6a2b1aba28de/requests-2.12.1.tar.gz", - "hashes": { - "md5": "8c8ff05ea401ea22718038c3a416ea50", - "sha256": "2109ecea94df90980be040490ff1d879971b024861539abb00054062388b612e" - } - }, - { - "filename": "requests-2.12.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/59/dc/54d39bef11678853ca78fc6167cc1b57becf491548942246dd2226bf2bd2/requests-2.12.2-py2.py3-none-any.whl", - "hashes": { - "md5": "8c58fa0a054badea1cfbfa54a23299d2", - "sha256": "e5a102790b234bde8f949090e50e294490c2be0d81e3d55530fd91f3b5eded63" - } - }, - { - "filename": "requests-2.12.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/18/87/3c46a06df7b29cd3ab51f055cae2a954758ee3dcbd075d7f4c9a4e8aafbc/requests-2.12.2.tar.gz", - "hashes": { - "md5": "1ec26adca0265ead9afd42919867c370", - "sha256": "09dadb7c5c4210ebbc7f1b14a351a754f1191bd7cd5a5b60ee1929b8c7dcbbe6" - } - }, - { - "filename": "requests-2.12.3-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/84/68/f0acceafe80354aa9ff4ae49de0572d27929b6d262f0c55196424eb86b2f/requests-2.12.3-py2.py3-none-any.whl", - "hashes": { - "md5": "9b4e857c4a27a9c282cb1abb53ebaba2", - "sha256": "d92ed9912bab3f5e52d8e231be82c106650f648185e952f83c44ab4f2be55c0c" - } - }, - { - "filename": "requests-2.12.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/d9/03/155b3e67fe35fe5b6f4227a8d9e96a14fda828b18199800d161bcefc1359/requests-2.12.3.tar.gz", - "hashes": { - "md5": "0cafdecd95a46b081dd5fcfa4978db7a", - "sha256": "de5d266953875e9647e37ef7bfe6ef1a46ff8ddfe61b5b3652edf7ea717ee2b2" - } - }, - { - "filename": "requests-2.12.4-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/ed/9e/60cc074968c095f728f0d8d28370e8d396fa60afb7582735563cccf223dd/requests-2.12.4-py2.py3-none-any.whl", - "hashes": { - "md5": "3989eaeaa2ccad20470afc61710d3498", - "sha256": "000748df49e087784441b2621c50fb81046c5c8e80e0d91674ffad65b9e13844" - } - }, - { - "filename": "requests-2.12.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/5b/0b/34be574b1ec997247796e5d516f3a6b6509c4e064f2885a96ed885ce7579/requests-2.12.4.tar.gz", - "hashes": { - "md5": "acdb48888a9d3c7309da12fc7f83fedb", - "sha256": "ed98431a0631e309bb4b63c81d561c1654822cb103de1ac7b47e45c26be7ae34" - } - }, - { - "filename": "requests-2.12.5-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/bf/99/af6139323bac0ca0c6023eabbdc526579525f5584278d001dd2e169f8300/requests-2.12.5-py2.py3-none-any.whl", - "hashes": { - "md5": "eeb46098018d358d86c45131a8342060", - "sha256": "d57dae49f4267e8cb378aff9e426c9304a78794d03e945e39bfc607355715658" - } - }, - { - "filename": "requests-2.12.5.tar.gz", - "url": "https://files.pythonhosted.org/packages/b6/61/7b374462d5b6b1d824977182db287758d549d8680444bad8d530195acba2/requests-2.12.5.tar.gz", - "hashes": { - "md5": "360bb3af97881a7056ed5bb3d0a3e8a3", - "sha256": "d902a54f08d086a7cc6e58c20e2bb225b1ae82c19c35e5925269ee94fb9fce00" - } - }, - { - "filename": "requests-2.13.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/7e/ac/a80ed043485a3764053f59ca92f809cc8a18344692817152b0e8bd3ca891/requests-2.13.0-py2.py3-none-any.whl", - "hashes": { - "md5": "5e432dcf5bd1e3402ea1656700d99365", - "sha256": "1a720e8862a41aa22e339373b526f508ef0c8988baf48b84d3fc891a8e237efb" - } - }, - { - "filename": "requests-2.13.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/16/09/37b69de7c924d318e51ece1c4ceb679bf93be9d05973bb30c35babd596e2/requests-2.13.0.tar.gz", - "hashes": { - "md5": "921ec6b48f2ddafc8bb6160957baf444", - "sha256": "5722cd09762faa01276230270ff16af7acf7c5c45d623868d9ba116f15791ce8" - } - }, - { - "filename": "requests-2.14.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/1b/d3/f2541f2965e78f139bff9f001594d41ed90f4b2ce4b61bca387e60c1d3b4/requests-2.14.0-py2.py3-none-any.whl", - "hashes": { - "md5": "09e9f0852d50bee105ca859095298923", - "sha256": "a90555c0be723f5c711de36f256b21a65fc599602274fb3d5c4f83ac23aae3c5" - } - }, - { - "filename": "requests-2.14.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/0b/ac/ffd3674211bc47ae3bf55c7cd4a8fe484b7289af2ffd9cfed5683708690a/requests-2.14.0.tar.gz", - "hashes": { - "md5": "09c5b60caced97cbe69064d486d6db53", - "sha256": "8c4f778459cb4a6bad7ceff4aa65a75697db28c21a6b41ea9a6c371df2a822c2" - } - }, - { - "filename": "requests-2.14.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/74/ac/789eb98e0f5431d6d1ce36549ead88b2ab3154260f37c7dac9a34fd170b1/requests-2.14.1-py2.py3-none-any.whl", - "hashes": { - "md5": "81754d76f9a71a2d25f8c413fcf86e2c", - "sha256": "c5a42004b9cd384e5ad0f868b1cc968a3c2bb0276dccc12e4bdc7330591b5f51" - } - }, - { - "filename": "requests-2.14.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/8c/ff/78297074b9b4cf102f9bbd71b62508965dd5c1876e016ef131e5b15c16a4/requests-2.14.1.tar.gz", - "hashes": { - "md5": "e985e49070df0024777a55fd59ceef46", - "sha256": "b3b191d677e526c1e512db86bc7387ccb8356e8826bcc7faa07f78f09afe68dd" - } - }, - { - "filename": "requests-2.14.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/e4/b0/286e8a936158e5cc5791d5fa3bc4b1d5a7e1ff4e5b3f3766b63d8e97708a/requests-2.14.2-py2.py3-none-any.whl", - "hashes": { - "md5": "a1b2f02e7ba45dff7c76f621cde042c4", - "sha256": "3b39cde35be51762885631cf586f4dc2284951b44d479a4454020758d767cc2f" - } - }, - { - "filename": "requests-2.14.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/72/46/4abc3f5aaf7bf16a52206bb0c68677a26c216c1e6625c78c5aef695b5359/requests-2.14.2.tar.gz", - "hashes": { - "md5": "4c3c169ed67466088a2a6947784fe444", - "sha256": "a274abba399a23e8713ffd2b5706535ae280ebe2b8069ee6a941cb089440d153" - } - }, - { - "filename": "requests-2.15.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/fa/a5/e04c4607dc96e3e6b22dfa13ba8776c64bb65cb97ab90f05a3ee14096a0a/requests-2.15.1-py2.py3-none-any.whl", - "hashes": { - "md5": "bdf7767141594c4a927188f60665705a", - "sha256": "ff753b2196cd18b1bbeddc9dcd5c864056599f7a7d9a4fb5677e723efa2b7fb9" - } - }, - { - "filename": "requests-2.15.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/6d/ed/3adebdc29ca33f11bca00c38c72125cd4a51091e13685375ba4426fb59dc/requests-2.15.1.tar.gz", - "hashes": { - "md5": "1bcf7a286fa26e40a5a397f06ece00e4", - "sha256": "e5659b9315a0610505e050bb7190bf6fa2ccee1ac295f2b760ef9d8a03ebbb2e" - } - }, - { - "filename": "requests-2.16.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/35/b8/8ff3310309beb5fbca033b56504f869b0c65c1f284ae2a7900593b5acd3c/requests-2.16.0-py2.py3-none-any.whl", - "hashes": { - "md5": "f219013c8cacaaae7534ce2373cbeadc", - "sha256": "012cddec41f96a1ce4bab4b0a0ed40263ae6b2b03aa4bc4711e00418e7f3157c" - } - }, - { - "filename": "requests-2.16.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/26/e7/4f1ec439ecbcfe3989bb79a9c323d2482e7beea3d8d453e07443302648ec/requests-2.16.0.tar.gz", - "hashes": { - "md5": "5ca9eafc020445c86efc0be1f28f602e", - "sha256": "88eee720e83bc1dcb009ad5e2a8f1d41e903892121ec2a36eba7bf5a2d3ac2a0" - } - }, - { - "filename": "requests-2.16.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/c7/5d/7711f9fc9b028dc7572f84589e206220f0072e29fd9c7ae3507e7d17d8a6/requests-2.16.1-py2.py3-none-any.whl", - "hashes": { - "md5": "0a825bf34bf2cd89b13a04a3a7800e61", - "sha256": "b81b3651a206f02709e374c52071b4ac9bdf463c193701a560ce8e25c9ecc80b" - } - }, - { - "filename": "requests-2.16.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/4c/54/1d3abddbd4c7544138b88e8329ef5294ffdc6c5d7ea965bf42e3cc4c9c39/requests-2.16.1.tar.gz", - "hashes": { - "md5": "4acb351824461eb3ae1f74ec3a65ff28", - "sha256": "14d663571c66410a7c3634f4cb9040b16a1c083078e37a0f8cc3710eae63411e" - } - }, - { - "filename": "requests-2.16.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/67/91/b3893b0db7c645b9f92aa827ce3db630eef2dd3a2ad3109c2a28cdc9e6b7/requests-2.16.2-py2.py3-none-any.whl", - "hashes": { - "md5": "cc40805ee6f06d148aaa5e76d3e24a07", - "sha256": "afebb4fcabd66ba6e3188fd31f09915f5afd213b204014ea02448011eca1e49a" - } - }, - { - "filename": "requests-2.16.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/3c/69/d49fd9a7be23c55278c92e60af6d57336c463d8593afe7260a1665346965/requests-2.16.2.tar.gz", - "hashes": { - "md5": "e5425e53aa95e27a9a8267a097feafdc", - "sha256": "a2956efcf8dd2d526286431fdb0ec78eff25ab8db8a03c4f9d66f5fe6024f168" - } - }, - { - "filename": "requests-2.16.3-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/76/b6/e3035b7baa98e20d248fe17af2097b882ec7724d9a8ee7ae195ad7110f82/requests-2.16.3-py2.py3-none-any.whl", - "hashes": { - "md5": "0db7fa396a581c66ca4c1b8d02ce1bd4", - "sha256": "bcdc06ebfc25f2a198274ae4710c3217fb968c5f9468dc410cd603a59c47bff2" - } - }, - { - "filename": "requests-2.16.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/07/db/3ed266e9cd3e3f69af3af38f56a0b4e21dadf3065521b2860030889284d7/requests-2.16.3.tar.gz", - "hashes": { - "md5": "c9816b77406fd9f8e9b80ec8a560d4d8", - "sha256": "7fda55400281de8fba713dd120b4614eabc10c0b096c22bfc88ccc671227c3d4" - } - }, - { - "filename": "requests-2.16.4-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/13/52/41fb28aa332ed68cd616cd1fc44d9e9c4bb85aa60c28d275f8857da561e5/requests-2.16.4-py2.py3-none-any.whl", - "hashes": { - "md5": "d1a5f370e6c5236f898f27aa40a84358", - "sha256": "784213e164287b403497195cf7f45071ae5eec60ae260cbc9a26368a91445f57" - } - }, - { - "filename": "requests-2.16.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/47/68/4fe8c7e9e95133d15e342b1403a1751909cddb814a5a9cced2ba4c63487d/requests-2.16.4.tar.gz", - "hashes": { - "md5": "badefd50cfc5bc36926a2693e792d277", - "sha256": "14db43bfaa61fd3102eecaf447a593e0650ba0dc261c72597109a973c23091ab" - } - }, - { - "filename": "requests-2.16.5-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/65/9c/57484d6ac262af20a10b52cd95ebc99843f282342ef008997ef60f9eeb9c/requests-2.16.5-py2.py3-none-any.whl", - "hashes": { - "md5": "d10cd92d383805c5cc5a0683cf231e55", - "sha256": "3a27020d547958f5270fd5e9d62250119ee7db7454644599b65fda20cb542ded" - } - }, - { - "filename": "requests-2.16.5.tar.gz", - "url": "https://files.pythonhosted.org/packages/de/4c/7c36954d002030c82df31d000338d40fd91b4a993941a8f3c2dbe523c749/requests-2.16.5.tar.gz", - "hashes": { - "md5": "cca4f82209373759f5799fc0df6aca23", - "sha256": "f717303ebff661099cc5b73ce723ae1246f19ac39faa4c8005be56744d1a1006" - } - }, - { - "filename": "requests-2.17.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/5b/b6/9a18db79553524246aa1b081829e6f977667ec558cef684988895c1092d9/requests-2.17.0-py2.py3-none-any.whl", - "hashes": { - "md5": "6856177470710847da6eb8c5ffb94ed6", - "sha256": "73b4088c05f7fb5ca8e68651ed802df3ca40621281acf74bb321b4a8408aab7e" - } - }, - { - "filename": "requests-2.17.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/7c/84/617aaa311f6504489459c016daff4c66df6bbd54ee35b4cbed3e994f322d/requests-2.17.0.tar.gz", - "hashes": { - "md5": "60e16f82a83d02ba30f9139310bf5301", - "sha256": "eff227db5864238d44270cbadc8ac4133e69b69a2e7092b7b316ed1e4761cbd6" - } - }, - { - "filename": "requests-2.17.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/50/41/f6fdaf24a80c726a72f76b15869a20734b7a527081129a380ddce99ffae0/requests-2.17.1-py2.py3-none-any.whl", - "hashes": { - "md5": "6ef65029dde7091e65fae2561f36305a", - "sha256": "02242978c6aaee47953da9e4d20d9d9929a1284a6b3a8a63a243ac1b842bd12c" - } - }, - { - "filename": "requests-2.17.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/d0/c0/f66d080e64a361382ed665023b9925e274d833f410f8c7282fb878e9c60e/requests-2.17.1.tar.gz", - "hashes": { - "md5": "53318fe8030b8b234ca672cde82916e4", - "sha256": "9cf3698006012c000af2804fe4186042a4d55df0303552dd190a74f5eaafe69b" - } - }, - { - "filename": "requests-2.17.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/9a/0b/7a65b391bde96d7b1749dc3562ce22f9cc86f37bd37122f71162304e3164/requests-2.17.2-py2.py3-none-any.whl", - "hashes": { - "md5": "30bd4d2841ae4c86ffd89db2a2703c75", - "sha256": "76d2f962485ebb3b3c380f146d56f5475310e53fd0defd6df0eb1c014187d45c" - } - }, - { - "filename": "requests-2.17.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/23/c2/99fe3c5c15f3d06f0620bc0867bee95ec64074cbd7c9805bb5ad3010411e/requests-2.17.2.tar.gz", - "hashes": { - "md5": "f28069fe8ef82543387f3dbe152cffa3", - "sha256": "3cc7a584aad15e84d193a6d7c9176af0cf49bc6611f24ec2e04be6b05957c96d" - } - }, - { - "filename": "requests-2.17.3-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/29/b9/d26a6ab2ee178415ab8c0c591d2a1eb782a50c42a417ae390055f86a63c1/requests-2.17.3-py2.py3-none-any.whl", - "hashes": { - "md5": "66a7f010b985631e768485af6f3c61df", - "sha256": "baf701b4a9d4cbe40169e8ab77816f7abadbad502ba459c30f7a2bc138e4d612" - } - }, - { - "filename": "requests-2.17.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/27/c7/a45641c83c6e28f4922ba6af3d4ae4d79b41932c2f3d77fed9e0bf878149/requests-2.17.3.tar.gz", - "hashes": { - "md5": "b1b8e6412e11e00e12adbb7786c3f2a3", - "sha256": "8d29f97ed1541709b57caddb77bb20592411d7ca10ec4f03275f49ee8456e225" - } - }, + "files": [ { + "core-metadata": { + "sha256": "4beb28df7dccdb2c54530560738dda249189e114357a69d5e5e7f06a2a019197" + }, + "data-dist-info-metadata": { + "sha256": "4beb28df7dccdb2c54530560738dda249189e114357a69d5e5e7f06a2a019197" + }, "filename": "requests-2.18.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/e2/f0/c81405acbf53d0412b984eb3fc578cdd10e347374e1aec074638a500c186/requests-2.18.0-py2.py3-none-any.whl", "hashes": { - "md5": "6f34e2439fcb3dd1b6e3304903bb6be8", "sha256": "5e88d64aa56ac0fda54e77fb9762ebc65879e171b746d5479a33c4082519d6c6" - } + }, + "requires-python": null, + "size": 563596, + "upload-time": "2017-06-14T15:44:35.080617Z", + "url": "https://files.pythonhosted.org/packages/e2/f0/c81405acbf53d0412b984eb3fc578cdd10e347374e1aec074638a500c186/requests-2.18.0-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "requests-2.18.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/e0/97/e2f972b6826c9cfe57b6934e3773d2783733bc2d345d810bafd309df3d15/requests-2.18.0.tar.gz", "hashes": { - "md5": "b8b333ace1653652ddcce95284577f5c", "sha256": "cd0189f962787284bff715fddaad478eb4d9c15aa167bd64e52ea0f661e7ea5c" - } + }, + "requires-python": null, + "size": 124085, + "upload-time": "2017-06-14T15:44:37.484470Z", + "url": "https://files.pythonhosted.org/packages/e0/97/e2f972b6826c9cfe57b6934e3773d2783733bc2d345d810bafd309df3d15/requests-2.18.0.tar.gz", + "yanked": false }, { + "core-metadata": { + "sha256": "4e4599f783a6950eb72a9d78fecb2f3438f07237e83708a587beda8a335b5f94" + }, + "data-dist-info-metadata": { + "sha256": "4e4599f783a6950eb72a9d78fecb2f3438f07237e83708a587beda8a335b5f94" + }, "filename": "requests-2.18.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/5a/58/671011e3ff4a06e2969322267d78dcfda1bf4d1576551df1cce93cd7239d/requests-2.18.1-py2.py3-none-any.whl", "hashes": { - "md5": "a7fbdc82134a2610b3d0cdc7e59f0bde", "sha256": "6afd3371c1f4c1970497cdcace5c5ecbbe58267bf05ca1abd93d99d170803ab7" - } + }, + "requires-python": null, + "size": 88107, + "upload-time": "2017-06-14T17:51:25.096686Z", + "url": "https://files.pythonhosted.org/packages/5a/58/671011e3ff4a06e2969322267d78dcfda1bf4d1576551df1cce93cd7239d/requests-2.18.1-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "requests-2.18.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/2c/b5/2b6e8ef8dd18203b6399e9f28c7d54f6de7b7549853fe36d575bd31e29a7/requests-2.18.1.tar.gz", "hashes": { - "md5": "40f723ed01dddeaf990d0609d073f021", "sha256": "c6f3bdf4a4323ac7b45d01e04a6f6c20e32a052cd04de81e05103abc049ad9b9" - } + }, + "requires-python": null, + "size": 124229, + "upload-time": "2017-06-14T17:51:28.960131Z", + "url": "https://files.pythonhosted.org/packages/2c/b5/2b6e8ef8dd18203b6399e9f28c7d54f6de7b7549853fe36d575bd31e29a7/requests-2.18.1.tar.gz", + "yanked": false }, { + "core-metadata": { + "sha256": "2f28a31e586b7d1d382e1b64b48ce26d5ff18781f9eca0fba7654b55d7a76549" + }, + "data-dist-info-metadata": { + "sha256": "2f28a31e586b7d1d382e1b64b48ce26d5ff18781f9eca0fba7654b55d7a76549" + }, "filename": "requests-2.18.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/cf/fa/31b222e4b44975de1b5ac3e1a725abdfeb00e0d761567ab426ee28a7fc73/requests-2.18.2-py2.py3-none-any.whl", "hashes": { - "md5": "08026e24839d8bf36d248abfb2b6b674", "sha256": "414459f05392835d4d653b57b8e58f98aea9c6ff2782e37de0a1ee92891ce900" - } + }, + "requires-python": null, + "size": 88342, + "upload-time": "2017-07-25T15:23:15.338694Z", + "url": "https://files.pythonhosted.org/packages/cf/fa/31b222e4b44975de1b5ac3e1a725abdfeb00e0d761567ab426ee28a7fc73/requests-2.18.2-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "requests-2.18.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/07/2e/81fdfdfac91cf3cb2518fb149ac67caf0e081b485eab68e9aee63396f7e8/requests-2.18.2.tar.gz", "hashes": { - "md5": "49bd9924d3be341871bc922cde6f372e", "sha256": "5b26fcc5e72757a867e4d562333f841eddcef93548908a1bb1a9207260618da9" - } + }, + "requires-python": null, + "size": 125381, + "upload-time": "2017-07-25T15:23:18.103843Z", + "url": "https://files.pythonhosted.org/packages/07/2e/81fdfdfac91cf3cb2518fb149ac67caf0e081b485eab68e9aee63396f7e8/requests-2.18.2.tar.gz", + "yanked": false }, { + "core-metadata": { + "sha256": "b486edffe7b597477bf5645377f50ad2cd4db97413c3e74df3051d9b0db41ac4" + }, + "data-dist-info-metadata": { + "sha256": "b486edffe7b597477bf5645377f50ad2cd4db97413c3e74df3051d9b0db41ac4" + }, "filename": "requests-2.18.3-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/ba/92/c35ed010e8f96781f08dfa6d9a6a19445a175a9304aceedece77cd48b68f/requests-2.18.3-py2.py3-none-any.whl", "hashes": { - "md5": "d2d34c959a45f7da592a383485ad8b8c", "sha256": "b62be4ec5999c24d10c98d248a136e7db20ca6616a2b65060cd9399417331e8a" - } + }, + "requires-python": null, + "size": 88626, + "upload-time": "2017-08-02T13:23:31.998938Z", + "url": "https://files.pythonhosted.org/packages/ba/92/c35ed010e8f96781f08dfa6d9a6a19445a175a9304aceedece77cd48b68f/requests-2.18.3-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "requests-2.18.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/c3/38/d95ddb6cc8558930600be088e174a2152261a1e0708a18bf91b5b8c90b22/requests-2.18.3.tar.gz", "hashes": { - "md5": "c8f60cf816a35c0c3fef0a40d0e407a6", "sha256": "fb68a7baef4965c12d9cd67c0f5a46e6e28be3d8c7b6910c758fbcc99880b518" - } + }, + "requires-python": null, + "size": 126008, + "upload-time": "2017-08-02T13:23:35.599515Z", + "url": "https://files.pythonhosted.org/packages/c3/38/d95ddb6cc8558930600be088e174a2152261a1e0708a18bf91b5b8c90b22/requests-2.18.3.tar.gz", + "yanked": false }, { + "core-metadata": { + "sha256": "37a7c01ccfdf63746e53a70d20723cb095be3f8048582ce38673adc640d14dfd" + }, + "data-dist-info-metadata": { + "sha256": "37a7c01ccfdf63746e53a70d20723cb095be3f8048582ce38673adc640d14dfd" + }, "filename": "requests-2.18.4-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/49/df/50aa1999ab9bde74656c2919d9c0c085fd2b3775fd3eca826012bef76d8c/requests-2.18.4-py2.py3-none-any.whl", "hashes": { "md5": "f392c0ab49bf677c6240ef2b1890b079", "sha256": "ce91d39dc2857eeb19fc8bf765df6c14874bcdc724d3ce9c6cd89915618e7023" - } + }, + "requires-python": null, + "size": 88704, + "upload-time": "2017-08-15T13:23:43.489631Z", + "url": "https://files.pythonhosted.org/packages/49/df/50aa1999ab9bde74656c2919d9c0c085fd2b3775fd3eca826012bef76d8c/requests-2.18.4-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "requests-2.18.4.tar.gz", - "url": "https://files.pythonhosted.org/packages/b0/e1/eab4fc3752e3d240468a8c0b284607899d2fbfb236a56b7377a329aa8d09/requests-2.18.4.tar.gz", "hashes": { "md5": "942a6a383dc94da90cf58f5adcf028a4", "sha256": "ec62f7e0e9d4814656b0172dbd592fea06127c6556ff5651eb5d2c8768671fd4" - } - }, - { - "filename": "requests-2.2.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/3b/99/a8acc0c986281232f9476575c27a81ab697afbf089f42f05c196f51892c0/requests-2.2.0-py2.py3-none-any.whl", - "hashes": { - "md5": "8f989615bb0d276d5f3158e7efab494c", - "sha256": "889d334044cd3364d07419c37671ba4f213d0f59601109dcb54c8a7ebdde38ee" - } - }, - { - "filename": "requests-2.2.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/c9/5a/aa687599abd76de72ae5a554e2e70328fc311d59e0b1e999263fb094baf3/requests-2.2.0.tar.gz", - "hashes": { - "md5": "4d2e17221d478ece045e2e81cdb177f5", - "sha256": "1ff74f88bbfddf94f92aa20bd8473c7d46d3398c95b1842d81b2f3c475d5625d" - } - }, - { - "filename": "requests-2.2.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/7d/15/6efffc6aee666e1456852c2bf1d483b46bf971a2d509b35a98fc3eae1c60/requests-2.2.1-py2.py3-none-any.whl", - "hashes": { - "md5": "1e38addb978e50bd86f62bda53956b03", - "sha256": "b5bd2e1b78d28051108ebaa6248750221f9ccef52b4f054cb727de61b0406de0" - } - }, - { - "filename": "requests-2.2.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/d1/0c/2dc2996268bc64b531a5a2dc6f4ec04552f3a8a2a86e88aeedcb92987741/requests-2.2.1.tar.gz", - "hashes": { - "md5": "ac27081135f58d1a43e4fb38258d6f4e", - "sha256": "1266921f1bed5fbf364cd83cf239b6d7b3ea5c32ccccbc93980d9ba12cdcfd02" - } - }, - { - "filename": "requests-2.3.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/f7/51/7aa1e337862118bee783c0249debd64cb07b8fbdfef154b1e185754b02d5/requests-2.3.0-py2.py3-none-any.whl", - "hashes": { - "md5": "f2d850fd48fc10a93aa03d69b87b96b4", - "sha256": "3648802492e955ffeb28f6dab864ad714059f5438bf6798d82f9d477c666aca3" - } - }, - { - "filename": "requests-2.3.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/ab/f9/4425c8410faf7c7d420dbd64e127f2cfb68cfef869a374b332610b6abc09/requests-2.3.0.tar.gz", - "hashes": { - "md5": "7449ffdc8ec9ac37bbcd286003c80f00", - "sha256": "1c1473875d846fe563d70868acf05b1953a4472f4695b7b3566d1d978957b8fc" - } - }, - { - "filename": "requests-2.4.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/78/14/23cf8ede304c7c8b69b929b17074292073827239c31659ab8c7beb22a059/requests-2.4.0-py2.py3-none-any.whl", - "hashes": { - "md5": "47948d2fb3f2aa04235e6f637814b226", - "sha256": "8b2cc9e334b3e66aa5df15f2e4967f2c95b5164a4e6df7e92dd70ca67400912a" - } - }, - { - "filename": "requests-2.4.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/ef/a0/9863b20b6a87e45cd4353c10277d9674f9ddfd7c28c58e61a339e273a119/requests-2.4.0.tar.gz", - "hashes": { - "md5": "99b830d1afe2e5920adbea0fe3120948", - "sha256": "7007e03cbc73e357b5055c6ea0ad6e447e2afa00f1a1f843cd792a1ebaa3763e" - } - }, - { - "filename": "requests-2.4.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/bf/81/22c8ed95e8088c0a7c022969534c8157930f0bed6ae77e12e86fdc2e855c/requests-2.4.1-py2.py3-none-any.whl", - "hashes": { - "md5": "19d5413dc71309e4fb1f8103b8eb99ce", - "sha256": "b9e3c10e5092b444bb4c1b0b337f57e6c3d7680ad7c5192f597e84dd931fb598" - } - }, - { - "filename": "requests-2.4.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/0f/d0/e80371e64a7a7bafa303ea50465456e5292d9436504ce39b9619b6ba24be/requests-2.4.1.tar.gz", - "hashes": { - "md5": "931461f761c70708c46ea65b7889da58", - "sha256": "35d890b0aaa6e09ec40d49361d823b998ced86cc7673a9ce70bbc4f986e13ad8" - } - }, - { - "filename": "requests-2.4.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/a2/87/afb7990b87f76ec9d11fd15668c2362a8fbe8436e0a780c7fe5aedf1a299/requests-2.4.2-py2.py3-none-any.whl", - "hashes": { - "md5": "f49f34b1fcdef6b557964deea1a80cf3", - "sha256": "49df4571ecd49d00a4587237b7d8be9664bb326052e06d2c488255b34f13393d" - } - }, - { - "filename": "requests-2.4.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/f8/25/1599a06d261fdd84256829d88f7a415c80a6e249988f9e17ba5016119b6f/requests-2.4.2.tar.gz", - "hashes": { - "md5": "a2476d2dd83a0520847f216ce0b5f9d1", - "sha256": "b98a76df30e95ef636af5e040ff7c5d0bc0b482899fd7a187b0ae525e41fe8f1" - } - }, - { - "filename": "requests-2.4.3-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/8a/98/bf72c7bd3ecfaf46dc2de3e59dcda6e61766526d3cf5897e9edd599795fc/requests-2.4.3-py2.py3-none-any.whl", - "hashes": { - "md5": "0a66a9c4c22272680430fbb9fb4ca34f", - "sha256": "124890f41723c85aa82dfe0807432aea46d24aeb0dafce340969d2089548c2c3" - } - }, - { - "filename": "requests-2.4.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/f4/ff/34a5a2eb91e35280e65585c48304094b61b58f9966de74ab72673c2fde9d/requests-2.4.3.tar.gz", - "hashes": { - "md5": "02214b3a179e445545de4b7a98d3dd17", - "sha256": "53c68313c5c6149b1a899234c000296e60a8900682accf73d6f0c6d608afc6b1" - } - }, - { - "filename": "requests-2.5.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/32/0e/11cfb3a5e269605d0bbe3bbca9845da9b57aed90e75bd489e5e7e3509c13/requests-2.5.0-py2.py3-none-any.whl", - "hashes": { - "md5": "9d29a8a0210c236d9329bed49277b3fa", - "sha256": "66cbb850987e47177a3b4112392490bcb76eb75b37cc53da007e35f3ec894bc1" - } - }, - { - "filename": "requests-2.5.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/c8/fb/d14d1c5166a8449d36c9a3b2656706c506a2cf261d37a79d16c18c37b646/requests-2.5.0.tar.gz", - "hashes": { - "md5": "b8bf3ddca75e7ecf1b6776da1e6e3385", - "sha256": "d2daef4919fc87262b8b3cb5a9d214cac8ce1e50950f8423bbc1d31c2e63d38e" - } - }, - { - "filename": "requests-2.5.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/54/9a/ee6051b19c62728d5467dead279c532798c287e39c3bc8becb1cfa9f525a/requests-2.5.1-py2.py3-none-any.whl", - "hashes": { - "md5": "11dc91bc96c5c5e0b566ce8f9c9644ab", - "sha256": "1f046dcf5ec712ed3be8684b9f33c95b76e28cd1c825db0f5e1557bfd87b3745" - } - }, - { - "filename": "requests-2.5.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/61/fe/2c0a4ca99c68ea24eec65d3094d6539d54635562678ee7a58420005c12b6/requests-2.5.1.tar.gz", - "hashes": { - "md5": "c270eb5551a02e8ab7a4cbb83e22af2e", - "sha256": "7b7735efd3b1e2323dc9fcef060b380d05f5f18bd0f247f5e9e74a628279de66" - } - }, - { - "filename": "requests-2.5.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/20/fc/53f45b9bdfa8bd5f11b7d60b50052a8e4729346fcc8d5854e0e1449d92b5/requests-2.5.2-py2.py3-none-any.whl", - "hashes": { - "md5": "7e72dfe8ed9d4ce5fd9dd9d799b3add1", - "sha256": "b4d1a981c443e19ee3f527b352022d698e16a298913d9b78ea1133f089eeb779" - } - }, - { - "filename": "requests-2.5.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/d6/f7/1a4c1cae7618ad3d9fe5536ef74f47b2cb1028938e12d6dfe0a9806a8e1b/requests-2.5.2.tar.gz", - "hashes": { - "md5": "424e2469202c9bace4e8bf4642d4217a", - "sha256": "306ead91d47a48b6a25d495d2495de99694641bd7d2cac5bcc405a8837c7a612" - } - }, - { - "filename": "requests-2.5.3-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/95/54/44dc83b5f11c6da06bf9abd18c8a0905e0e297e0a9c3bfbc0c6ee4bdd33d/requests-2.5.3-py2.py3-none-any.whl", - "hashes": { - "md5": "233249f4627ac5481c948e494d2a090e", - "sha256": "3e66d7ba78e7a6a8eccd2e901079ab8d24e408b5375cf32eb51f291306302418" - } - }, - { - "filename": "requests-2.5.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/a6/36/06a7d4261f91552f21f017fe162d69df95ca7925d1436c8acf73283ee3d0/requests-2.5.3.tar.gz", - "hashes": { - "md5": "23bf4fcc89ea8d353eb5353bb4a475b1", - "sha256": "55d7f5619daae94ec49ee81ed8c865e5a2a47f0bbf8e06cf94636bee103eaf65" - } - }, - { - "filename": "requests-2.6.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/73/63/b0729be549494a3e31316437053bc4e0a8bb71a07a6ee6059434b8f1cd5f/requests-2.6.0-py2.py3-none-any.whl", - "hashes": { - "md5": "3ab1972bbaf2802d94516fb86b9b0d0b", - "sha256": "fdb9af60d47ca57a80df0a213336019a34ff6192d8fff361c349f2c8398fe460" - } - }, - { - "filename": "requests-2.6.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/eb/70/237e11db04807a9409ed39997097118208e7814309d9bc3da7bb98d1fe3d/requests-2.6.0.tar.gz", - "hashes": { - "md5": "25287278fa3ea106207461112bb37050", - "sha256": "1cdbed1f0e236f35ef54e919982c7a338e4fea3786310933d3a7887a04b74d75" - } - }, - { - "filename": "requests-2.6.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/64/74/5bedd762987b5cb4ad5de4901d12942ad7635bffa5ae4f6b5e725d1b2068/requests-2.6.1-py2.py3-none-any.whl", - "hashes": { - "md5": "adb8e91b3367bc0417ef1e4a6dced9b1", - "sha256": "79515d60eae4f5d426b8813ffd60ed874169d78b8815844e8e85798ef27a599f" - } - }, - { - "filename": "requests-2.6.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/08/d5/3dfb95813d697d1e5a3eccb9b88f9d91a233fc35b0ddbb5bc238142f9de0/requests-2.6.1.tar.gz", - "hashes": { - "md5": "da6e487f89e6a531699b7fd97ff182af", - "sha256": "490b111c824d64b84797a899a4c22618bbc45323ac24a0a0bb4b73a8758e943c" - } - }, - { - "filename": "requests-2.6.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/9f/3e/c09023432b822a09d965878640de63f8126d77c948f45c24dcad13d42721/requests-2.6.2-py2.py3-none-any.whl", - "hashes": { - "md5": "36746c275589b2154307bbcc6d28320a", - "sha256": "8f0f56813f82d0c27d9578221268ac9af48f076c71ee69693305ceca6ca355bd" - } - }, - { - "filename": "requests-2.6.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/37/b3/d1a5d9768240a1104a620730a1226975ceb9dd3882a8cfd8935b314ee0ca/requests-2.6.2.tar.gz", - "hashes": { - "md5": "0d703e5be558566e0f8c37f960d95372", - "sha256": "0577249d4b6c4b11fd97c28037e98664bfaa0559022fee7bcef6b752a106e505" - } - }, - { - "filename": "requests-2.7.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/26/ff/c71b3943bebdd9f7ceb9e137296370587eb0b33fe2eb3732ae168bc45204/requests-2.7.0-py2.py3-none-any.whl", - "hashes": { - "md5": "564fb256f865a79f977e57b79d31659a", - "sha256": "20f976cdce02a42b69ce80e9e03897a51814b36d448b37288546086ebc473146" - } - }, - { - "filename": "requests-2.7.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/0a/00/8cc925deac3a87046a4148d7846b571cf433515872b5430de4cd9dea83cb/requests-2.7.0.tar.gz", - "hashes": { - "md5": "29b173fd5fa572ec0764d1fd7b527260", - "sha256": "398a3db6d61899d25fd4a06c6ca12051b0ce171d705decd7ed5511517b4bb93d" - } - }, - { - "filename": "requests-2.8.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/5d/a6/90f822c17b4fc905da67aed49b511f110207242ff164aeda926461101dc6/requests-2.8.0-py2.py3-none-any.whl", - "hashes": { - "md5": "52236eb6f886db4d2afba43775c97050", - "sha256": "3a34af0dd06fed021286d93da464bbb76dcc0c709d02e7d3cdca195b1341c380" - } - }, - { - "filename": "requests-2.8.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/1b/92/0632a7eb5e94bfedd300a3a5f4ebbf8505fd9768ba00ab259b5bf786de5f/requests-2.8.0.tar.gz", - "hashes": { - "md5": "3ec7198fc935d83c3eacff1ed4095ce4", - "sha256": "b2f003589b60924909c0acde472590c5ea83906986a7a25b6f7929eb20923b7b" - } - }, - { - "filename": "requests-2.8.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/c0/0f/a911a44c89ba01b23d8fe3defbdfca1e962de6f11a11da32658902cdc2a4/requests-2.8.1-py2.py3-none-any.whl", - "hashes": { - "md5": "46f1d621daa3ab38958a42f51478b1ee", - "sha256": "89f1b1f25dcd7b68f514e8d341a5b2eb466f960ae756822eaab480a3c1a81c28" - } - }, - { - "filename": "requests-2.8.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/38/2d/290d33417c079a5248fcd06b0b8492acdd1851e54e4bdad54c3859dab600/requests-2.8.1.tar.gz", - "hashes": { - "md5": "a27ea3d72d7822906ddce5e252d6add9", - "sha256": "84fe8d5bf4dcdcc49002446c47a146d17ac10facf00d9086659064ac43b6c25b" - } - }, - { - "filename": "requests-2.9.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/bf/b7/c0b5a7fcf561577178ffd65af9af37c412cf6fbb1a2a198b9308b343d63f/requests-2.9.0-py2.py3-none-any.whl", - "hashes": { - "md5": "149560afb69fe9e5048d05322eeb8ada", - "sha256": "1f4726bc7636edcbd141ba9c868dd92ecb77dbc869f68a28c32e9e149b070854" - } - }, - { - "filename": "requests-2.9.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/e4/99/3e33bfe263894278a094c374f87031554406e57fd0b1ad22520357556627/requests-2.9.0.tar.gz", - "hashes": { - "md5": "2f46fdceaf4f63e5e3665a8cb50d284f", - "sha256": "4881966532b5a36c552244fd909de66d1b8c4a26086f56fd5837cfcde63f8eb8" - } - }, - { - "filename": "requests-2.9.1-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/b8/f7/3bb4d18c234a8ce7044d5ee2e1082b7d72bf6c550afb8d51ae266dea56f1/requests-2.9.1-py2.py3-none-any.whl", - "hashes": { - "md5": "58a444aaa02780ad01983f5f540e67b2", - "sha256": "113fbba5531a9e34945b7d36b33a084e8ba5d0664b703c81a7c572d91919a5b8" - } - }, - { - "filename": "requests-2.9.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/f9/6d/07c44fb1ebe04d069459a189e7dab9e4abfe9432adcd4477367c25332748/requests-2.9.1.tar.gz", - "hashes": { - "md5": "0b7f480d19012ec52bab78292efd976d", - "sha256": "c577815dd00f1394203fc44eb979724b098f88264a9ef898ee45b8e5e9cf587f" - } - }, - { - "filename": "requests-2.9.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/8b/e7/229a428b8eb9a7f925ef16ff09ab25856efe789410d661f10157919f2ae2/requests-2.9.2-py2.py3-none-any.whl", - "hashes": { - "md5": "afecc76f13f3ae5e5dab18ae64c73c84", - "sha256": "22a8c72dfc7fc18db1aca6784e97a638e9d09abe2cd387be473f88bd6dcba22f" - } - }, - { - "filename": "requests-2.9.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/64/20/2133a092a0e87d1c250fe48704974b73a1341b7e4f800edecf40462a825d/requests-2.9.2.tar.gz", - "hashes": { - "md5": "18d0e51cd5e84c7d8b6dcbdd51551984", - "sha256": "d8be941a08cf36e4f424ac76073eb911e5e646a33fcb3402e1642c426bf34682" - } + }, + "requires-python": null, + "size": 126224, + "upload-time": "2017-08-15T13:23:46.348325Z", + "url": "https://files.pythonhosted.org/packages/b0/e1/eab4fc3752e3d240468a8c0b284607899d2fbfb236a56b7377a329aa8d09/requests-2.18.4.tar.gz", + "yanked": false + }, + { + "core-metadata": { + "sha256": "e022ab2bfbbfbf3b77f29b8bc3115eb5b202c651b9b928ec9c0b7ef9a16070f3" + }, + "data-dist-info-metadata": { + "sha256": "e022ab2bfbbfbf3b77f29b8bc3115eb5b202c651b9b928ec9c0b7ef9a16070f3" + }, + "filename": "requests-2.19.0-py2.py3-none-any.whl", + "hashes": { + "sha256": "421cfc8d9dde7d6aff68196420afd86b88c65d77d8da9cf83f4ecad785d7b9d6" + }, + "requires-python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 91865, + "upload-time": "2018-06-12T14:46:15.289074Z", + "url": "https://files.pythonhosted.org/packages/cc/15/e1c318dbc20032ffbe5628837ca0de2d5b116ffd1b849c699634010f6a5d/requests-2.19.0-py2.py3-none-any.whl", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "requests-2.19.0.tar.gz", + "hashes": { + "sha256": "cc408268d0e21589bcc2b2c248e42932b8c4d112f499c12c92e99e2178a6134c" + }, + "requires-python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 130875, + "upload-time": "2018-06-12T14:46:17.223245Z", + "url": "https://files.pythonhosted.org/packages/75/27/82da3fa4ea7a8c3526c48eaafe427352ff9c931633b917c2251826a43697/requests-2.19.0.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0" - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "requests", + "versions": [ + "2.18.0", + "2.18.1", + "2.18.2", + "2.18.3", + "2.18.4", + "2.19.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/requests/2.18.0.json b/tests/repositories/fixtures/pypi.org/json/requests/2.18.0.json new file mode 100644 index 00000000000..90364b9423c --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/requests/2.18.0.json @@ -0,0 +1,109 @@ +{ + "info": { + "author": "Kenneth Reitz", + "author_email": "me@kennethreitz.org", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Natural Language :: English", + "Programming Language :: Python", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://python-requests.org", + "keywords": "", + "license": "Apache 2.0", + "maintainer": "", + "maintainer_email": "", + "name": "requests", + "package_url": "https://pypi.org/project/requests/", + "platform": "", + "project_url": "https://pypi.org/project/requests/", + "project_urls": { + "Homepage": "http://python-requests.org" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/requests/2.18.0/", + "requires_dist": [ + "certifi (>=2017.4.17)", + "chardet (>=3.0.2,<3.1.0)", + "idna (>=2.5,<2.6)", + "urllib3 (<1.22,>=1.21.1)", + "cryptography (>=1.3.4); extra == 'security'", + "idna (>=2.0.0); extra == 'security'", + "pyOpenSSL (>=0.14); extra == 'security'", + "PySocks (!=1.5.7,>=1.5.6); extra == 'socks'", + "win-inet-pton; sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\") and extra == 'socks'" + ], + "requires_python": "", + "summary": "Python HTTP for Humans.", + "version": "2.18.0", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "e2f0c81405acbf53d0412b984eb3fc578cdd10e347374e1aec074638a500c186", + "md5": "6f34e2439fcb3dd1b6e3304903bb6be8", + "sha256": "5e88d64aa56ac0fda54e77fb9762ebc65879e171b746d5479a33c4082519d6c6" + }, + "downloads": -1, + "filename": "requests-2.18.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "6f34e2439fcb3dd1b6e3304903bb6be8", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 563596, + "upload_time": "2017-06-14T15:44:35", + "upload_time_iso_8601": "2017-06-14T15:44:35.080617Z", + "url": "https://files.pythonhosted.org/packages/e2/f0/c81405acbf53d0412b984eb3fc578cdd10e347374e1aec074638a500c186/requests-2.18.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "e097e2f972b6826c9cfe57b6934e3773d2783733bc2d345d810bafd309df3d15", + "md5": "b8b333ace1653652ddcce95284577f5c", + "sha256": "cd0189f962787284bff715fddaad478eb4d9c15aa167bd64e52ea0f661e7ea5c" + }, + "downloads": -1, + "filename": "requests-2.18.0.tar.gz", + "has_sig": false, + "md5_digest": "b8b333ace1653652ddcce95284577f5c", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 124085, + "upload_time": "2017-06-14T15:44:37", + "upload_time_iso_8601": "2017-06-14T15:44:37.484470Z", + "url": "https://files.pythonhosted.org/packages/e0/97/e2f972b6826c9cfe57b6934e3773d2783733bc2d345d810bafd309df3d15/requests-2.18.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/requests/2.18.1.json b/tests/repositories/fixtures/pypi.org/json/requests/2.18.1.json new file mode 100644 index 00000000000..037ae6be36e --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/requests/2.18.1.json @@ -0,0 +1,109 @@ +{ + "info": { + "author": "Kenneth Reitz", + "author_email": "me@kennethreitz.org", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Natural Language :: English", + "Programming Language :: Python", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://python-requests.org", + "keywords": "", + "license": "Apache 2.0", + "maintainer": "", + "maintainer_email": "", + "name": "requests", + "package_url": "https://pypi.org/project/requests/", + "platform": "", + "project_url": "https://pypi.org/project/requests/", + "project_urls": { + "Homepage": "http://python-requests.org" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/requests/2.18.1/", + "requires_dist": [ + "certifi (>=2017.4.17)", + "chardet (>=3.0.2,<3.1.0)", + "idna (>=2.5,<2.6)", + "urllib3 (<1.22,>=1.21.1)", + "cryptography (>=1.3.4); extra == 'security'", + "idna (>=2.0.0); extra == 'security'", + "pyOpenSSL (>=0.14); extra == 'security'", + "PySocks (!=1.5.7,>=1.5.6); extra == 'socks'", + "win-inet-pton; sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\") and extra == 'socks'" + ], + "requires_python": "", + "summary": "Python HTTP for Humans.", + "version": "2.18.1", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "5a58671011e3ff4a06e2969322267d78dcfda1bf4d1576551df1cce93cd7239d", + "md5": "a7fbdc82134a2610b3d0cdc7e59f0bde", + "sha256": "6afd3371c1f4c1970497cdcace5c5ecbbe58267bf05ca1abd93d99d170803ab7" + }, + "downloads": -1, + "filename": "requests-2.18.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "a7fbdc82134a2610b3d0cdc7e59f0bde", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 88107, + "upload_time": "2017-06-14T17:51:25", + "upload_time_iso_8601": "2017-06-14T17:51:25.096686Z", + "url": "https://files.pythonhosted.org/packages/5a/58/671011e3ff4a06e2969322267d78dcfda1bf4d1576551df1cce93cd7239d/requests-2.18.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "2cb52b6e8ef8dd18203b6399e9f28c7d54f6de7b7549853fe36d575bd31e29a7", + "md5": "40f723ed01dddeaf990d0609d073f021", + "sha256": "c6f3bdf4a4323ac7b45d01e04a6f6c20e32a052cd04de81e05103abc049ad9b9" + }, + "downloads": -1, + "filename": "requests-2.18.1.tar.gz", + "has_sig": false, + "md5_digest": "40f723ed01dddeaf990d0609d073f021", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 124229, + "upload_time": "2017-06-14T17:51:28", + "upload_time_iso_8601": "2017-06-14T17:51:28.960131Z", + "url": "https://files.pythonhosted.org/packages/2c/b5/2b6e8ef8dd18203b6399e9f28c7d54f6de7b7549853fe36d575bd31e29a7/requests-2.18.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/requests/2.18.2.json b/tests/repositories/fixtures/pypi.org/json/requests/2.18.2.json new file mode 100644 index 00000000000..376040059a4 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/requests/2.18.2.json @@ -0,0 +1,109 @@ +{ + "info": { + "author": "Kenneth Reitz", + "author_email": "me@kennethreitz.org", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Natural Language :: English", + "Programming Language :: Python", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://python-requests.org", + "keywords": "", + "license": "Apache 2.0", + "maintainer": "", + "maintainer_email": "", + "name": "requests", + "package_url": "https://pypi.org/project/requests/", + "platform": "", + "project_url": "https://pypi.org/project/requests/", + "project_urls": { + "Homepage": "http://python-requests.org" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/requests/2.18.2/", + "requires_dist": [ + "certifi (>=2017.4.17)", + "chardet (>=3.0.2,<3.1.0)", + "idna (>=2.5,<2.6)", + "urllib3 (<1.23,>=1.21.1)", + "cryptography (>=1.3.4); extra == 'security'", + "idna (>=2.0.0); extra == 'security'", + "pyOpenSSL (>=0.14); extra == 'security'", + "PySocks (!=1.5.7,>=1.5.6); extra == 'socks'", + "win-inet-pton; sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\") and extra == 'socks'" + ], + "requires_python": "", + "summary": "Python HTTP for Humans.", + "version": "2.18.2", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "cffa31b222e4b44975de1b5ac3e1a725abdfeb00e0d761567ab426ee28a7fc73", + "md5": "08026e24839d8bf36d248abfb2b6b674", + "sha256": "414459f05392835d4d653b57b8e58f98aea9c6ff2782e37de0a1ee92891ce900" + }, + "downloads": -1, + "filename": "requests-2.18.2-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "08026e24839d8bf36d248abfb2b6b674", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 88342, + "upload_time": "2017-07-25T15:23:15", + "upload_time_iso_8601": "2017-07-25T15:23:15.338694Z", + "url": "https://files.pythonhosted.org/packages/cf/fa/31b222e4b44975de1b5ac3e1a725abdfeb00e0d761567ab426ee28a7fc73/requests-2.18.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "072e81fdfdfac91cf3cb2518fb149ac67caf0e081b485eab68e9aee63396f7e8", + "md5": "49bd9924d3be341871bc922cde6f372e", + "sha256": "5b26fcc5e72757a867e4d562333f841eddcef93548908a1bb1a9207260618da9" + }, + "downloads": -1, + "filename": "requests-2.18.2.tar.gz", + "has_sig": false, + "md5_digest": "49bd9924d3be341871bc922cde6f372e", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 125381, + "upload_time": "2017-07-25T15:23:18", + "upload_time_iso_8601": "2017-07-25T15:23:18.103843Z", + "url": "https://files.pythonhosted.org/packages/07/2e/81fdfdfac91cf3cb2518fb149ac67caf0e081b485eab68e9aee63396f7e8/requests-2.18.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/requests/2.18.3.json b/tests/repositories/fixtures/pypi.org/json/requests/2.18.3.json new file mode 100644 index 00000000000..ae5c3654445 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/requests/2.18.3.json @@ -0,0 +1,109 @@ +{ + "info": { + "author": "Kenneth Reitz", + "author_email": "me@kennethreitz.org", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Natural Language :: English", + "Programming Language :: Python", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://python-requests.org", + "keywords": "", + "license": "Apache 2.0", + "maintainer": "", + "maintainer_email": "", + "name": "requests", + "package_url": "https://pypi.org/project/requests/", + "platform": "", + "project_url": "https://pypi.org/project/requests/", + "project_urls": { + "Homepage": "http://python-requests.org" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/requests/2.18.3/", + "requires_dist": [ + "certifi (>=2017.4.17)", + "chardet (>=3.0.2,<3.1.0)", + "idna (>=2.5,<2.6)", + "urllib3 (<1.23,>=1.21.1)", + "cryptography (>=1.3.4); extra == 'security'", + "idna (>=2.0.0); extra == 'security'", + "pyOpenSSL (>=0.14); extra == 'security'", + "PySocks (!=1.5.7,>=1.5.6); extra == 'socks'", + "win-inet-pton; sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\") and extra == 'socks'" + ], + "requires_python": "", + "summary": "Python HTTP for Humans.", + "version": "2.18.3", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "ba92c35ed010e8f96781f08dfa6d9a6a19445a175a9304aceedece77cd48b68f", + "md5": "d2d34c959a45f7da592a383485ad8b8c", + "sha256": "b62be4ec5999c24d10c98d248a136e7db20ca6616a2b65060cd9399417331e8a" + }, + "downloads": -1, + "filename": "requests-2.18.3-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "d2d34c959a45f7da592a383485ad8b8c", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 88626, + "upload_time": "2017-08-02T13:23:31", + "upload_time_iso_8601": "2017-08-02T13:23:31.998938Z", + "url": "https://files.pythonhosted.org/packages/ba/92/c35ed010e8f96781f08dfa6d9a6a19445a175a9304aceedece77cd48b68f/requests-2.18.3-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "c338d95ddb6cc8558930600be088e174a2152261a1e0708a18bf91b5b8c90b22", + "md5": "c8f60cf816a35c0c3fef0a40d0e407a6", + "sha256": "fb68a7baef4965c12d9cd67c0f5a46e6e28be3d8c7b6910c758fbcc99880b518" + }, + "downloads": -1, + "filename": "requests-2.18.3.tar.gz", + "has_sig": false, + "md5_digest": "c8f60cf816a35c0c3fef0a40d0e407a6", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 126008, + "upload_time": "2017-08-02T13:23:35", + "upload_time_iso_8601": "2017-08-02T13:23:35.599515Z", + "url": "https://files.pythonhosted.org/packages/c3/38/d95ddb6cc8558930600be088e174a2152261a1e0708a18bf91b5b8c90b22/requests-2.18.3.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/requests/2.18.4.json b/tests/repositories/fixtures/pypi.org/json/requests/2.18.4.json index 411f1dae48a..d97b7b62bc8 100644 --- a/tests/repositories/fixtures/pypi.org/json/requests/2.18.4.json +++ b/tests/repositories/fixtures/pypi.org/json/requests/2.18.4.json @@ -19,37 +19,47 @@ "Programming Language :: Python :: Implementation :: PyPy" ], "description": "", + "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { - "last_day": 0, - "last_month": 0, - "last_week": 0 + "last_day": -1, + "last_month": -1, + "last_week": -1 }, + "dynamic": null, "home_page": "http://python-requests.org", "keywords": "", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "requests", + "package_url": "https://pypi.org/project/requests/", "platform": "", "project_url": "https://pypi.org/project/requests/", + "project_urls": { + "Homepage": "http://python-requests.org" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/requests/2.18.4/", "requires_dist": [ - "win-inet-pton; sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\") and extra == 'socks'", - "PySocks (!=1.5.7,>=1.5.6); extra == 'socks'", - "pyOpenSSL (>=0.14); extra == 'security'", - "idna (>=2.0.0); extra == 'security'", - "cryptography (>=1.3.4); extra == 'security'", - "urllib3 (<1.23,>=1.21.1)", - "idna (>=2.5,<2.7)", + "certifi (>=2017.4.17)", "chardet (>=3.0.2,<3.1.0)", - "certifi (>=2017.4.17)" + "idna (>=2.5,<2.7)", + "urllib3 (<1.23,>=1.21.1)", + "cryptography (>=1.3.4); extra == 'security'", + "idna (>=2.0.0); extra == 'security'", + "pyOpenSSL (>=0.14); extra == 'security'", + "PySocks (!=1.5.7,>=1.5.6); extra == 'socks'", + "win-inet-pton; sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\") and extra == 'socks'" ], "requires_python": "", "summary": "Python HTTP for Humans.", - "version": "2.18.4" + "version": "2.18.4", + "yanked": false, + "yanked_reason": null }, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -59,13 +69,17 @@ }, "downloads": -1, "filename": "requests-2.18.4-py2.py3-none-any.whl", - "has_sig": true, + "has_sig": false, "md5_digest": "f392c0ab49bf677c6240ef2b1890b079", "packagetype": "bdist_wheel", "python_version": "py2.py3", + "requires_python": null, "size": 88704, "upload_time": "2017-08-15T13:23:43", - "url": "https://files.pythonhosted.org/packages/49/df/50aa1999ab9bde74656c2919d9c0c085fd2b3775fd3eca826012bef76d8c/requests-2.18.4-py2.py3-none-any.whl" + "upload_time_iso_8601": "2017-08-15T13:23:43.489631Z", + "url": "https://files.pythonhosted.org/packages/49/df/50aa1999ab9bde74656c2919d9c0c085fd2b3775fd3eca826012bef76d8c/requests-2.18.4-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", @@ -75,13 +89,18 @@ }, "downloads": -1, "filename": "requests-2.18.4.tar.gz", - "has_sig": true, + "has_sig": false, "md5_digest": "942a6a383dc94da90cf58f5adcf028a4", "packagetype": "sdist", "python_version": "source", + "requires_python": null, "size": 126224, "upload_time": "2017-08-15T13:23:46", - "url": "https://files.pythonhosted.org/packages/b0/e1/eab4fc3752e3d240468a8c0b284607899d2fbfb236a56b7377a329aa8d09/requests-2.18.4.tar.gz" + "upload_time_iso_8601": "2017-08-15T13:23:46.348325Z", + "url": "https://files.pythonhosted.org/packages/b0/e1/eab4fc3752e3d240468a8c0b284607899d2fbfb236a56b7377a329aa8d09/requests-2.18.4.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/requests/2.19.0.json b/tests/repositories/fixtures/pypi.org/json/requests/2.19.0.json new file mode 100644 index 00000000000..417099ea8c9 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/requests/2.19.0.json @@ -0,0 +1,108 @@ +{ + "info": { + "author": "Kenneth Reitz", + "author_email": "me@kennethreitz.org", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Natural Language :: English", + "Programming Language :: Python", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy" + ], + "description": "", + "description_content_type": "", + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://python-requests.org", + "keywords": "", + "license": "Apache 2.0", + "maintainer": "", + "maintainer_email": "", + "name": "requests", + "package_url": "https://pypi.org/project/requests/", + "platform": "", + "project_url": "https://pypi.org/project/requests/", + "project_urls": { + "Homepage": "http://python-requests.org" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/requests/2.19.0/", + "requires_dist": [ + "chardet (<3.1.0,>=3.0.2)", + "idna (<2.8,>=2.5)", + "urllib3 (<1.24,>=1.21.1)", + "certifi (>=2017.4.17)", + "pyOpenSSL (>=0.14); extra == 'security'", + "cryptography (>=1.3.4); extra == 'security'", + "idna (>=2.0.0); extra == 'security'", + "PySocks (!=1.5.7,>=1.5.6); extra == 'socks'", + "win-inet-pton; sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\") and extra == 'socks'" + ], + "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "summary": "Python HTTP for Humans.", + "version": "2.19.0", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "cc15e1c318dbc20032ffbe5628837ca0de2d5b116ffd1b849c699634010f6a5d", + "md5": "1ae2b89f8ea3e4aea8b199987fb2aae9", + "sha256": "421cfc8d9dde7d6aff68196420afd86b88c65d77d8da9cf83f4ecad785d7b9d6" + }, + "downloads": -1, + "filename": "requests-2.19.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "1ae2b89f8ea3e4aea8b199987fb2aae9", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 91865, + "upload_time": "2018-06-12T14:46:15", + "upload_time_iso_8601": "2018-06-12T14:46:15.289074Z", + "url": "https://files.pythonhosted.org/packages/cc/15/e1c318dbc20032ffbe5628837ca0de2d5b116ffd1b849c699634010f6a5d/requests-2.19.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "752782da3fa4ea7a8c3526c48eaafe427352ff9c931633b917c2251826a43697", + "md5": "8a7844c58d496e9e92481de459830229", + "sha256": "cc408268d0e21589bcc2b2c248e42932b8c4d112f499c12c92e99e2178a6134c" + }, + "downloads": -1, + "filename": "requests-2.19.0.tar.gz", + "has_sig": false, + "md5_digest": "8a7844c58d496e9e92481de459830229", + "packagetype": "sdist", + "python_version": "source", + "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 130875, + "upload_time": "2018-06-12T14:46:17", + "upload_time_iso_8601": "2018-06-12T14:46:17.223245Z", + "url": "https://files.pythonhosted.org/packages/75/27/82da3fa4ea7a8c3526c48eaafe427352ff9c931633b917c2251826a43697/requests-2.19.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/setuptools.json b/tests/repositories/fixtures/pypi.org/json/setuptools.json index 16a276a1296..0600461c7c1 100644 --- a/tests/repositories/fixtures/pypi.org/json/setuptools.json +++ b/tests/repositories/fixtures/pypi.org/json/setuptools.json @@ -1,23 +1,56 @@ { - "name": "setuptools", "files": [ { + "core-metadata": { + "sha256": "73f25249f8930d4b8f842a9e71ed57cf898d19b28beac684454b9c8a1c0cc2d8" + }, + "data-dist-info-metadata": { + "sha256": "73f25249f8930d4b8f842a9e71ed57cf898d19b28beac684454b9c8a1c0cc2d8" + }, "filename": "setuptools-39.2.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/7f/e1/820d941153923aac1d49d7fc37e17b6e73bfbd2904959fffbad77900cf92/setuptools-39.2.0-py2.py3-none-any.whl", "hashes": { - "md5": "bac10a56787c677a8850f0a2325892de", - "sha256": "9c2959b23011edc14cd3f18dc21d4bcd9702db8a47e0c02f4796aaccb5571a4b" - } + "sha256": "8fca9275c89964f13da985c3656cb00ba029d7f3916b37990927ffdf264e7926" + }, + "requires-python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*", + "size": 567556, + "upload-time": "2018-05-19T19:19:22.625819Z", + "url": "https://files.pythonhosted.org/packages/7f/e1/820d941153923aac1d49d7fc37e17b6e73bfbd2904959fffbad77900cf92/setuptools-39.2.0-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "setuptools-39.2.0.zip", + "hashes": { + "sha256": "f7cddbb5f5c640311eb00eab6e849f7701fa70bf6a183fc8a2c33dd1d1672fb2" + }, + "requires-python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*", + "size": 851112, + "upload-time": "2018-05-19T19:19:24.480740Z", "url": "https://files.pythonhosted.org/packages/1a/04/d6f1159feaccdfc508517dba1929eb93a2854de729fa68da9d5c6b48fa00/setuptools-39.2.0.zip", + "yanked": false + }, + { + "core-metadata": { + "sha256": "4cf21fee4bb46056adb125243cf6d0f5e1efafab06fae67223b43631dbd81cb6" + }, + "data-dist-info-metadata": { + "sha256": "4cf21fee4bb46056adb125243cf6d0f5e1efafab06fae67223b43631dbd81cb6" + }, + "filename": "setuptools-67.6.1-py3-none-any.whl", "hashes": { - "md5": "520b72f2ed79f0854d2d757a890289f4", - "sha256": "63a8deff51e99dd78fcabf4ce58739851ff9726e8ea2d3848f43f3aa365bb459" - } + "md5": "3b5b846e000da033d54eeaaf7915126e", + "sha256": "e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" + }, + "requires-python": ">=3.7", + "size": 1089263, + "upload-time": "2023-03-28T13:45:43.525946Z", + "url": "https://files.pythonhosted.org/packages/0b/fc/8781442def77b0aa22f63f266d4dadd486ebc0c5371d6290caf4320da4b7/setuptools-67.6.1-py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "setuptools-67.6.1.tar.gz", "hashes": { "md5": "ee2562f783544d1f95022c906dd3cf98", @@ -31,9 +64,10 @@ } ], "meta": { - "api-version": "1.0", - "_last-serial": 3879671 + "_last-serial": 0, + "api-version": "1.1" }, + "name": "setuptools", "versions": [ "39.2.0", "67.6.1" diff --git a/tests/repositories/fixtures/pypi.org/json/setuptools/39.2.0.json b/tests/repositories/fixtures/pypi.org/json/setuptools/39.2.0.json index acf8b7ec42f..2fe96815fba 100644 --- a/tests/repositories/fixtures/pypi.org/json/setuptools/39.2.0.json +++ b/tests/repositories/fixtures/pypi.org/json/setuptools/39.2.0.json @@ -29,6 +29,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/pypa/setuptools", "keywords": "CPAN PyPI distutils eggs package management", "license": "", @@ -42,6 +43,7 @@ "Documentation": "https://setuptools.readthedocs.io/", "Homepage": "https://github.com/pypa/setuptools" }, + "provides_extra": null, "release_url": "https://pypi.org/project/setuptools/39.2.0/", "requires_dist": [ "certifi (==2016.9.26); extra == 'certs'", @@ -53,18 +55,19 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 14429235, + "last_serial": 0, "urls": [ { "comment_text": "", "digests": { - "md5": "bac10a56787c677a8850f0a2325892de", - "sha256": "9c2959b23011edc14cd3f18dc21d4bcd9702db8a47e0c02f4796aaccb5571a4b" + "blake2b_256": "7fe1820d941153923aac1d49d7fc37e17b6e73bfbd2904959fffbad77900cf92", + "md5": "8d066d2201311ed30be535b473e32fed", + "sha256": "8fca9275c89964f13da985c3656cb00ba029d7f3916b37990927ffdf264e7926" }, "downloads": -1, "filename": "setuptools-39.2.0-py2.py3-none-any.whl", "has_sig": false, - "md5_digest": "bac10a56787c677a8850f0a2325892de", + "md5_digest": "8d066d2201311ed30be535b473e32fed", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*", @@ -78,13 +81,14 @@ { "comment_text": "", "digests": { - "md5": "8954553fcbf9f3619242215c18f18038", - "sha256": "ea495c0cf868d748cfa418fa7a1a5fa4f6884184a071a95c3fb661bff591488b" + "blake2b_256": "1a04d6f1159feaccdfc508517dba1929eb93a2854de729fa68da9d5c6b48fa00", + "md5": "dd4e3fa83a21bf7bf9c51026dc8a4e59", + "sha256": "f7cddbb5f5c640311eb00eab6e849f7701fa70bf6a183fc8a2c33dd1d1672fb2" }, "downloads": -1, "filename": "setuptools-39.2.0.zip", "has_sig": false, - "md5_digest": "8954553fcbf9f3619242215c18f18038", + "md5_digest": "dd4e3fa83a21bf7bf9c51026dc8a4e59", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*", diff --git a/tests/repositories/fixtures/pypi.org/json/setuptools/67.6.1.json b/tests/repositories/fixtures/pypi.org/json/setuptools/67.6.1.json index 0fa24749ed9..bbdb6ab4af6 100644 --- a/tests/repositories/fixtures/pypi.org/json/setuptools/67.6.1.json +++ b/tests/repositories/fixtures/pypi.org/json/setuptools/67.6.1.json @@ -23,6 +23,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/pypa/setuptools", "keywords": "CPAN PyPI distutils eggs package management", "license": "", @@ -37,6 +38,7 @@ "Documentation": "https://setuptools.pypa.io/", "Homepage": "https://github.com/pypa/setuptools" }, + "provides_extra": null, "release_url": "https://pypi.org/project/setuptools/67.6.1/", "requires_dist": [ "sphinx (>=3.5) ; extra == 'docs'", @@ -91,7 +93,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 17478645, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/six.json b/tests/repositories/fixtures/pypi.org/json/six.json index c31f23a2298..2a0a55d8731 100644 --- a/tests/repositories/fixtures/pypi.org/json/six.json +++ b/tests/repositories/fixtures/pypi.org/json/six.json @@ -1,25 +1,44 @@ { - "name": "six", "files": [ { + "core-metadata": { + "sha256": "d8e61e1b2a777206b74022118a9dd3410b5bee46bd65366c521ae4c5246c2019" + }, + "data-dist-info-metadata": { + "sha256": "d8e61e1b2a777206b74022118a9dd3410b5bee46bd65366c521ae4c5246c2019" + }, "filename": "six-1.11.0-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl", "hashes": { "md5": "35b1057b388e276352d0709138b1e194", "sha256": "112f5b46e6aa106db3e4e2494a03694c938f41c4c4535edbdfc816c2e0cb50f2" - } + }, + "requires-python": null, + "size": 10702, + "upload-time": "2017-09-17T18:46:53.702194Z", + "url": "https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "six-1.11.0.tar.gz", - "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz", "hashes": { "md5": "25d3568604f921dd23532b88a0ce17e7", "sha256": "268a4ccb159c1a2d2c79336b02e75058387b0cdbb4cea2f07846a758f48a356d" - } + }, + "requires-python": null, + "size": 29860, + "upload-time": "2017-09-17T18:46:54.492027Z", + "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3180827 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "six", + "versions": [ + "1.11.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/six/1.11.0.json b/tests/repositories/fixtures/pypi.org/json/six/1.11.0.json index 38cb1e49a45..85a59e11c2c 100644 --- a/tests/repositories/fixtures/pypi.org/json/six/1.11.0.json +++ b/tests/repositories/fixtures/pypi.org/json/six/1.11.0.json @@ -12,13 +12,15 @@ "Topic :: Utilities" ], "description": "", - "docs_url": "https://pythonhosted.org/six/", + "description_content_type": null, + "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://pypi.python.org/pypi/six/", "keywords": "", "license": "MIT", @@ -28,13 +30,19 @@ "package_url": "https://pypi.org/project/six/", "platform": "", "project_url": "https://pypi.org/project/six/", + "project_urls": { + "Homepage": "http://pypi.python.org/pypi/six/" + }, + "provides_extra": null, "release_url": "https://pypi.org/project/six/1.11.0/", "requires_dist": null, "requires_python": "", "summary": "Python 2 and 3 compatibility utilities", - "version": "1.11.0" + "version": "1.11.0", + "yanked": false, + "yanked_reason": null }, - "last_serial": 3180827, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -48,9 +56,13 @@ "md5_digest": "35b1057b388e276352d0709138b1e194", "packagetype": "bdist_wheel", "python_version": "py2.py3", + "requires_python": null, "size": 10702, "upload_time": "2017-09-17T18:46:53", - "url": "https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl" + "upload_time_iso_8601": "2017-09-17T18:46:53.702194Z", + "url": "https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null }, { "comment_text": "", @@ -64,9 +76,14 @@ "md5_digest": "25d3568604f921dd23532b88a0ce17e7", "packagetype": "sdist", "python_version": "source", + "requires_python": null, "size": 29860, "upload_time": "2017-09-17T18:46:54", - "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz" + "upload_time_iso_8601": "2017-09-17T18:46:54.492027Z", + "url": "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz", + "yanked": false, + "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/json/sqlalchemy.json b/tests/repositories/fixtures/pypi.org/json/sqlalchemy.json index ce3166a912e..23a407178d9 100644 --- a/tests/repositories/fixtures/pypi.org/json/sqlalchemy.json +++ b/tests/repositories/fixtures/pypi.org/json/sqlalchemy.json @@ -1,17 +1,26 @@ { - "name": "SQLAlchemy", "files": [ { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "SQLAlchemy-1.2.12.tar.gz", - "url": "https://files.pythonhosted.org/packages/25/c9/b0552098cee325425a61efdf380c51b5c721e459081c85bbb860f501c091/SQLAlchemy-1.2.12.tar.gz", "hashes": { "md5": "4a2617b5254748828d09349fc4eff6bd", "sha256": "b5a127599b3f27847fba6119de0fcb70832a8041b103701a708b7c7d044faa38" - } + }, + "requires-python": null, + "size": 5634807, + "upload-time": "2018-09-19T18:14:55.299706Z", + "url": "https://files.pythonhosted.org/packages/25/c9/b0552098cee325425a61efdf380c51b5c721e459081c85bbb860f501c091/SQLAlchemy-1.2.12.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 4289618 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "sqlalchemy", + "versions": [ + "1.2.12" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/sqlalchemy/1.2.12.json b/tests/repositories/fixtures/pypi.org/json/sqlalchemy/1.2.12.json index 359c3e8aa59..299b5826807 100644 --- a/tests/repositories/fixtures/pypi.org/json/sqlalchemy/1.2.12.json +++ b/tests/repositories/fixtures/pypi.org/json/sqlalchemy/1.2.12.json @@ -23,6 +23,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://www.sqlalchemy.org", "keywords": "", "license": "MIT License", @@ -35,6 +36,7 @@ "project_urls": { "Homepage": "http://www.sqlalchemy.org" }, + "provides_extra": null, "release_url": "https://pypi.org/project/SQLAlchemy/1.2.12/", "requires_dist": null, "requires_python": "", @@ -43,7 +45,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 14239243, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -53,7 +55,7 @@ }, "downloads": -1, "filename": "SQLAlchemy-1.2.12.tar.gz", - "has_sig": true, + "has_sig": false, "md5_digest": "4a2617b5254748828d09349fc4eff6bd", "packagetype": "sdist", "python_version": "source", diff --git a/tests/repositories/fixtures/pypi.org/json/toga.json b/tests/repositories/fixtures/pypi.org/json/toga.json index abd68fb5d70..04a26e3954c 100644 --- a/tests/repositories/fixtures/pypi.org/json/toga.json +++ b/tests/repositories/fixtures/pypi.org/json/toga.json @@ -1,137 +1,135 @@ { - "name": "toga", "files": [ { + "core-metadata": { + "sha256": "01822b37a113268b35ff7f655cccc286926c96bff01a35b4884a116188e2fec3" + }, + "data-dist-info-metadata": { + "sha256": "01822b37a113268b35ff7f655cccc286926c96bff01a35b4884a116188e2fec3" + }, "filename": "toga-0.3.0.dev1-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/eb/ef/ea806c706d3dc90d4bc8c412c0ad3515fd018074f5fdd4bd020bdd4c0c80/toga-0.3.0.dev1-py3-none-any.whl", "hashes": { - "md5": "7b219b2249b825f28051aae0230f2818", "sha256": "8553bf332d8fbf39b500745ed9c4044a846fbba68e31de70e6fe83fdffcb0a9e" - } + }, + "requires-python": null, + "size": 4789, + "upload-time": "2018-01-14T04:10:57.825822Z", + "url": "https://files.pythonhosted.org/packages/eb/ef/ea806c706d3dc90d4bc8c412c0ad3515fd018074f5fdd4bd020bdd4c0c80/toga-0.3.0.dev1-py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "toga-0.3.0.dev1.tar.gz", - "url": "https://files.pythonhosted.org/packages/4f/71/c55c15950f7275e761fe53fb0dc83fe4f5fba6199d7b8fb05d741dd33566/toga-0.3.0.dev1.tar.gz", "hashes": { - "md5": "21b8fff4d110ddfb8c3eb939d7b35a1e", "sha256": "4e5c77056792168a4e84c84bb7214dfb614b79f289dcbe1525be614483496439" - } + }, + "requires-python": null, + "size": 40187, + "upload-time": "2018-01-14T04:11:03.212494Z", + "url": "https://files.pythonhosted.org/packages/4f/71/c55c15950f7275e761fe53fb0dc83fe4f5fba6199d7b8fb05d741dd33566/toga-0.3.0.dev1.tar.gz", + "yanked": false }, { + "core-metadata": { + "sha256": "0d198a207170e3b5f2a7d20a8418efe297b77bb2ed098ece52c0366b2fc95de1" + }, + "data-dist-info-metadata": { + "sha256": "0d198a207170e3b5f2a7d20a8418efe297b77bb2ed098ece52c0366b2fc95de1" + }, "filename": "toga-0.3.0.dev2-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/3a/68/d1f6feb2ded26b9f6c36cd2a826e895e0fa6bba5fe489ec30b9f3bc1dbea/toga-0.3.0.dev2-py3-none-any.whl", "hashes": { - "md5": "1aa1d5f48b81475569ea80ea04db8852", "sha256": "6e0a2f800a351bbe8639802954d8d283a52b8cdde378541610ff2bfb3b24ad2f" - } + }, + "requires-python": null, + "size": 4788, + "upload-time": "2018-01-14T04:52:03.658804Z", + "url": "https://files.pythonhosted.org/packages/3a/68/d1f6feb2ded26b9f6c36cd2a826e895e0fa6bba5fe489ec30b9f3bc1dbea/toga-0.3.0.dev2-py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "toga-0.3.0.dev2.tar.gz", - "url": "https://files.pythonhosted.org/packages/e3/6a/3264b3d48733cac7546fee02fbc516621574252f7d86546255532b095415/toga-0.3.0.dev2.tar.gz", "hashes": { - "md5": "a6558d0c5ba3cd763084e564001e9d24", "sha256": "630d2f932bf7aba3a143d3a332190a46a0a3895f509099a20f033caadf131b76" - } - }, - { - "filename": "toga-0.3.0.dev3-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/5d/5c/3e59e5bff0c87346b2891e699841f98c0182102c85ed9ca5aff21a721ffa/toga-0.3.0.dev3-py3-none-any.whl", - "hashes": { - "md5": "3398b704f327a489126e8d6038e43e0f", - "sha256": "2c073e70e75388791aeb55cc1ad90ef23fb17096b1260792020ef86c49641bfe" - } - }, - { - "filename": "toga-0.3.0.dev3.tar.gz", - "url": "https://files.pythonhosted.org/packages/2c/c1/54e589c84b5581316d74c20d802f49c225998def4eb20f65e8cbf463a19a/toga-0.3.0.dev3.tar.gz", - "hashes": { - "md5": "f3d8c1af53f503b0fcce534777e92d9d", - "sha256": "aba75095959aebcbb7b68a565510325974fa0e64cea97bfa6430552b99a748b4" - } - }, - { - "filename": "toga-0.3.0.dev4-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/ae/70/bf39a92e395d970cba0d161ac20bb0b41868b8d5859b1b3f18e9806a11e5/toga-0.3.0.dev4-py3-none-any.whl", - "hashes": { - "md5": "cd410c02ac67ee3d04ad77724a8080c5", - "sha256": "34df30df0e46df9f1932e4f3c93b69d6d2ee9fd7ad061c1d1a28a72e5ea2b242" - } - }, - { - "filename": "toga-0.3.0.dev4.tar.gz", - "url": "https://files.pythonhosted.org/packages/0d/d2/487e31505d277ff3f620eb78a99925f0d0c8fb710045b2171dd7e18fceb1/toga-0.3.0.dev4.tar.gz", - "hashes": { - "md5": "f5781368d0f85cf2bf2d8a445d21354b", - "sha256": "80f26ca9a34667044d58c0bafd54ba41432247dc9c900d607a8b81222052d888" - } - }, - { - "filename": "toga-0.3.0.dev5-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/3f/34/965629c9a096a0d4d6d0f994fc2f3253929564c1804af4e837ba34abbe57/toga-0.3.0.dev5-py3-none-any.whl", - "hashes": { - "md5": "13ed9819a5821a33724285965da320ec", - "sha256": "1526b3d4d5b5824826544ae6e7fbf94415965e6009e57b158485fcb02a2481ab" - } - }, - { - "filename": "toga-0.3.0.dev5.tar.gz", - "url": "https://files.pythonhosted.org/packages/f7/5b/43b93413246cada9d8206430a133d44556956d94eade3d38de4dde5d0cb7/toga-0.3.0.dev5.tar.gz", - "hashes": { - "md5": "6bec5afc03b95423e46f433136067e63", - "sha256": "5d6b7e6a0cf4810187c7cf817e2f305e4dc11b267b31cd9faa5da7a0c8add26c" - } - }, - { - "filename": "toga-0.3.0.dev6-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/c2/7a/94f832cf82ce57055af2d815a2329b98ff5117de7fe73931d9dbf5cf542e/toga-0.3.0.dev6-py3-none-any.whl", - "hashes": { - "md5": "9d2bec13272880f6878986ea94f3b429", - "sha256": "02c1a2271cec7776809c33a27d48224d75163394d9b0cd46a9c28fa45e584fad" - } + }, + "requires-python": null, + "size": 40203, + "upload-time": "2018-01-14T04:52:09.347038Z", + "url": "https://files.pythonhosted.org/packages/e3/6a/3264b3d48733cac7546fee02fbc516621574252f7d86546255532b095415/toga-0.3.0.dev2.tar.gz", + "yanked": false }, { - "filename": "toga-0.3.0.dev6.tar.gz", - "url": "https://files.pythonhosted.org/packages/f9/42/20ab19addc75e5161a8ea6337ca575c5118371116951a3eed96d30d37f8f/toga-0.3.0.dev6.tar.gz", - "hashes": { - "md5": "da8e6b01527f2c552cba966a559b4b8d", - "sha256": "daa78cb5812b594c9eb5a48a62e0ec138e8689309243fee858b81c306612bbe8" - } + "core-metadata": { + "sha256": "bec0f52a3d8b11f7b4fb7c2a944b889b0021628a7de577a3eedbd683f812707a" + }, + "data-dist-info-metadata": { + "sha256": "bec0f52a3d8b11f7b4fb7c2a944b889b0021628a7de577a3eedbd683f812707a" + }, + "filename": "toga-0.3.0-py3-none-any.whl", + "hashes": { + "sha256": "846f1598d5ce91e44aefaac8abc9ba8c5a7c3bbd8c69d7004b92ef64228500ad" + }, + "requires-python": ">=3.7", + "size": 1945, + "upload-time": "2023-01-30T03:29:31.034500Z", + "url": "https://files.pythonhosted.org/packages/40/1d/f3f98e3811ef657aa2acabe039fcbbcae7fc3463f3e18a2458e099465a49/toga-0.3.0-py3-none-any.whl", + "yanked": false }, { - "filename": "toga-0.3.0.dev7-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/c7/49/2d30ddb0b9d319f7170f1e0d2cc9a87d247922cb184f8c839a8c3e76199b/toga-0.3.0.dev7-py3-none-any.whl", - "hashes": { - "md5": "9b7594c4d0f00dc2ab820a2e02fa1170", - "sha256": "1aac015f89db9766daa6901998146cdce88c56d3b0823bc2ef2cbaec989adbdf" - } + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "toga-0.3.0.tar.gz", + "hashes": { + "sha256": "0d1f04d6b5773b8682e5eb1260ec9f07b43f950b89916f9406b2db33cde27240" + }, + "requires-python": ">=3.7", + "size": 3236, + "upload-time": "2023-01-30T03:29:34.595566Z", + "url": "https://files.pythonhosted.org/packages/f3/cf/44b2d505e13b2ec0c7cef2677ac5d8bffb1fb22c4c1d3671179f8a52a40b/toga-0.3.0.tar.gz", + "yanked": false }, { - "filename": "toga-0.3.0.dev7.tar.gz", - "url": "https://files.pythonhosted.org/packages/ca/74/3b8d756bb72584d46ebcf51f6bec368c262b9905168ab53285202571e790/toga-0.3.0.dev7.tar.gz", - "hashes": { - "md5": "77f2b28b8bff397ee076ffe9ecd92775", - "sha256": "26a6c321d5423fb9468de3d19646a02d13f8f6c55d5ad275c3a2798180bb3c69" - } + "core-metadata": { + "sha256": "fe89f5e92f7709b1db6d8d865ac7a0a80e09154c26a83e692af163b78a332392" + }, + "data-dist-info-metadata": { + "sha256": "fe89f5e92f7709b1db6d8d865ac7a0a80e09154c26a83e692af163b78a332392" + }, + "filename": "toga-0.4.0-py3-none-any.whl", + "hashes": { + "sha256": "cd2e47bb19ad7dfe0447f1379d4a7e8d9849a25ab8db62d41358185dcb4e4636" + }, + "requires-python": ">=3.8", + "size": 2270, + "upload-time": "2023-11-03T04:09:37.311582Z", + "url": "https://files.pythonhosted.org/packages/36/53/42de9ed8de0d256b785076ac7cf82eaa088f50df8ed2a8ab1011313e8f04/toga-0.4.0-py3-none-any.whl", + "yanked": false }, { - "filename": "toga-0.3.0.dev8-py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/e5/58/0ba5c784dca91273ce8925d3e2b19b04c8d484be4160c68554d0d9cb8591/toga-0.3.0.dev8-py3-none-any.whl", - "hashes": { - "md5": "69a110faae192b7fecdfe37f373b144a", - "sha256": "9fcde5e120556a233d8d53b0594eaa68c5b88f5cd569ce2771d7fafa132ab50b" - } - }, - { - "filename": "toga-0.3.0.dev8.tar.gz", - "url": "https://files.pythonhosted.org/packages/e9/34/1138b884d83ad3abc76c5b308a19d28e59e3cab8ef56ed0112a779a49202/toga-0.3.0.dev8.tar.gz", - "hashes": { - "md5": "22dc187d753570f134e6a12d13f4678d", - "sha256": "7dbdbb96c3912d366e52fc5c51c418a14d84bfd0b9b12cd7094f3a1a942a40d7" - } + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "toga-0.4.0.tar.gz", + "hashes": { + "sha256": "5ced4a0c85399a52e7c2397e7326f787a04da748bc1e9fc37037bde8e1cf4d54" + }, + "requires-python": ">=3.8", + "size": 3815, + "upload-time": "2023-11-03T04:09:40.090279Z", + "url": "https://files.pythonhosted.org/packages/55/60/7dc01b43f991228fd73679e40dc000e4c28a76b8b27b4d155e5bf716ff06/toga-0.4.0.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3682527 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "toga", + "versions": [ + "0.3.0", + "0.3.0dev1", + "0.3.0dev2", + "0.4.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/toga/0.3.0.json b/tests/repositories/fixtures/pypi.org/json/toga/0.3.0.json new file mode 100644 index 00000000000..54b3cd39454 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/toga/0.3.0.json @@ -0,0 +1,108 @@ +{ + "info": { + "author": "Russell Keith-Magee", + "author_email": "russell@keith-magee.com", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Topic :: Software Development", + "Topic :: Software Development :: User Interfaces", + "Topic :: Software Development :: Widget Sets" + ], + "description": "", + "description_content_type": "text/x-rst; charset=UTF-8", + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "https://beeware.org/project/projects/libraries/toga/", + "keywords": "gui,widget,cross-platform,desktop,mobile,web,macOS,cocoa,iOS,android,windows,winforms,linux,gtk", + "license": "New BSD", + "maintainer": "BeeWare Team", + "maintainer_email": "team@beeware.org", + "name": "toga", + "package_url": "https://pypi.org/project/toga/", + "platform": null, + "project_url": "https://pypi.org/project/toga/", + "project_urls": { + "Documentation": "http://toga.readthedocs.io/en/latest/", + "Funding": "https://beeware.org/contributing/membership/", + "Homepage": "https://beeware.org/project/projects/libraries/toga/", + "Source": "https://github.com/beeware/toga", + "Tracker": "https://github.com/beeware/toga/issues" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/toga/0.3.0/", + "requires_dist": [ + "toga-cocoa (==0.3.0) ; sys_platform==\"darwin\"", + "toga-gtk (==0.3.0) ; sys_platform==\"linux\"", + "toga-winforms (==0.3.0) ; sys_platform==\"win32\"" + ], + "requires_python": ">=3.7", + "summary": "A Python native, OS native GUI toolkit.", + "version": "0.3.0", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "401df3f98e3811ef657aa2acabe039fcbbcae7fc3463f3e18a2458e099465a49", + "md5": "4c9f80d34e8d3f6a3cb301749fbca4ca", + "sha256": "846f1598d5ce91e44aefaac8abc9ba8c5a7c3bbd8c69d7004b92ef64228500ad" + }, + "downloads": -1, + "filename": "toga-0.3.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "4c9f80d34e8d3f6a3cb301749fbca4ca", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": ">=3.7", + "size": 1945, + "upload_time": "2023-01-30T03:29:31", + "upload_time_iso_8601": "2023-01-30T03:29:31.034500Z", + "url": "https://files.pythonhosted.org/packages/40/1d/f3f98e3811ef657aa2acabe039fcbbcae7fc3463f3e18a2458e099465a49/toga-0.3.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "f3cf44b2d505e13b2ec0c7cef2677ac5d8bffb1fb22c4c1d3671179f8a52a40b", + "md5": "f6d6ddeffa5c08a875d436b2dc835e1d", + "sha256": "0d1f04d6b5773b8682e5eb1260ec9f07b43f950b89916f9406b2db33cde27240" + }, + "downloads": -1, + "filename": "toga-0.3.0.tar.gz", + "has_sig": false, + "md5_digest": "f6d6ddeffa5c08a875d436b2dc835e1d", + "packagetype": "sdist", + "python_version": "source", + "requires_python": ">=3.7", + "size": 3236, + "upload_time": "2023-01-30T03:29:34", + "upload_time_iso_8601": "2023-01-30T03:29:34.595566Z", + "url": "https://files.pythonhosted.org/packages/f3/cf/44b2d505e13b2ec0c7cef2677ac5d8bffb1fb22c4c1d3671179f8a52a40b/toga-0.3.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/toga/0.3.0dev1.json b/tests/repositories/fixtures/pypi.org/json/toga/0.3.0dev1.json new file mode 100644 index 00000000000..4d59a6ae123 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/toga/0.3.0dev1.json @@ -0,0 +1,101 @@ +{ + "info": { + "author": "Russell Keith-Magee", + "author_email": "russell@keith-magee.com", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Topic :: Software Development", + "Topic :: Software Development :: User Interfaces", + "Topic :: Software Development :: Widget Sets" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://pybee.org/toga", + "keywords": "", + "license": "New BSD", + "maintainer": "", + "maintainer_email": "", + "name": "toga", + "package_url": "https://pypi.org/project/toga/", + "platform": "", + "project_url": "https://pypi.org/project/toga/", + "project_urls": { + "Homepage": "http://pybee.org/toga" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/toga/0.3.0.dev1/", + "requires_dist": [ + "toga-cocoa; sys_platform==\"darwin\"", + "toga-gtk; sys_platform==\"linux\"", + "toga-winforms; sys_platform==\"win32\"" + ], + "requires_python": "", + "summary": "A Python native, OS native GUI toolkit.", + "version": "0.3.0.dev1", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "ebefea806c706d3dc90d4bc8c412c0ad3515fd018074f5fdd4bd020bdd4c0c80", + "md5": "7b219b2249b825f28051aae0230f2818", + "sha256": "8553bf332d8fbf39b500745ed9c4044a846fbba68e31de70e6fe83fdffcb0a9e" + }, + "downloads": -1, + "filename": "toga-0.3.0.dev1-py3-none-any.whl", + "has_sig": false, + "md5_digest": "7b219b2249b825f28051aae0230f2818", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": null, + "size": 4789, + "upload_time": "2018-01-14T04:10:57", + "upload_time_iso_8601": "2018-01-14T04:10:57.825822Z", + "url": "https://files.pythonhosted.org/packages/eb/ef/ea806c706d3dc90d4bc8c412c0ad3515fd018074f5fdd4bd020bdd4c0c80/toga-0.3.0.dev1-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "4f71c55c15950f7275e761fe53fb0dc83fe4f5fba6199d7b8fb05d741dd33566", + "md5": "21b8fff4d110ddfb8c3eb939d7b35a1e", + "sha256": "4e5c77056792168a4e84c84bb7214dfb614b79f289dcbe1525be614483496439" + }, + "downloads": -1, + "filename": "toga-0.3.0.dev1.tar.gz", + "has_sig": false, + "md5_digest": "21b8fff4d110ddfb8c3eb939d7b35a1e", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 40187, + "upload_time": "2018-01-14T04:11:03", + "upload_time_iso_8601": "2018-01-14T04:11:03.212494Z", + "url": "https://files.pythonhosted.org/packages/4f/71/c55c15950f7275e761fe53fb0dc83fe4f5fba6199d7b8fb05d741dd33566/toga-0.3.0.dev1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/toga/0.3.0dev2.json b/tests/repositories/fixtures/pypi.org/json/toga/0.3.0dev2.json new file mode 100644 index 00000000000..04915dca0e3 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/toga/0.3.0dev2.json @@ -0,0 +1,101 @@ +{ + "info": { + "author": "Russell Keith-Magee", + "author_email": "russell@keith-magee.com", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Topic :: Software Development", + "Topic :: Software Development :: User Interfaces", + "Topic :: Software Development :: Widget Sets" + ], + "description": "", + "description_content_type": null, + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "http://pybee.org/toga", + "keywords": "", + "license": "New BSD", + "maintainer": "", + "maintainer_email": "", + "name": "toga", + "package_url": "https://pypi.org/project/toga/", + "platform": "", + "project_url": "https://pypi.org/project/toga/", + "project_urls": { + "Homepage": "http://pybee.org/toga" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/toga/0.3.0.dev2/", + "requires_dist": [ + "toga-cocoa; sys_platform==\"darwin\"", + "toga-gtk; sys_platform==\"linux\"", + "toga-winforms; sys_platform==\"win32\"" + ], + "requires_python": "", + "summary": "A Python native, OS native GUI toolkit.", + "version": "0.3.0.dev2", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "3a68d1f6feb2ded26b9f6c36cd2a826e895e0fa6bba5fe489ec30b9f3bc1dbea", + "md5": "1aa1d5f48b81475569ea80ea04db8852", + "sha256": "6e0a2f800a351bbe8639802954d8d283a52b8cdde378541610ff2bfb3b24ad2f" + }, + "downloads": -1, + "filename": "toga-0.3.0.dev2-py3-none-any.whl", + "has_sig": false, + "md5_digest": "1aa1d5f48b81475569ea80ea04db8852", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": null, + "size": 4788, + "upload_time": "2018-01-14T04:52:03", + "upload_time_iso_8601": "2018-01-14T04:52:03.658804Z", + "url": "https://files.pythonhosted.org/packages/3a/68/d1f6feb2ded26b9f6c36cd2a826e895e0fa6bba5fe489ec30b9f3bc1dbea/toga-0.3.0.dev2-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "e36a3264b3d48733cac7546fee02fbc516621574252f7d86546255532b095415", + "md5": "a6558d0c5ba3cd763084e564001e9d24", + "sha256": "630d2f932bf7aba3a143d3a332190a46a0a3895f509099a20f033caadf131b76" + }, + "downloads": -1, + "filename": "toga-0.3.0.dev2.tar.gz", + "has_sig": false, + "md5_digest": "a6558d0c5ba3cd763084e564001e9d24", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 40203, + "upload_time": "2018-01-14T04:52:09", + "upload_time_iso_8601": "2018-01-14T04:52:09.347038Z", + "url": "https://files.pythonhosted.org/packages/e3/6a/3264b3d48733cac7546fee02fbc516621574252f7d86546255532b095415/toga-0.3.0.dev2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/toga/0.4.0.json b/tests/repositories/fixtures/pypi.org/json/toga/0.4.0.json new file mode 100644 index 00000000000..d75ec6722c2 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/json/toga/0.4.0.json @@ -0,0 +1,108 @@ +{ + "info": { + "author": "Russell Keith-Magee", + "author_email": "russell@keith-magee.com", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Topic :: Software Development", + "Topic :: Software Development :: User Interfaces", + "Topic :: Software Development :: Widget Sets" + ], + "description": "", + "description_content_type": "text/x-rst; charset=UTF-8", + "docs_url": null, + "download_url": "", + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": null, + "home_page": "https://beeware.org/project/projects/libraries/toga/", + "keywords": "gui,widget,cross-platform,desktop,mobile,web,macOS,cocoa,iOS,android,windows,winforms,linux,freeBSD,gtk", + "license": "New BSD", + "maintainer": "BeeWare Team", + "maintainer_email": "team@beeware.org", + "name": "toga", + "package_url": "https://pypi.org/project/toga/", + "platform": null, + "project_url": "https://pypi.org/project/toga/", + "project_urls": { + "Documentation": "http://toga.readthedocs.io/en/latest/", + "Funding": "https://beeware.org/contributing/membership/", + "Homepage": "https://beeware.org/project/projects/libraries/toga/", + "Source": "https://github.com/beeware/toga", + "Tracker": "https://github.com/beeware/toga/issues" + }, + "provides_extra": null, + "release_url": "https://pypi.org/project/toga/0.4.0/", + "requires_dist": [ + "toga-gtk ==0.4.0 ; \"freebsd\" in sys_platform", + "toga-cocoa ==0.4.0 ; sys_platform==\"darwin\"", + "toga-gtk ==0.4.0 ; sys_platform==\"linux\"", + "toga-winforms ==0.4.0 ; sys_platform==\"win32\"" + ], + "requires_python": ">=3.8", + "summary": "A Python native, OS native GUI toolkit.", + "version": "0.4.0", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 0, + "urls": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "365342de9ed8de0d256b785076ac7cf82eaa088f50df8ed2a8ab1011313e8f04", + "md5": "8a4f02f7c8a0353f3205801eadf3e3c9", + "sha256": "cd2e47bb19ad7dfe0447f1379d4a7e8d9849a25ab8db62d41358185dcb4e4636" + }, + "downloads": -1, + "filename": "toga-0.4.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "8a4f02f7c8a0353f3205801eadf3e3c9", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": ">=3.8", + "size": 2270, + "upload_time": "2023-11-03T04:09:37", + "upload_time_iso_8601": "2023-11-03T04:09:37.311582Z", + "url": "https://files.pythonhosted.org/packages/36/53/42de9ed8de0d256b785076ac7cf82eaa088f50df8ed2a8ab1011313e8f04/toga-0.4.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "55607dc01b43f991228fd73679e40dc000e4c28a76b8b27b4d155e5bf716ff06", + "md5": "bd31edb40d9176b268250a6808b24d56", + "sha256": "5ced4a0c85399a52e7c2397e7326f787a04da748bc1e9fc37037bde8e1cf4d54" + }, + "downloads": -1, + "filename": "toga-0.4.0.tar.gz", + "has_sig": false, + "md5_digest": "bd31edb40d9176b268250a6808b24d56", + "packagetype": "sdist", + "python_version": "source", + "requires_python": ">=3.8", + "size": 3815, + "upload_time": "2023-11-03T04:09:40", + "upload_time_iso_8601": "2023-11-03T04:09:40.090279Z", + "url": "https://files.pythonhosted.org/packages/55/60/7dc01b43f991228fd73679e40dc000e4c28a76b8b27b4d155e5bf716ff06/toga-0.4.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/repositories/fixtures/pypi.org/json/tomlkit.json b/tests/repositories/fixtures/pypi.org/json/tomlkit.json index 0eb7e1caed8..d3ba9b77059 100644 --- a/tests/repositories/fixtures/pypi.org/json/tomlkit.json +++ b/tests/repositories/fixtures/pypi.org/json/tomlkit.json @@ -1,45 +1,77 @@ { - "name": "tomlkit", "files": [ { + "core-metadata": { + "sha256": "4997b3d6f4b23bbd12d75af591167d982af7a862e473b2fbce20c8172ec93d93" + }, + "data-dist-info-metadata": { + "sha256": "4997b3d6f4b23bbd12d75af591167d982af7a862e473b2fbce20c8172ec93d93" + }, "filename": "tomlkit-0.5.2-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/9b/ca/8b60a94c01ee655ffb81d11c11396cb6fff89459317aa1fe3e98ee80f055/tomlkit-0.5.2-py2.py3-none-any.whl", "hashes": { "md5": "7bcf6cf4a6034339bb6a481f27b9ba62", "sha256": "a50f685abd033a7b50b13330833c15699885186517b713d9f7e8280ce7976e4c" }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 116499, + "upload-time": "2018-11-09T17:09:28.212157Z", + "url": "https://files.pythonhosted.org/packages/9b/ca/8b60a94c01ee655ffb81d11c11396cb6fff89459317aa1fe3e98ee80f055/tomlkit-0.5.2-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "tomlkit-0.5.2.tar.gz", - "url": "https://files.pythonhosted.org/packages/f6/8c/c27d292cf7c0f04f0e1b5c75ab95dc328542ccbe9a809a1eada66c897bd2/tomlkit-0.5.2.tar.gz", "hashes": { "md5": "7c31987ef6fba2cd64715cae27fade64", "sha256": "4a226ccf11ee5a2e76bfc185747b54ee7718706aeb3aabb981327249dbe2b1d4" }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 29813, + "upload-time": "2018-11-09T17:09:29.709061Z", + "url": "https://files.pythonhosted.org/packages/f6/8c/c27d292cf7c0f04f0e1b5c75ab95dc328542ccbe9a809a1eada66c897bd2/tomlkit-0.5.2.tar.gz", + "yanked": false }, { + "core-metadata": { + "sha256": "729d3b14964e2455c0082529dc24dce1c6c84dc74f76d14b5ce7a0f044b12bbe" + }, + "data-dist-info-metadata": { + "sha256": "729d3b14964e2455c0082529dc24dce1c6c84dc74f76d14b5ce7a0f044b12bbe" + }, "filename": "tomlkit-0.5.3-py2.py3-none-any.whl", - "url": "https://files.pythonhosted.org/packages/71/c6/06c014b92cc48270765d6a9418d82239b158d8a9b69e031b0e2c6598740b/tomlkit-0.5.3-py2.py3-none-any.whl", "hashes": { "md5": "b868779f054c64bc6c2ae4ad2cdbf6b3", "sha256": "d4fe74be9b732d76886da6da2e96f76ae42551e53afce1ea29bc703629b70497" }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 116796, + "upload-time": "2018-11-19T20:05:37.276181Z", + "url": "https://files.pythonhosted.org/packages/71/c6/06c014b92cc48270765d6a9418d82239b158d8a9b69e031b0e2c6598740b/tomlkit-0.5.3-py2.py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "tomlkit-0.5.3.tar.gz", - "url": "https://files.pythonhosted.org/packages/f7/f7/bbd9213bfe76cb7821c897f9ed74877fd74993b4ca2fe9513eb5a31030f9/tomlkit-0.5.3.tar.gz", "hashes": { "md5": "cdbdc302a184d1f1e38d5e0810e3b212", "sha256": "e2f785651609492c771d9887ccb2369d891d16595d2d97972e2cbe5e8fb3439f" }, - "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + "requires-python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + "size": 29864, + "upload-time": "2018-11-19T20:05:39.200001Z", + "url": "https://files.pythonhosted.org/packages/f7/f7/bbd9213bfe76cb7821c897f9ed74877fd74993b4ca2fe9513eb5a31030f9/tomlkit-0.5.3.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 4504211 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "tomlkit", + "versions": [ + "0.5.2", + "0.5.3" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/tomlkit/0.5.2.json b/tests/repositories/fixtures/pypi.org/json/tomlkit/0.5.2.json index 5cad22da7ee..4353af698df 100644 --- a/tests/repositories/fixtures/pypi.org/json/tomlkit/0.5.2.json +++ b/tests/repositories/fixtures/pypi.org/json/tomlkit/0.5.2.json @@ -49,7 +49,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 22053651, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/tomlkit/0.5.3.json b/tests/repositories/fixtures/pypi.org/json/tomlkit/0.5.3.json index 1b1cac648e6..6ea48d948b9 100644 --- a/tests/repositories/fixtures/pypi.org/json/tomlkit/0.5.3.json +++ b/tests/repositories/fixtures/pypi.org/json/tomlkit/0.5.3.json @@ -22,6 +22,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/sdispater/tomlkit", "keywords": "", "license": "MIT", @@ -35,11 +36,12 @@ "Homepage": "https://github.com/sdispater/tomlkit", "Repository": "https://github.com/sdispater/tomlkit" }, + "provides_extra": null, "release_url": "https://pypi.org/project/tomlkit/0.5.3/", "requires_dist": [ - "typing (>=3.6,<4.0); python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.4\" and python_version < \"3.5\"", + "enum34 (>=1.1,<2.0); python_version >= \"2.7\" and python_version < \"2.8\"", "functools32 (>=3.2.3,<4.0.0); python_version >= \"2.7\" and python_version < \"2.8\"", - "enum34 (>=1.1,<2.0); python_version >= \"2.7\" and python_version < \"2.8\"" + "typing (>=3.6,<4.0); python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.4\" and python_version < \"3.5\"" ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "Style preserving TOML library", @@ -47,7 +49,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 14359948, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/trackpy.json b/tests/repositories/fixtures/pypi.org/json/trackpy.json deleted file mode 100644 index 2ad8dd7b900..00000000000 --- a/tests/repositories/fixtures/pypi.org/json/trackpy.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "trackpy", - "files": [ - { - "filename": "trackpy-0.4.1.tar.gz", - "url": "https://files.pythonhosted.org/packages/62/31/797febf2ea8ea316c345c1d0f10503c3901f3fca5c3ffdc6e92717efdcad/trackpy-0.4.1.tar.gz", - "hashes": { - "md5": "0a36455659d70201b8cb329ba9de3c46", - "sha256": "d8512e45935954c8274b547944ff08a2d7e3942a6d53ca2540023034b922aba1" - } - } - ], - "meta": { - "api-version": "1.0", - "_last-serial": 3786947 - } -} diff --git a/tests/repositories/fixtures/pypi.org/json/trackpy/0.4.1.json b/tests/repositories/fixtures/pypi.org/json/trackpy/0.4.1.json deleted file mode 100644 index af25256e49e..00000000000 --- a/tests/repositories/fixtures/pypi.org/json/trackpy/0.4.1.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "info": { - "author": "Trackpy Contributors", - "author_email": "daniel.b.allan@gmail.com", - "bugtrack_url": null, - "classifiers": [], - "description": "", - "description_content_type": "", - "docs_url": null, - "download_url": "", - "downloads": { - "last_day": -1, - "last_month": -1, - "last_week": -1 - }, - "home_page": "https://github.com/soft-matter/trackpy", - "keywords": "", - "license": "", - "maintainer": "", - "maintainer_email": "", - "name": "trackpy", - "package_url": "https://pypi.org/project/trackpy/", - "platform": "", - "project_url": "https://pypi.org/project/trackpy/", - "project_urls": { - "Homepage": "https://github.com/soft-matter/trackpy" - }, - "release_url": "https://pypi.org/project/trackpy/0.4.1/", - "requires_dist": null, - "requires_python": "", - "summary": "particle-tracking toolkit", - "version": "0.4.1", - "yanked": false, - "yanked_reason": null - }, - "last_serial": 10042261, - "urls": [ - { - "comment_text": "", - "digests": { - "md5": "0a36455659d70201b8cb329ba9de3c46", - "sha256": "d8512e45935954c8274b547944ff08a2d7e3942a6d53ca2540023034b922aba1" - }, - "downloads": -1, - "filename": "trackpy-0.4.1.tar.gz", - "has_sig": false, - "md5_digest": "0a36455659d70201b8cb329ba9de3c46", - "packagetype": "sdist", - "python_version": "source", - "requires_python": null, - "size": 121998, - "upload_time": "2018-04-21T09:59:50", - "upload_time_iso_8601": "2018-04-21T09:59:50.546774Z", - "url": "https://files.pythonhosted.org/packages/62/31/797febf2ea8ea316c345c1d0f10503c3901f3fca5c3ffdc6e92717efdcad/trackpy-0.4.1.tar.gz", - "yanked": false, - "yanked_reason": null - } - ], - "vulnerabilities": [] -} diff --git a/tests/repositories/fixtures/pypi.org/json/twisted.json b/tests/repositories/fixtures/pypi.org/json/twisted.json index a27bd79922d..66825247bab 100644 --- a/tests/repositories/fixtures/pypi.org/json/twisted.json +++ b/tests/repositories/fixtures/pypi.org/json/twisted.json @@ -1,17 +1,26 @@ { - "name": "Twisted", "files": [ { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "Twisted-18.9.0.tar.bz2", - "url": "https://files.pythonhosted.org/packages/5d/0e/a72d85a55761c2c3ff1cb968143a2fd5f360220779ed90e0fadf4106d4f2/Twisted-18.9.0.tar.bz2", "hashes": { "md5": "35ff4705ea90a76bf972ff3b229546ca", "sha256": "4335327da58be11dd6e482ec6b85eb055bcc953a9570cd59e7840a2ce9419a8e" - } + }, + "requires-python": null, + "size": 3088398, + "upload-time": "2018-10-15T09:11:22.298247Z", + "url": "https://files.pythonhosted.org/packages/5d/0e/a72d85a55761c2c3ff1cb968143a2fd5f360220779ed90e0fadf4106d4f2/Twisted-18.9.0.tar.bz2", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 4376865 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "twisted", + "versions": [ + "18.9.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/twisted/18.9.0.json b/tests/repositories/fixtures/pypi.org/json/twisted/18.9.0.json index 12f6c39a8d9..75b01a0fdc5 100644 --- a/tests/repositories/fixtures/pypi.org/json/twisted/18.9.0.json +++ b/tests/repositories/fixtures/pypi.org/json/twisted/18.9.0.json @@ -20,6 +20,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "http://twistedmatrix.com/", "keywords": "", "license": "MIT", @@ -32,6 +33,7 @@ "project_urls": { "Homepage": "http://twistedmatrix.com/" }, + "provides_extra": null, "release_url": "https://pypi.org/project/Twisted/18.9.0/", "requires_dist": null, "requires_python": "", @@ -40,7 +42,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 13478846, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/wheel.json b/tests/repositories/fixtures/pypi.org/json/wheel.json index a20b5b944f6..5138e55f85e 100644 --- a/tests/repositories/fixtures/pypi.org/json/wheel.json +++ b/tests/repositories/fixtures/pypi.org/json/wheel.json @@ -1,6 +1,26 @@ { "files": [ { + "core-metadata": { + "sha256": "bf7a632f73a2d57bb54d06bbb2a46c162e6dfbe7565b0746e588ce6f080e49f7" + }, + "data-dist-info-metadata": { + "sha256": "bf7a632f73a2d57bb54d06bbb2a46c162e6dfbe7565b0746e588ce6f080e49f7" + }, + "filename": "wheel-0.40.0-py3-none-any.whl", + "hashes": { + "md5": "517d39f133bd7b1ff17caf09784b7543", + "sha256": "d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247" + }, + "requires-python": ">=3.7", + "size": 64545, + "upload-time": "2023-03-14T15:10:00.828550Z", + "url": "https://files.pythonhosted.org/packages/61/86/cc8d1ff2ca31a312a25a708c891cf9facbad4eae493b3872638db6785eb5/wheel-0.40.0-py3-none-any.whl", + "yanked": false + }, + { + "core-metadata": false, + "data-dist-info-metadata": false, "filename": "wheel-0.40.0.tar.gz", "hashes": { "md5": "5f175a8d693f74878964d4fd29729ab7", @@ -14,7 +34,7 @@ } ], "meta": { - "_last-serial": 17289142, + "_last-serial": 0, "api-version": "1.1" }, "name": "wheel", diff --git a/tests/repositories/fixtures/pypi.org/json/wheel/0.40.0.json b/tests/repositories/fixtures/pypi.org/json/wheel/0.40.0.json index b2f0693ae62..3678426a36e 100644 --- a/tests/repositories/fixtures/pypi.org/json/wheel/0.40.0.json +++ b/tests/repositories/fixtures/pypi.org/json/wheel/0.40.0.json @@ -25,6 +25,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "", "keywords": "wheel,packaging", "license": "", @@ -39,6 +40,7 @@ "Documentation": "https://wheel.readthedocs.io/", "Issue Tracker": "https://github.com/pypa/wheel/issues" }, + "provides_extra": null, "release_url": "https://pypi.org/project/wheel/0.40.0/", "requires_dist": [ "pytest >= 6.0.0 ; extra == \"test\"" @@ -49,7 +51,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 17289142, + "last_serial": 0, "urls": [ { "comment_text": "", diff --git a/tests/repositories/fixtures/pypi.org/json/zipp.json b/tests/repositories/fixtures/pypi.org/json/zipp.json index 5f6831b424a..04b282766a3 100644 --- a/tests/repositories/fixtures/pypi.org/json/zipp.json +++ b/tests/repositories/fixtures/pypi.org/json/zipp.json @@ -1,27 +1,44 @@ { - "name": "zipp", "files": [ { + "core-metadata": { + "sha256": "03c98c88c78ef3602e6fd904a321359fa0e374bee5d9e5bf3b1fbdecc3c8a92d" + }, + "data-dist-info-metadata": { + "sha256": "03c98c88c78ef3602e6fd904a321359fa0e374bee5d9e5bf3b1fbdecc3c8a92d" + }, + "filename": "zipp-3.5.0-py3-none-any.whl", "hashes": { "md5": "52aecc0484efd07d62575d152f6a98f6", "sha256": "82da6dcae3676123d6f493a876259614e7e6e970b14c59b1830a2c901ed91306" }, - "filename": "zipp-3.5.0-py3-none-any.whl", - "requires_python": ">=3.6", - "url": "https://files.pythonhosted.org/packages/92/d9/89f433969fb8dc5b9cbdd4b4deb587720ec1aeb59a020cf15002b9593eef/zipp-3.5.0-py3-none-any.whl" + "requires-python": ">=3.6", + "size": 5700, + "upload-time": "2021-07-02T23:51:45.759726Z", + "url": "https://files.pythonhosted.org/packages/92/d9/89f433969fb8dc5b9cbdd4b4deb587720ec1aeb59a020cf15002b9593eef/zipp-3.5.0-py3-none-any.whl", + "yanked": false }, { + "core-metadata": false, + "data-dist-info-metadata": false, + "filename": "zipp-3.5.0.tar.gz", "hashes": { "md5": "16bf2a24fae340052e8565c264d21092", "sha256": "239d50954a15aa4b283023f18dc451ba811fb4d263f4dd6855642e4d1c80cc9f" }, - "filename": "zipp-3.5.0.tar.gz", - "requires_python": ">=3.6", - "url": "https://files.pythonhosted.org/packages/3a/9f/1d4b62cbe8d222539a84089eeab603d8e45ee1f897803a0ae0860400d6e7/zipp-3.5.0.tar.gz" + "requires-python": ">=3.6", + "size": 13270, + "upload-time": "2021-07-02T23:51:47.004396Z", + "url": "https://files.pythonhosted.org/packages/3a/9f/1d4b62cbe8d222539a84089eeab603d8e45ee1f897803a0ae0860400d6e7/zipp-3.5.0.tar.gz", + "yanked": false } ], "meta": { - "api-version": "1.0", - "_last-serial": 3879671 - } + "_last-serial": 0, + "api-version": "1.1" + }, + "name": "zipp", + "versions": [ + "3.5.0" + ] } diff --git a/tests/repositories/fixtures/pypi.org/json/zipp/3.5.0.json b/tests/repositories/fixtures/pypi.org/json/zipp/3.5.0.json index e9a0b6eaf86..0e3bc2323ab 100644 --- a/tests/repositories/fixtures/pypi.org/json/zipp/3.5.0.json +++ b/tests/repositories/fixtures/pypi.org/json/zipp/3.5.0.json @@ -19,6 +19,7 @@ "last_month": -1, "last_week": -1 }, + "dynamic": null, "home_page": "https://github.com/jaraco/zipp", "keywords": "", "license": "", @@ -31,6 +32,7 @@ "project_urls": { "Homepage": "https://github.com/jaraco/zipp" }, + "provides_extra": null, "release_url": "https://pypi.org/project/zipp/3.5.0/", "requires_dist": [ "sphinx ; extra == 'docs'", @@ -52,51 +54,7 @@ "yanked": false, "yanked_reason": null }, - "last_serial": 10811847, - "releases": { - "3.5.0": [ - { - "comment_text": "", - "digests": { - "md5": "0ec47fbf522751f6c5fa904cb33f1f59", - "sha256": "957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3" - }, - "downloads": -1, - "filename": "zipp-3.5.0-py3-none-any.whl", - "has_sig": false, - "md5_digest": "0ec47fbf522751f6c5fa904cb33f1f59", - "packagetype": "bdist_wheel", - "python_version": "py3", - "requires_python": ">=3.6", - "size": 5700, - "upload_time": "2021-07-02T23:51:45", - "upload_time_iso_8601": "2021-07-02T23:51:45.759726Z", - "url": "https://files.pythonhosted.org/packages/92/d9/89f433969fb8dc5b9cbdd4b4deb587720ec1aeb59a020cf15002b9593eef/zipp-3.5.0-py3-none-any.whl", - "yanked": false, - "yanked_reason": null - }, - { - "comment_text": "", - "digests": { - "md5": "617efbf3edb707c57008ec00f408972f", - "sha256": "f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4" - }, - "downloads": -1, - "filename": "zipp-3.5.0.tar.gz", - "has_sig": false, - "md5_digest": "617efbf3edb707c57008ec00f408972f", - "packagetype": "sdist", - "python_version": "source", - "requires_python": ">=3.6", - "size": 13270, - "upload_time": "2021-07-02T23:51:47", - "upload_time_iso_8601": "2021-07-02T23:51:47.004396Z", - "url": "https://files.pythonhosted.org/packages/3a/9f/1d4b62cbe8d222539a84089eeab603d8e45ee1f897803a0ae0860400d6e7/zipp-3.5.0.tar.gz", - "yanked": false, - "yanked_reason": null - } - ] - }, + "last_serial": 0, "urls": [ { "comment_text": "", @@ -138,5 +96,6 @@ "yanked": false, "yanked_reason": null } - ] + ], + "vulnerabilities": [] } diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp27-cp27m-win32.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp27-cp27m-win32.whl.metadata new file mode 100644 index 00000000000..0b6dd4946e1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp27-cp27m-win32.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp27-cp27m-win_amd64.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp27-cp27m-win_amd64.whl.metadata new file mode 100644 index 00000000000..0b6dd4946e1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp27-cp27m-win_amd64.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp34-cp34m-win32.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp34-cp34m-win32.whl.metadata new file mode 100644 index 00000000000..d14b79262d1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp34-cp34m-win32.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp34-cp34m-win_amd64.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp34-cp34m-win_amd64.whl.metadata new file mode 100644 index 00000000000..d14b79262d1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp34-cp34m-win_amd64.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp35-cp35m-win32.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp35-cp35m-win32.whl.metadata new file mode 100644 index 00000000000..d14b79262d1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp35-cp35m-win32.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp35-cp35m-win_amd64.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp35-cp35m-win_amd64.whl.metadata new file mode 100644 index 00000000000..d14b79262d1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp35-cp35m-win_amd64.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp36-cp36m-win32.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp36-cp36m-win32.whl.metadata new file mode 100644 index 00000000000..d14b79262d1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp36-cp36m-win32.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp36-cp36m-win_amd64.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp36-cp36m-win_amd64.whl.metadata new file mode 100644 index 00000000000..d14b79262d1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp36-cp36m-win_amd64.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp37-cp37m-win32.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp37-cp37m-win32.whl.metadata new file mode 100644 index 00000000000..d14b79262d1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp37-cp37m-win32.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp37-cp37m-win_amd64.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp37-cp37m-win_amd64.whl.metadata new file mode 100644 index 00000000000..d14b79262d1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/PyYAML-3.13-cp37-cp37m-win_amd64.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.13 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + diff --git a/tests/repositories/fixtures/pypi.org/metadata/attrs-17.4.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/attrs-17.4.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..4e77e99807f --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/attrs-17.4.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,46 @@ +Metadata-Version: 2.0 +Name: attrs +Version: 17.4.0 +Summary: Classes Without Boilerplate +Home-page: http://www.attrs.org/ +Author: Hynek Schlawack +Author-email: hs@ox.cx +License: MIT +Description-Content-Type: UNKNOWN +Keywords: class,attribute,boilerplate +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: dev +Requires-Dist: coverage; extra == 'dev' +Requires-Dist: hypothesis; extra == 'dev' +Requires-Dist: pympler; extra == 'dev' +Requires-Dist: pytest; extra == 'dev' +Requires-Dist: six; extra == 'dev' +Requires-Dist: zope.interface; extra == 'dev' +Requires-Dist: sphinx; extra == 'dev' +Requires-Dist: zope.interface; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx; extra == 'docs' +Requires-Dist: zope.interface; extra == 'docs' +Provides-Extra: tests +Requires-Dist: coverage; extra == 'tests' +Requires-Dist: hypothesis; extra == 'tests' +Requires-Dist: pympler; extra == 'tests' +Requires-Dist: pytest; extra == 'tests' +Requires-Dist: six; extra == 'tests' +Requires-Dist: zope.interface; extra == 'tests' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/black-19.10b0-py36-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/black-19.10b0-py36-none-any.whl.metadata new file mode 100644 index 00000000000..1615b002392 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/black-19.10b0-py36-none-any.whl.metadata @@ -0,0 +1,35 @@ +Metadata-Version: 2.1 +Name: black +Version: 19.10b0 +Summary: The uncompromising code formatter. +Home-page: https://github.com/psf/black +Author: Łukasz Langa +Author-email: lukasz@langa.pl +License: MIT +Keywords: automation formatter yapf autopep8 pyfmt gofmt rustfmt +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Software Development :: Quality Assurance +Requires-Python: >=3.6 +Description-Content-Type: text/markdown +Requires-Dist: click (>=6.5) +Requires-Dist: attrs (>=18.1.0) +Requires-Dist: appdirs +Requires-Dist: toml (>=0.9.4) +Requires-Dist: typed-ast (>=1.4.0) +Requires-Dist: regex +Requires-Dist: pathspec (<1,>=0.6) +Provides-Extra: d +Requires-Dist: aiohttp (>=3.3.2) ; extra == 'd' +Requires-Dist: aiohttp-cors ; extra == 'd' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/black-21.11b0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/black-21.11b0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..87fd98e2212 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/black-21.11b0-py3-none-any.whl.metadata @@ -0,0 +1,51 @@ +Metadata-Version: 2.1 +Name: black +Version: 21.11b0 +Summary: The uncompromising code formatter. +Home-page: https://github.com/psf/black +Author: Łukasz Langa +Author-email: lukasz@langa.pl +License: MIT +Project-URL: Changelog, https://github.com/psf/black/blob/main/CHANGES.md +Keywords: automation formatter yapf autopep8 pyfmt gofmt rustfmt +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +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 :: 3 :: Only +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Software Development :: Quality Assurance +Requires-Python: >=3.6.2 +Description-Content-Type: text/markdown +License-File: LICENSE +License-File: AUTHORS.md +Requires-Dist: click (>=7.1.2) +Requires-Dist: platformdirs (>=2) +Requires-Dist: tomli (<2.0.0,>=0.2.6) +Requires-Dist: regex (>=2020.1.8) +Requires-Dist: pathspec (<1,>=0.9.0) +Requires-Dist: typing-extensions (>=3.10.0.0) +Requires-Dist: mypy-extensions (>=0.4.3) +Requires-Dist: dataclasses (>=0.6) ; python_version < "3.7" +Requires-Dist: typed-ast (>=1.4.2) ; python_version < "3.8" and implementation_name == "cpython" +Requires-Dist: typing-extensions (!=3.10.0.1) ; python_version >= "3.10" +Provides-Extra: colorama +Requires-Dist: colorama (>=0.4.3) ; extra == 'colorama' +Provides-Extra: d +Requires-Dist: aiohttp (>=3.7.4) ; extra == 'd' +Provides-Extra: jupyter +Requires-Dist: ipython (>=7.8.0) ; extra == 'jupyter' +Requires-Dist: tokenize-rt (>=3.2.0) ; extra == 'jupyter' +Provides-Extra: python2 +Requires-Dist: typed-ast (>=1.4.3) ; extra == 'python2' +Provides-Extra: uvloop +Requires-Dist: uvloop (>=0.15.2) ; extra == 'uvloop' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/cleo-1.0.0a5-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/cleo-1.0.0a5-py3-none-any.whl.metadata new file mode 100644 index 00000000000..9a1e5a06a32 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/cleo-1.0.0a5-py3-none-any.whl.metadata @@ -0,0 +1,20 @@ +Metadata-Version: 2.1 +Name: cleo +Version: 1.0.0a5 +Summary: Cleo allows you to create beautiful and testable command-line interfaces. +Home-page: https://github.com/python-poetry/cleo +License: MIT +Keywords: cli,commands +Author: Sébastien Eustace +Author-email: sebastien@eustace.io +Requires-Python: >=3.7,<4.0 +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Requires-Dist: crashtest (>=0.3.1,<0.4.0) +Requires-Dist: pylev (>=1.3.0,<2.0.0) +Description-Content-Type: text/markdown + diff --git a/tests/repositories/fixtures/pypi.org/metadata/clikit-0.2.4-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/clikit-0.2.4-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..d1033e9d197 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/clikit-0.2.4-py2.py3-none-any.whl.metadata @@ -0,0 +1,25 @@ +Metadata-Version: 2.1 +Name: clikit +Version: 0.2.4 +Summary: CliKit is a group of utilities to build beautiful and testable command line interfaces. +Home-page: https://github.com/sdispater/clikit +License: MIT +Keywords: packaging,dependency,poetry +Author: Sébastien Eustace +Author-email: sebastien@eustace.io +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Dist: enum34 (>=1.1,<2.0); python_version >= "2.7" and python_version < "2.8" +Requires-Dist: pastel (>=0.1.0,<0.2.0) +Requires-Dist: pylev (>=1.3,<2.0) +Requires-Dist: typing (>=3.6,<4.0); python_version >= "2.7" and python_version < "2.8" or python_version >= "3.4" and python_version < "3.5" +Project-URL: Repository, https://github.com/sdispater/clikit +Description-Content-Type: text/markdown + diff --git a/tests/repositories/fixtures/pypi.org/metadata/colorama-0.3.9-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/colorama-0.3.9-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..55439bf4ae1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/colorama-0.3.9-py2.py3-none-any.whl.metadata @@ -0,0 +1,27 @@ +Metadata-Version: 2.0 +Name: colorama +Version: 0.3.9 +Summary: Cross-platform colored terminal text. +Home-page: https://github.com/tartley/colorama +Author: Arnon Yaari +Author-email: tartley@tartley.com +License: BSD +Keywords: color colour terminal text ansi windows crossplatform xplatform +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Terminals + diff --git a/tests/repositories/fixtures/pypi.org/metadata/discord.py-2.0.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/discord.py-2.0.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..ff6c01c8659 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/discord.py-2.0.0-py3-none-any.whl.metadata @@ -0,0 +1,47 @@ +Metadata-Version: 2.1 +Name: discord.py +Version: 2.0.0 +Summary: A Python wrapper for the Discord API +Home-page: https://github.com/Rapptz/discord.py +Author: Rapptz +License: MIT +Project-URL: Documentation, https://discordpy.readthedocs.io/en/latest/ +Project-URL: Issue tracker, https://github.com/Rapptz/discord.py/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Topic :: Internet +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities +Classifier: Typing :: Typed +Requires-Python: >=3.8.0 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: aiohttp (<4,>=3.7.4) +Provides-Extra: docs +Requires-Dist: sphinx (==4.4.0) ; extra == 'docs' +Requires-Dist: sphinxcontrib-trio (==1.1.2) ; extra == 'docs' +Requires-Dist: sphinxcontrib-websupport ; extra == 'docs' +Requires-Dist: typing-extensions (<5,>=4.3) ; extra == 'docs' +Provides-Extra: speed +Requires-Dist: orjson (>=3.5.4) ; extra == 'speed' +Requires-Dist: aiodns (>=1.1) ; extra == 'speed' +Requires-Dist: Brotli ; extra == 'speed' +Requires-Dist: cchardet ; extra == 'speed' +Provides-Extra: test +Requires-Dist: coverage[toml] ; extra == 'test' +Requires-Dist: pytest ; extra == 'test' +Requires-Dist: pytest-asyncio ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' +Requires-Dist: pytest-mock ; extra == 'test' +Requires-Dist: typing-extensions (<5,>=4.3) ; extra == 'test' +Provides-Extra: voice +Requires-Dist: PyNaCl (<1.6,>=1.3.0) ; extra == 'voice' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/filecache-0.81-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/filecache-0.81-py3-none-any.whl.metadata new file mode 100644 index 00000000000..6158e2bc13f --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/filecache-0.81-py3-none-any.whl.metadata @@ -0,0 +1,19 @@ +Metadata-Version: 2.1 +Name: filecache +Version: 0.81 +Summary: Persistent caching decorator +Home-page: https://github.com/ubershmekel/filecache +Author: ubershmekel +Author-email: ubershmekel@gmail.com +License: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Utilities +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Description-Content-Type: text/markdown + diff --git a/tests/repositories/fixtures/pypi.org/metadata/funcsigs-1.0.2-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/funcsigs-1.0.2-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..cf5fbdbd6f3 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/funcsigs-1.0.2-py2.py3-none-any.whl.metadata @@ -0,0 +1,26 @@ +Metadata-Version: 2.0 +Name: funcsigs +Version: 1.0.2 +Summary: Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+ +Home-page: http://funcsigs.readthedocs.org +Author: Testing Cabal +Author-email: testing-in-python@lists.idyll.org +License: ASL +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: ordereddict; python_version<"2.7" + diff --git a/tests/repositories/fixtures/pypi.org/metadata/futures-3.2.0-py2-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/futures-3.2.0-py2-none-any.whl.metadata new file mode 100644 index 00000000000..99466ddd86c --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/futures-3.2.0-py2-none-any.whl.metadata @@ -0,0 +1,17 @@ +Metadata-Version: 2.0 +Name: futures +Version: 3.2.0 +Summary: Backport of the concurrent.futures package from Python 3 +Home-page: https://github.com/agronholm/pythonfutures +Author: Alex Grönholm +Author-email: alex.gronholm@nextday.fi +License: PSF +Platform: UNKNOWN +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 2 :: Only +Requires-Python: >=2.6, <3 + diff --git a/tests/repositories/fixtures/pypi.org/metadata/importlib_metadata-1.7.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/importlib_metadata-1.7.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..779f96314ee --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/importlib_metadata-1.7.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,28 @@ +Metadata-Version: 2.1 +Name: importlib-metadata +Version: 1.7.0 +Summary: Read metadata from Python packages +Home-page: http://importlib-metadata.readthedocs.io/ +Author: Barry Warsaw +Author-email: barry@python.org +License: Apache Software License +Platform: UNKNOWN +Classifier: Development Status :: 3 - Alpha +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Topic :: Software Development :: Libraries +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 2 +Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7 +Requires-Dist: zipp (>=0.5) +Requires-Dist: pathlib2 ; python_version < "3" +Requires-Dist: contextlib2 ; python_version < "3" +Requires-Dist: configparser (>=3.5) ; python_version < "3" +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: rst.linker ; extra == 'docs' +Provides-Extra: testing +Requires-Dist: packaging ; extra == 'testing' +Requires-Dist: pep517 ; extra == 'testing' +Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/ipython-4.1.0rc1-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/ipython-4.1.0rc1-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..d0493f41b0b --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/ipython-4.1.0rc1-py2.py3-none-any.whl.metadata @@ -0,0 +1,66 @@ +Metadata-Version: 2.0 +Name: ipython +Version: 4.1.0rc1 +Summary: IPython: Productive Interactive Computing +Home-page: http://ipython.org +Author: The IPython Development Team +Author-email: ipython-dev@scipy.org +License: BSD +Download-URL: https://github.com/ipython/ipython/downloads +Keywords: Interactive,Interpreter,Shell,Parallel,Distributed,Web-based computing,Qt console,Embedding +Platform: Linux +Platform: Mac OSX +Platform: Windows XP/Vista/7/8 +Classifier: Framework :: IPython +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: System :: Shells +Requires-Dist: pickleshare +Requires-Dist: setuptools (>=18.5decorator) +Requires-Dist: simplegeneric (>0.8) +Requires-Dist: traitlets +Requires-Dist: pexpect; sys_platform != "win32" +Requires-Dist: appnope; sys_platform == "darwin" +Requires-Dist: gnureadline; sys_platform == "darwin" and platform_python_implementation == "CPython" +Provides-Extra: all +Requires-Dist: Sphinx (>=1.3); extra == 'all' +Requires-Dist: ipykernel; extra == 'all' +Requires-Dist: ipyparallel; extra == 'all' +Requires-Dist: ipywidgets; extra == 'all' +Requires-Dist: nbconvert; extra == 'all' +Requires-Dist: nbformat; extra == 'all' +Requires-Dist: nose (>=0.10.1); extra == 'all' +Requires-Dist: notebook; extra == 'all' +Requires-Dist: qtconsole; extra == 'all' +Requires-Dist: requests; extra == 'all' +Requires-Dist: testpath; extra == 'all' +Provides-Extra: doc +Requires-Dist: Sphinx (>=1.3); extra == 'doc' +Provides-Extra: kernel +Requires-Dist: ipykernel; extra == 'kernel' +Provides-Extra: nbconvert +Requires-Dist: nbconvert; extra == 'nbconvert' +Provides-Extra: nbformat +Requires-Dist: nbformat; extra == 'nbformat' +Provides-Extra: notebook +Requires-Dist: ipywidgets; extra == 'notebook' +Requires-Dist: notebook; extra == 'notebook' +Provides-Extra: parallel +Requires-Dist: ipyparallel; extra == 'parallel' +Provides-Extra: qtconsole +Requires-Dist: qtconsole; extra == 'qtconsole' +Provides-Extra: terminal +Provides-Extra: terminal +Requires-Dist: pyreadline (>=2); sys_platform == "win32" and extra == 'terminal' +Provides-Extra: test +Requires-Dist: nose (>=0.10.1); extra == 'test' +Requires-Dist: requests; extra == 'test' +Requires-Dist: testpath; extra == 'test' +Provides-Extra: test +Requires-Dist: mock; python_version == "2.7" and extra == 'test' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/ipython-5.7.0-py2-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/ipython-5.7.0-py2-none-any.whl.metadata new file mode 100644 index 00000000000..0be6ee6f03d --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/ipython-5.7.0-py2-none-any.whl.metadata @@ -0,0 +1,76 @@ +Metadata-Version: 2.0 +Name: ipython +Version: 5.7.0 +Summary: IPython: Productive Interactive Computing +Home-page: https://ipython.org +Author: The IPython Development Team +Author-email: ipython-dev@python.org +License: BSD +Description-Content-Type: UNKNOWN +Keywords: Interactive,Interpreter,Shell,Embedding +Platform: Linux +Platform: Mac OSX +Platform: Windows +Classifier: Framework :: IPython +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: System :: Shells +Requires-Dist: setuptools (>=18.5) +Requires-Dist: decorator +Requires-Dist: pickleshare +Requires-Dist: simplegeneric (>0.8) +Requires-Dist: traitlets (>=4.2) +Requires-Dist: prompt-toolkit (<2.0.0,>=1.0.4) +Requires-Dist: pygments +Requires-Dist: backports.shutil-get-terminal-size; python_version == "2.7" +Requires-Dist: pathlib2; python_version == "2.7" or python_version == "3.3" +Requires-Dist: pexpect; sys_platform != "win32" +Requires-Dist: appnope; sys_platform == "darwin" +Requires-Dist: colorama; sys_platform == "win32" +Requires-Dist: win-unicode-console (>=0.5); sys_platform == "win32" and python_version < "3.6" +Provides-Extra: all +Requires-Dist: nbformat; extra == 'all' +Requires-Dist: ipykernel; extra == 'all' +Requires-Dist: pygments; extra == 'all' +Requires-Dist: testpath; extra == 'all' +Requires-Dist: notebook; extra == 'all' +Requires-Dist: nbconvert; extra == 'all' +Requires-Dist: ipyparallel; extra == 'all' +Requires-Dist: qtconsole; extra == 'all' +Requires-Dist: Sphinx (>=1.3); extra == 'all' +Requires-Dist: requests; extra == 'all' +Requires-Dist: nose (>=0.10.1); extra == 'all' +Requires-Dist: ipywidgets; extra == 'all' +Provides-Extra: doc +Requires-Dist: Sphinx (>=1.3); extra == 'doc' +Provides-Extra: kernel +Requires-Dist: ipykernel; extra == 'kernel' +Provides-Extra: nbconvert +Requires-Dist: nbconvert; extra == 'nbconvert' +Provides-Extra: nbformat +Requires-Dist: nbformat; extra == 'nbformat' +Provides-Extra: notebook +Requires-Dist: notebook; extra == 'notebook' +Requires-Dist: ipywidgets; extra == 'notebook' +Provides-Extra: parallel +Requires-Dist: ipyparallel; extra == 'parallel' +Provides-Extra: qtconsole +Requires-Dist: qtconsole; extra == 'qtconsole' +Provides-Extra: terminal +Provides-Extra: test +Requires-Dist: nose (>=0.10.1); extra == 'test' +Requires-Dist: requests; extra == 'test' +Requires-Dist: testpath; extra == 'test' +Requires-Dist: pygments; extra == 'test' +Requires-Dist: nbformat; extra == 'test' +Requires-Dist: ipykernel; extra == 'test' +Provides-Extra: test +Requires-Dist: mock; python_version == "2.7" and extra == 'test' +Provides-Extra: test +Requires-Dist: numpy; python_version >= "3.4" and extra == 'test' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/ipython-5.7.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/ipython-5.7.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..6452ccb168a --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/ipython-5.7.0-py3-none-any.whl.metadata @@ -0,0 +1,76 @@ +Metadata-Version: 2.0 +Name: ipython +Version: 5.7.0 +Summary: IPython: Productive Interactive Computing +Home-page: https://ipython.org +Author: The IPython Development Team +Author-email: ipython-dev@python.org +License: BSD +Description-Content-Type: UNKNOWN +Keywords: Interactive,Interpreter,Shell,Embedding +Platform: Linux +Platform: Mac OSX +Platform: Windows +Classifier: Framework :: IPython +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: System :: Shells +Requires-Dist: setuptools (>=18.5) +Requires-Dist: decorator +Requires-Dist: pickleshare +Requires-Dist: simplegeneric (>0.8) +Requires-Dist: traitlets (>=4.2) +Requires-Dist: prompt-toolkit (<2.0.0,>=1.0.4) +Requires-Dist: pygments +Requires-Dist: backports.shutil-get-terminal-size; python_version == "2.7" +Requires-Dist: pathlib2; python_version == "2.7" or python_version == "3.3" +Requires-Dist: pexpect; sys_platform != "win32" +Requires-Dist: appnope; sys_platform == "darwin" +Requires-Dist: colorama; sys_platform == "win32" +Requires-Dist: win-unicode-console (>=0.5); sys_platform == "win32" and python_version < "3.6" +Provides-Extra: all +Requires-Dist: nose (>=0.10.1); extra == 'all' +Requires-Dist: ipywidgets; extra == 'all' +Requires-Dist: nbformat; extra == 'all' +Requires-Dist: pygments; extra == 'all' +Requires-Dist: ipyparallel; extra == 'all' +Requires-Dist: requests; extra == 'all' +Requires-Dist: ipykernel; extra == 'all' +Requires-Dist: qtconsole; extra == 'all' +Requires-Dist: testpath; extra == 'all' +Requires-Dist: nbconvert; extra == 'all' +Requires-Dist: Sphinx (>=1.3); extra == 'all' +Requires-Dist: notebook; extra == 'all' +Provides-Extra: doc +Requires-Dist: Sphinx (>=1.3); extra == 'doc' +Provides-Extra: kernel +Requires-Dist: ipykernel; extra == 'kernel' +Provides-Extra: nbconvert +Requires-Dist: nbconvert; extra == 'nbconvert' +Provides-Extra: nbformat +Requires-Dist: nbformat; extra == 'nbformat' +Provides-Extra: notebook +Requires-Dist: notebook; extra == 'notebook' +Requires-Dist: ipywidgets; extra == 'notebook' +Provides-Extra: parallel +Requires-Dist: ipyparallel; extra == 'parallel' +Provides-Extra: qtconsole +Requires-Dist: qtconsole; extra == 'qtconsole' +Provides-Extra: terminal +Provides-Extra: test +Requires-Dist: nose (>=0.10.1); extra == 'test' +Requires-Dist: requests; extra == 'test' +Requires-Dist: testpath; extra == 'test' +Requires-Dist: pygments; extra == 'test' +Requires-Dist: nbformat; extra == 'test' +Requires-Dist: ipykernel; extra == 'test' +Provides-Extra: test +Requires-Dist: mock; python_version == "2.7" and extra == 'test' +Provides-Extra: test +Requires-Dist: numpy; python_version >= "3.4" and extra == 'test' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/ipython-7.5.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/ipython-7.5.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..a2d0a70e176 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/ipython-7.5.0-py3-none-any.whl.metadata @@ -0,0 +1,87 @@ +Metadata-Version: 2.1 +Name: ipython +Version: 7.5.0 +Summary: IPython: Productive Interactive Computing +Home-page: https://ipython.org +Author: The IPython Development Team +Author-email: ipython-dev@python.org +License: BSD +Project-URL: Documentation, https://ipython.readthedocs.io/ +Project-URL: Funding, https://numfocus.org/ +Project-URL: Source, https://github.com/ipython/ipython +Project-URL: Tracker, https://github.com/ipython/ipython/issues +Keywords: Interactive,Interpreter,Shell,Embedding +Platform: Linux +Platform: Mac OSX +Platform: Windows +Classifier: Framework :: IPython +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Topic :: System :: Shells +Requires-Python: >=3.5 +Provides-Extra: parallel +Provides-Extra: nbconvert +Provides-Extra: terminal +Provides-Extra: kernel +Provides-Extra: notebook +Provides-Extra: doc +Provides-Extra: nbformat +Provides-Extra: test +Provides-Extra: all +Provides-Extra: qtconsole +Requires-Dist: setuptools (>=18.5) +Requires-Dist: jedi (>=0.10) +Requires-Dist: decorator +Requires-Dist: pickleshare +Requires-Dist: traitlets (>=4.2) +Requires-Dist: prompt-toolkit (<2.1.0,>=2.0.0) +Requires-Dist: pygments +Requires-Dist: backcall +Requires-Dist: typing; python_version == "3.4" +Requires-Dist: pexpect; sys_platform != "win32" +Requires-Dist: appnope; sys_platform == "darwin" +Requires-Dist: colorama; sys_platform == "win32" +Requires-Dist: win-unicode-console (>=0.5); sys_platform == "win32" and python_version < "3.6" +Provides-Extra: all +Requires-Dist: nbconvert; extra == 'all' +Requires-Dist: ipywidgets; extra == 'all' +Requires-Dist: pygments; extra == 'all' +Requires-Dist: ipykernel; extra == 'all' +Requires-Dist: notebook; extra == 'all' +Requires-Dist: ipyparallel; extra == 'all' +Requires-Dist: requests; extra == 'all' +Requires-Dist: Sphinx (>=1.3); extra == 'all' +Requires-Dist: nbformat; extra == 'all' +Requires-Dist: nose (>=0.10.1); extra == 'all' +Requires-Dist: numpy; extra == 'all' +Requires-Dist: testpath; extra == 'all' +Requires-Dist: qtconsole; extra == 'all' +Provides-Extra: doc +Requires-Dist: Sphinx (>=1.3); extra == 'doc' +Provides-Extra: kernel +Requires-Dist: ipykernel; extra == 'kernel' +Provides-Extra: nbconvert +Requires-Dist: nbconvert; extra == 'nbconvert' +Provides-Extra: nbformat +Requires-Dist: nbformat; extra == 'nbformat' +Provides-Extra: notebook +Requires-Dist: notebook; extra == 'notebook' +Requires-Dist: ipywidgets; extra == 'notebook' +Provides-Extra: parallel +Requires-Dist: ipyparallel; extra == 'parallel' +Provides-Extra: qtconsole +Requires-Dist: qtconsole; extra == 'qtconsole' +Provides-Extra: terminal +Provides-Extra: test +Requires-Dist: nose (>=0.10.1); extra == 'test' +Requires-Dist: requests; extra == 'test' +Requires-Dist: testpath; extra == 'test' +Requires-Dist: pygments; extra == 'test' +Requires-Dist: nbformat; extra == 'test' +Requires-Dist: ipykernel; extra == 'test' +Requires-Dist: numpy; extra == 'test' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/isort-4.3.4-py2-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/isort-4.3.4-py2-none-any.whl.metadata new file mode 100644 index 00000000000..6f1e1cb37a4 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/isort-4.3.4-py2-none-any.whl.metadata @@ -0,0 +1,31 @@ +Metadata-Version: 2.0 +Name: isort +Version: 4.3.4 +Summary: A Python utility / library to sort Python imports. +Home-page: https://github.com/timothycrosley/isort +Author: Timothy Crosley +Author-email: timothy.crosley@gmail.com +License: MIT +Description-Content-Type: UNKNOWN +Keywords: Refactor,Python,Python2,Python3,Refactoring,Imports,Sort,Clean +Platform: UNKNOWN +Classifier: Development Status :: 6 - Mature +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: Environment :: Console +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Dist: futures +Requires-Dist: futures; python_version=="2.7" + diff --git a/tests/repositories/fixtures/pypi.org/metadata/isort-4.3.4-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/isort-4.3.4-py3-none-any.whl.metadata new file mode 100644 index 00000000000..24d76486a6e --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/isort-4.3.4-py3-none-any.whl.metadata @@ -0,0 +1,29 @@ +Metadata-Version: 2.0 +Name: isort +Version: 4.3.4 +Summary: A Python utility / library to sort Python imports. +Home-page: https://github.com/timothycrosley/isort +Author: Timothy Crosley +Author-email: timothy.crosley@gmail.com +License: MIT +Keywords: Refactor,Python,Python2,Python3,Refactoring,Imports,Sort,Clean +Platform: UNKNOWN +Classifier: Development Status :: 6 - Mature +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: Environment :: Console +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Dist: futures; python_version=="2.7" + diff --git a/tests/repositories/fixtures/metadata/isort-metadata-4.3.4-py2-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/isort-metadata-4.3.4-py2-none-any.whl.metadata similarity index 100% rename from tests/repositories/fixtures/metadata/isort-metadata-4.3.4-py2-none-any.whl.metadata rename to tests/repositories/fixtures/pypi.org/metadata/isort-metadata-4.3.4-py2-none-any.whl.metadata diff --git a/tests/repositories/fixtures/metadata/isort-metadata-4.3.4-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/isort-metadata-4.3.4-py3-none-any.whl.metadata similarity index 100% rename from tests/repositories/fixtures/metadata/isort-metadata-4.3.4-py3-none-any.whl.metadata rename to tests/repositories/fixtures/pypi.org/metadata/isort-metadata-4.3.4-py3-none-any.whl.metadata diff --git a/tests/repositories/fixtures/pypi.org/metadata/jupyter-1.0.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/jupyter-1.0.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..ba3ed0cf702 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/jupyter-1.0.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,26 @@ +Metadata-Version: 2.0 +Name: jupyter +Version: 1.0.0 +Summary: Jupyter metapackage. Install all the Jupyter components in one go. +Home-page: http://jupyter.org +Author: Jupyter Development Team +Author-email: jupyter@googlegroups.org +License: BSD +Platform: UNKNOWN +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Requires-Dist: notebook +Requires-Dist: qtconsole +Requires-Dist: jupyter-console +Requires-Dist: nbconvert +Requires-Dist: ipykernel +Requires-Dist: ipywidgets + diff --git a/tests/repositories/fixtures/pypi.org/metadata/mocked/with_extra_dependency-0.12.4-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/mocked/with_extra_dependency-0.12.4-py3-none-any.whl.metadata new file mode 100644 index 00000000000..2bfa0e441ec --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/mocked/with_extra_dependency-0.12.4-py3-none-any.whl.metadata @@ -0,0 +1,21 @@ +Metadata-Version: 2.1 +Name: with-extra-dependency +Version: 0.12.4 +Summary: Mock Package +Home-page: https://python-poetry.org/ +License: MIT +Keywords: packaging,dependency,poetry +Author: Poetry Team +Author-email: noreply@python-poetry.org +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Software Development :: Build Tools +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: filecache; extra == 'filecache' +Description-Content-Type: text/markdown + diff --git a/tests/repositories/fixtures/pypi.org/metadata/mocked/with_transitive_extra_dependency-0.12.4-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/mocked/with_transitive_extra_dependency-0.12.4-py3-none-any.whl.metadata new file mode 100644 index 00000000000..e14ae1d79aa --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/mocked/with_transitive_extra_dependency-0.12.4-py3-none-any.whl.metadata @@ -0,0 +1,21 @@ +Metadata-Version: 2.1 +Name: with-transitive-extra-dependency +Version: 0.12.4 +Summary: Mock Package +Home-page: https://python-poetry.org/ +License: MIT +Keywords: packaging,dependency,poetry +Author: Poetry Team +Author-email: noreply@python-poetry.org +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Software Development :: Build Tools +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: with-extra-dependency[filecache] (>=0.12.4,<0.13.0) +Description-Content-Type: text/markdown + diff --git a/tests/repositories/fixtures/pypi.org/metadata/more_itertools-4.1.0-py2-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/more_itertools-4.1.0-py2-none-any.whl.metadata new file mode 100644 index 00000000000..c6f0be3ec24 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/more_itertools-4.1.0-py2-none-any.whl.metadata @@ -0,0 +1,25 @@ +Metadata-Version: 2.0 +Name: more-itertools +Version: 4.1.0 +Summary: More routines for operating on iterables, beyond itertools +Home-page: https://github.com/erikrose/more-itertools +Author: Erik Rose +Author-email: erikrose@grinchcentral.com +License: MIT +Description-Content-Type: UNKNOWN +Keywords: itertools,iterator,iteration,filter,peek,peekable,collate,chunk,chunked +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries +Requires-Dist: six (<2.0.0,>=1.0.0) + diff --git a/tests/repositories/fixtures/pypi.org/metadata/more_itertools-4.1.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/more_itertools-4.1.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..c6f0be3ec24 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/more_itertools-4.1.0-py3-none-any.whl.metadata @@ -0,0 +1,25 @@ +Metadata-Version: 2.0 +Name: more-itertools +Version: 4.1.0 +Summary: More routines for operating on iterables, beyond itertools +Home-page: https://github.com/erikrose/more-itertools +Author: Erik Rose +Author-email: erikrose@grinchcentral.com +License: MIT +Description-Content-Type: UNKNOWN +Keywords: itertools,iterator,iteration,filter,peek,peekable,collate,chunk,chunked +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries +Requires-Dist: six (<2.0.0,>=1.0.0) + diff --git a/tests/repositories/fixtures/pypi.org/metadata/pastel-0.1.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/pastel-0.1.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..455d7eb0e0a --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/pastel-0.1.0-py3-none-any.whl.metadata @@ -0,0 +1,20 @@ +Metadata-Version: 2.0 +Name: pastel +Version: 0.1.0 +Summary: Bring colors to your terminal. +Home-page: https://github.com/sdispater/pastel +Author: Sébastien Eustace +Author-email: sebastien@eustace.io +License: MIT +Download-URL: https://github.com/sdispater/pastel/archive/0.1.0.tar.gz +Platform: UNKNOWN +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy + diff --git a/tests/repositories/fixtures/pypi.org/metadata/pluggy-0.6.0-py2-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/pluggy-0.6.0-py2-none-any.whl.metadata new file mode 100644 index 00000000000..fc2f914792e --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/pluggy-0.6.0-py2-none-any.whl.metadata @@ -0,0 +1,31 @@ +Metadata-Version: 2.1 +Name: pluggy +Version: 0.6.0 +Summary: plugin and hook calling mechanisms for python +Home-page: https://github.com/pytest-dev/pluggy +Author: Holger Krekel +Author-email: holger@merlinux.eu +License: MIT license +Platform: unix +Platform: linux +Platform: osx +Platform: win32 +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + diff --git a/tests/repositories/fixtures/pypi.org/metadata/pluggy-0.6.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/pluggy-0.6.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..5964dd8c18d --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/pluggy-0.6.0-py3-none-any.whl.metadata @@ -0,0 +1,32 @@ +Metadata-Version: 2.0 +Name: pluggy +Version: 0.6.0 +Summary: plugin and hook calling mechanisms for python +Home-page: https://github.com/pytest-dev/pluggy +Author: Holger Krekel +Author-email: holger@merlinux.eu +License: MIT license +Description-Content-Type: UNKNOWN +Platform: unix +Platform: linux +Platform: osx +Platform: win32 +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + diff --git a/tests/repositories/fixtures/pypi.org/metadata/poetry_core-1.5.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/poetry_core-1.5.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..352f15e5cf0 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/poetry_core-1.5.0-py3-none-any.whl.metadata @@ -0,0 +1,24 @@ +Metadata-Version: 2.1 +Name: poetry-core +Version: 1.5.0 +Summary: Poetry PEP 517 Build Backend +Home-page: https://github.com/python-poetry/poetry-core +License: MIT +Keywords: packaging,dependency,poetry +Author: Sébastien Eustace +Author-email: sebastien@eustace.io +Requires-Python: >=3.7,<4.0 +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 +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 :: 3.11 +Classifier: Topic :: Software Development :: Build Tools +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: importlib-metadata (>=1.7.0) ; python_version < "3.8" +Project-URL: Bug Tracker, https://github.com/python-poetry/poetry/issues +Project-URL: Repository, https://github.com/python-poetry/poetry-core +Description-Content-Type: text/markdown + diff --git a/tests/repositories/fixtures/pypi.org/metadata/py-1.5.3-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/py-1.5.3-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..5c0b6537d3a --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/py-1.5.3-py2.py3-none-any.whl.metadata @@ -0,0 +1,33 @@ +Metadata-Version: 2.0 +Name: py +Version: 1.5.3 +Summary: library with cross-python path, ini-parsing, io, code, log facilities +Home-page: http://py.readthedocs.io/ +Author: holger krekel, Ronny Pfannschmidt, Benjamin Peterson and others +Author-email: pytest-dev@python.org +License: MIT license +Platform: unix +Platform: linux +Platform: osx +Platform: cygwin +Platform: win32 +Classifier: Development Status :: 6 - Mature +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + diff --git a/tests/repositories/fixtures/pypi.org/metadata/pylev-1.3.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/pylev-1.3.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..c160d0adb8c --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/pylev-1.3.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,16 @@ +Metadata-Version: 2.0 +Name: pylev +Version: 1.3.0 +Summary: A pure Python Levenshtein implementation that's not freaking GPL'd. +Home-page: http://github.com/toastdriven/pylev +Author: Daniel Lindsley +Author-email: daniel@toastdriven.com +License: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 + diff --git a/tests/repositories/fixtures/pypi.org/metadata/pytest-3.5.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/pytest-3.5.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..a4497df3124 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/pytest-3.5.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,39 @@ +Metadata-Version: 2.0 +Name: pytest +Version: 3.5.0 +Summary: pytest: simple powerful testing with Python +Home-page: http://pytest.org +Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others +License: MIT license +Keywords: test unittest +Platform: unix +Platform: linux +Platform: osx +Platform: cygwin +Platform: win32 +Classifier: Development Status :: 6 - Mature +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Dist: py (>=1.5.0) +Requires-Dist: six (>=1.10.0) +Requires-Dist: setuptools +Requires-Dist: attrs (>=17.4.0) +Requires-Dist: more-itertools (>=4.0.0) +Requires-Dist: pluggy (<0.7,>=0.5) +Requires-Dist: funcsigs; python_version < "3.0" +Requires-Dist: colorama; sys_platform == "win32" + diff --git a/tests/repositories/fixtures/pypi.org/metadata/pytest-3.5.1-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/pytest-3.5.1-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..c8d2190f32c --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/pytest-3.5.1-py2.py3-none-any.whl.metadata @@ -0,0 +1,41 @@ +Metadata-Version: 2.1 +Name: pytest +Version: 3.5.1 +Summary: pytest: simple powerful testing with Python +Home-page: http://pytest.org +Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others +License: MIT license +Project-URL: Source, https://github.com/pytest-dev/pytest +Project-URL: Tracker, https://github.com/pytest-dev/pytest/issues +Keywords: test unittest +Platform: unix +Platform: linux +Platform: osx +Platform: cygwin +Platform: win32 +Classifier: Development Status :: 6 - Mature +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Dist: py (>=1.5.0) +Requires-Dist: six (>=1.10.0) +Requires-Dist: setuptools +Requires-Dist: attrs (>=17.4.0) +Requires-Dist: more-itertools (>=4.0.0) +Requires-Dist: pluggy (<0.7,>=0.5) +Requires-Dist: funcsigs; python_version < "3.0" +Requires-Dist: colorama; sys_platform == "win32" + diff --git a/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..371caa64190 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,36 @@ +Metadata-Version: 2.0 +Name: requests +Version: 2.18.0 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Dist: certifi (>=2017.4.17) +Requires-Dist: chardet (>=3.0.2,<3.1.0) +Requires-Dist: idna (>=2.5,<2.6) +Requires-Dist: urllib3 (<1.22,>=1.21.1) +Provides-Extra: security +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Provides-Extra: socks +Requires-Dist: win-inet-pton; sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6") and extra == 'socks' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.1-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.1-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..9b1ea72c621 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.1-py2.py3-none-any.whl.metadata @@ -0,0 +1,36 @@ +Metadata-Version: 2.0 +Name: requests +Version: 2.18.1 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Dist: certifi (>=2017.4.17) +Requires-Dist: chardet (>=3.0.2,<3.1.0) +Requires-Dist: idna (>=2.5,<2.6) +Requires-Dist: urllib3 (<1.22,>=1.21.1) +Provides-Extra: security +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Provides-Extra: socks +Requires-Dist: win-inet-pton; sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6") and extra == 'socks' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.2-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.2-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..bfb02c2cfec --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.2-py2.py3-none-any.whl.metadata @@ -0,0 +1,36 @@ +Metadata-Version: 2.0 +Name: requests +Version: 2.18.2 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Dist: certifi (>=2017.4.17) +Requires-Dist: chardet (>=3.0.2,<3.1.0) +Requires-Dist: idna (>=2.5,<2.6) +Requires-Dist: urllib3 (<1.23,>=1.21.1) +Provides-Extra: security +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Provides-Extra: socks +Requires-Dist: win-inet-pton; sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6") and extra == 'socks' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.3-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.3-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..8261db9f64e --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.3-py2.py3-none-any.whl.metadata @@ -0,0 +1,36 @@ +Metadata-Version: 2.0 +Name: requests +Version: 2.18.3 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Dist: certifi (>=2017.4.17) +Requires-Dist: chardet (>=3.0.2,<3.1.0) +Requires-Dist: idna (>=2.5,<2.6) +Requires-Dist: urllib3 (<1.23,>=1.21.1) +Provides-Extra: security +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Provides-Extra: socks +Requires-Dist: win-inet-pton; sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6") and extra == 'socks' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.4-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.4-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..10ec68d4cb1 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/requests-2.18.4-py2.py3-none-any.whl.metadata @@ -0,0 +1,35 @@ +Metadata-Version: 2.0 +Name: requests +Version: 2.18.4 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Dist: certifi (>=2017.4.17) +Requires-Dist: chardet (>=3.0.2,<3.1.0) +Requires-Dist: idna (>=2.5,<2.7) +Requires-Dist: urllib3 (<1.23,>=1.21.1) +Provides-Extra: security +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Provides-Extra: socks +Requires-Dist: win-inet-pton; sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6") and extra == 'socks' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/requests-2.19.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/requests-2.19.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..519f3ed71b5 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/requests-2.19.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,37 @@ +Metadata-Version: 2.0 +Name: requests +Version: 2.19.0 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Description-Content-Type: text/x-rst +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Dist: chardet (<3.1.0,>=3.0.2) +Requires-Dist: idna (<2.8,>=2.5) +Requires-Dist: urllib3 (<1.24,>=1.21.1) +Requires-Dist: certifi (>=2017.4.17) +Provides-Extra: security +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Provides-Extra: socks +Requires-Dist: win-inet-pton; sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6") and extra == 'socks' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/setuptools-39.2.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/setuptools-39.2.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..2f111650ff0 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/setuptools-39.2.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,35 @@ +Metadata-Version: 2.1 +Name: setuptools +Version: 39.2.0 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://github.com/pypa/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +License: UNKNOWN +Project-URL: Documentation, https://setuptools.readthedocs.io/ +Keywords: CPAN PyPI distutils eggs package management +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.* +Description-Content-Type: text/x-rst; charset=UTF-8 +Provides-Extra: ssl +Provides-Extra: certs +Provides-Extra: certs +Requires-Dist: certifi (==2016.9.26); extra == 'certs' +Provides-Extra: ssl +Requires-Dist: wincertstore (==0.2); (sys_platform=='win32') and extra == 'ssl' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/setuptools-67.6.1-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/setuptools-67.6.1-py3-none-any.whl.metadata new file mode 100644 index 00000000000..d219535456c --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/setuptools-67.6.1-py3-none-any.whl.metadata @@ -0,0 +1,72 @@ +Metadata-Version: 2.1 +Name: setuptools +Version: 67.6.1 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://github.com/pypa/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +Project-URL: Documentation, https://setuptools.pypa.io/ +Project-URL: Changelog, https://setuptools.pypa.io/en/stable/history.html +Keywords: CPAN PyPI distutils eggs package management +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Requires-Python: >=3.7 +License-File: LICENSE +Provides-Extra: certs +Provides-Extra: docs +Requires-Dist: sphinx (>=3.5) ; extra == 'docs' +Requires-Dist: jaraco.packaging (>=9) ; extra == 'docs' +Requires-Dist: rst.linker (>=1.9) ; extra == 'docs' +Requires-Dist: furo ; extra == 'docs' +Requires-Dist: sphinx-lint ; extra == 'docs' +Requires-Dist: jaraco.tidelift (>=1.4) ; extra == 'docs' +Requires-Dist: pygments-github-lexers (==0.0.5) ; extra == 'docs' +Requires-Dist: sphinx-favicon ; extra == 'docs' +Requires-Dist: sphinx-inline-tabs ; extra == 'docs' +Requires-Dist: sphinx-reredirects ; extra == 'docs' +Requires-Dist: sphinxcontrib-towncrier ; extra == 'docs' +Requires-Dist: sphinx-notfound-page (==0.8.3) ; extra == 'docs' +Requires-Dist: sphinx-hoverxref (<2) ; extra == 'docs' +Provides-Extra: ssl +Provides-Extra: testing +Requires-Dist: pytest (>=6) ; extra == 'testing' +Requires-Dist: pytest-checkdocs (>=2.4) ; extra == 'testing' +Requires-Dist: flake8 (<5) ; extra == 'testing' +Requires-Dist: pytest-enabler (>=1.3) ; extra == 'testing' +Requires-Dist: pytest-perf ; extra == 'testing' +Requires-Dist: flake8-2020 ; extra == 'testing' +Requires-Dist: virtualenv (>=13.0.0) ; extra == 'testing' +Requires-Dist: wheel ; extra == 'testing' +Requires-Dist: pip (>=19.1) ; extra == 'testing' +Requires-Dist: jaraco.envs (>=2.2) ; extra == 'testing' +Requires-Dist: pytest-xdist ; extra == 'testing' +Requires-Dist: jaraco.path (>=3.2.0) ; extra == 'testing' +Requires-Dist: build[virtualenv] ; extra == 'testing' +Requires-Dist: filelock (>=3.4.0) ; extra == 'testing' +Requires-Dist: pip-run (>=8.8) ; extra == 'testing' +Requires-Dist: ini2toml[lite] (>=0.9) ; extra == 'testing' +Requires-Dist: tomli-w (>=1.0.0) ; extra == 'testing' +Requires-Dist: pytest-timeout ; extra == 'testing' +Provides-Extra: testing-integration +Requires-Dist: pytest ; extra == 'testing-integration' +Requires-Dist: pytest-xdist ; extra == 'testing-integration' +Requires-Dist: pytest-enabler ; extra == 'testing-integration' +Requires-Dist: virtualenv (>=13.0.0) ; extra == 'testing-integration' +Requires-Dist: tomli ; extra == 'testing-integration' +Requires-Dist: wheel ; extra == 'testing-integration' +Requires-Dist: jaraco.path (>=3.2.0) ; extra == 'testing-integration' +Requires-Dist: jaraco.envs (>=2.2) ; extra == 'testing-integration' +Requires-Dist: build[virtualenv] ; extra == 'testing-integration' +Requires-Dist: filelock (>=3.4.0) ; extra == 'testing-integration' +Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: pytest-cov ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: pytest-mypy (>=0.9.1) ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: pytest-flake8 ; (python_version < "3.12") and extra == 'testing' + diff --git a/tests/repositories/fixtures/pypi.org/metadata/six-1.11.0-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/six-1.11.0-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..7e7d3ae1a52 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/six-1.11.0-py2.py3-none-any.whl.metadata @@ -0,0 +1,16 @@ +Metadata-Version: 2.0 +Name: six +Version: 1.11.0 +Summary: Python 2 and 3 compatibility utilities +Home-page: http://pypi.python.org/pypi/six/ +Author: Benjamin Peterson +Author-email: benjamin@python.org +License: MIT +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities + diff --git a/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..5a774db2468 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0-py3-none-any.whl.metadata @@ -0,0 +1,36 @@ +Metadata-Version: 2.1 +Name: toga +Version: 0.3.0 +Summary: A Python native, OS native GUI toolkit. +Home-page: https://beeware.org/project/projects/libraries/toga/ +Author: Russell Keith-Magee +Author-email: russell@keith-magee.com +Maintainer: BeeWare Team +Maintainer-email: team@beeware.org +License: New BSD +Project-URL: Funding, https://beeware.org/contributing/membership/ +Project-URL: Documentation, http://toga.readthedocs.io/en/latest/ +Project-URL: Tracker, https://github.com/beeware/toga/issues +Project-URL: Source, https://github.com/beeware/toga +Keywords: gui,widget,cross-platform,desktop,mobile,web,macOS,cocoa,iOS,android,windows,winforms,linux,gtk +Classifier: Development Status :: 3 - Alpha +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +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 :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: User Interfaces +Classifier: Topic :: Software Development :: Widget Sets +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst; charset=UTF-8 +Requires-Dist: toga-cocoa (==0.3.0) ; sys_platform=="darwin" +Requires-Dist: toga-gtk (==0.3.0) ; sys_platform=="linux" +Requires-Dist: toga-winforms (==0.3.0) ; sys_platform=="win32" + diff --git a/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0.dev1-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0.dev1-py3-none-any.whl.metadata new file mode 100644 index 00000000000..5c1997d231c --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0.dev1-py3-none-any.whl.metadata @@ -0,0 +1,26 @@ +Metadata-Version: 2.0 +Name: toga +Version: 0.3.0.dev1 +Summary: A Python native, OS native GUI toolkit. +Home-page: http://pybee.org/toga +Author: Russell Keith-Magee +Author-email: russell@keith-magee.com +License: New BSD +Description-Content-Type: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 3 - Alpha +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: User Interfaces +Classifier: Topic :: Software Development :: Widget Sets +Requires-Dist: toga-cocoa; sys_platform=="darwin" +Requires-Dist: toga-gtk; sys_platform=="linux" +Requires-Dist: toga-winforms; sys_platform=="win32" + diff --git a/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0.dev2-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0.dev2-py3-none-any.whl.metadata new file mode 100644 index 00000000000..83b45ea0def --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/toga-0.3.0.dev2-py3-none-any.whl.metadata @@ -0,0 +1,26 @@ +Metadata-Version: 2.0 +Name: toga +Version: 0.3.0.dev2 +Summary: A Python native, OS native GUI toolkit. +Home-page: http://pybee.org/toga +Author: Russell Keith-Magee +Author-email: russell@keith-magee.com +License: New BSD +Description-Content-Type: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 3 - Alpha +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: User Interfaces +Classifier: Topic :: Software Development :: Widget Sets +Requires-Dist: toga-cocoa; sys_platform=="darwin" +Requires-Dist: toga-gtk; sys_platform=="linux" +Requires-Dist: toga-winforms; sys_platform=="win32" + diff --git a/tests/repositories/fixtures/pypi.org/metadata/toga-0.4.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/toga-0.4.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..b7df3075684 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/toga-0.4.0-py3-none-any.whl.metadata @@ -0,0 +1,36 @@ +Metadata-Version: 2.1 +Name: toga +Version: 0.4.0 +Summary: A Python native, OS native GUI toolkit. +Home-page: https://beeware.org/project/projects/libraries/toga/ +Author: Russell Keith-Magee +Author-email: russell@keith-magee.com +Maintainer: BeeWare Team +Maintainer-email: team@beeware.org +License: New BSD +Project-URL: Funding, https://beeware.org/contributing/membership/ +Project-URL: Documentation, http://toga.readthedocs.io/en/latest/ +Project-URL: Tracker, https://github.com/beeware/toga/issues +Project-URL: Source, https://github.com/beeware/toga +Keywords: gui,widget,cross-platform,desktop,mobile,web,macOS,cocoa,iOS,android,windows,winforms,linux,freeBSD,gtk +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: User Interfaces +Classifier: Topic :: Software Development :: Widget Sets +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst; charset=UTF-8 +Requires-Dist: toga-gtk ==0.4.0 ; "freebsd" in sys_platform +Requires-Dist: toga-cocoa ==0.4.0 ; sys_platform=="darwin" +Requires-Dist: toga-gtk ==0.4.0 ; sys_platform=="linux" +Requires-Dist: toga-winforms ==0.4.0 ; sys_platform=="win32" + diff --git a/tests/repositories/fixtures/pypi.org/metadata/tomlkit-0.5.2-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/tomlkit-0.5.2-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..e8fa657071b --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/tomlkit-0.5.2-py2.py3-none-any.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: tomlkit +Version: 0.5.2 +Summary: Style preserving TOML library +Home-page: https://github.com/sdispater/tomlkit +License: MIT +Author: Sébastien Eustace +Author-email: sebastien@eustace.io +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Dist: enum34 (>=1.1,<2.0); python_version >= "2.7" and python_version < "2.8" +Requires-Dist: functools32 (>=3.2.3,<4.0.0); python_version >= "2.7" and python_version < "2.8" +Requires-Dist: typing (>=3.6,<4.0); python_version >= "2.7" and python_version < "2.8" or python_version >= "3.4" and python_version < "3.5" +Project-URL: Repository, https://github.com/sdispater/tomlkit +Description-Content-Type: text/markdown + diff --git a/tests/repositories/fixtures/pypi.org/metadata/tomlkit-0.5.3-py2.py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/tomlkit-0.5.3-py2.py3-none-any.whl.metadata new file mode 100644 index 00000000000..04ea890c943 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/tomlkit-0.5.3-py2.py3-none-any.whl.metadata @@ -0,0 +1,23 @@ +Metadata-Version: 2.1 +Name: tomlkit +Version: 0.5.3 +Summary: Style preserving TOML library +Home-page: https://github.com/sdispater/tomlkit +License: MIT +Author: Sébastien Eustace +Author-email: sebastien@eustace.io +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Dist: enum34 (>=1.1,<2.0); python_version >= "2.7" and python_version < "2.8" +Requires-Dist: functools32 (>=3.2.3,<4.0.0); python_version >= "2.7" and python_version < "2.8" +Requires-Dist: typing (>=3.6,<4.0); python_version >= "2.7" and python_version < "2.8" or python_version >= "3.4" and python_version < "3.5" +Project-URL: Repository, https://github.com/sdispater/tomlkit +Description-Content-Type: text/markdown + diff --git a/tests/repositories/fixtures/pypi.org/metadata/wheel-0.40.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/wheel-0.40.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..2bb556fea34 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/wheel-0.40.0-py3-none-any.whl.metadata @@ -0,0 +1,26 @@ +Metadata-Version: 2.1 +Name: wheel +Version: 0.40.0 +Summary: A built-package format for Python +Keywords: wheel,packaging +Author-email: Daniel Holth +Maintainer-email: Alex Grönholm +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 :: Only +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 :: 3.11 +Requires-Dist: pytest >= 6.0.0 ; extra == "test" +Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html +Project-URL: Documentation, https://wheel.readthedocs.io/ +Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues +Provides-Extra: test + diff --git a/tests/repositories/fixtures/pypi.org/metadata/zipp-3.5.0-py3-none-any.whl.metadata b/tests/repositories/fixtures/pypi.org/metadata/zipp-3.5.0-py3-none-any.whl.metadata new file mode 100644 index 00000000000..aa941338ad8 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/metadata/zipp-3.5.0-py3-none-any.whl.metadata @@ -0,0 +1,31 @@ +Metadata-Version: 2.1 +Name: zipp +Version: 3.5.0 +Summary: Backport of pathlib-compatible object wrapper for zip files +Home-page: https://github.com/jaraco/zipp +Author: Jason R. Coombs +Author-email: jaraco@jaraco.com +License: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Requires-Python: >=3.6 +License-File: LICENSE +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: jaraco.packaging (>=8.2) ; extra == 'docs' +Requires-Dist: rst.linker (>=1.9) ; extra == 'docs' +Provides-Extra: testing +Requires-Dist: pytest (>=4.6) ; extra == 'testing' +Requires-Dist: pytest-checkdocs (>=2.4) ; extra == 'testing' +Requires-Dist: pytest-flake8 ; extra == 'testing' +Requires-Dist: pytest-cov ; extra == 'testing' +Requires-Dist: pytest-enabler (>=1.0.1) ; extra == 'testing' +Requires-Dist: jaraco.itertools ; extra == 'testing' +Requires-Dist: func-timeout ; extra == 'testing' +Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy" and python_version < "3.10") and extra == 'testing' +Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy" and python_version < "3.10") and extra == 'testing' + diff --git a/tests/repositories/fixtures/pypi.org/stubbed/hbmqtt-0.9.6.tar.gz b/tests/repositories/fixtures/pypi.org/stubbed/hbmqtt-0.9.6.tar.gz new file mode 100644 index 00000000000..dfba4043788 Binary files /dev/null and b/tests/repositories/fixtures/pypi.org/stubbed/hbmqtt-0.9.6.tar.gz differ diff --git a/tests/repositories/fixtures/pypi.py b/tests/repositories/fixtures/pypi.py index cf96a5ff714..d72577679f2 100644 --- a/tests/repositories/fixtures/pypi.py +++ b/tests/repositories/fixtures/pypi.py @@ -10,7 +10,6 @@ from poetry.repositories.pypi_repository import PyPiRepository from tests.helpers import FIXTURE_PATH_DISTRIBUTIONS -from tests.helpers import FIXTURE_PATH_REPOSITORIES from tests.helpers import FIXTURE_PATH_REPOSITORIES_PYPI @@ -36,19 +35,31 @@ def package_distribution_locations() -> list[Path]: return [ FIXTURE_PATH_REPOSITORIES_PYPI / "dists", + FIXTURE_PATH_REPOSITORIES_PYPI / "dists" / "mocked", FIXTURE_PATH_REPOSITORIES_PYPI / "stubbed", FIXTURE_PATH_DISTRIBUTIONS, ] @pytest.fixture -def package_metadata_path() -> Path | None: - return FIXTURE_PATH_REPOSITORIES / "metadata" +def package_json_locations() -> list[Path]: + return [ + FIXTURE_PATH_REPOSITORIES_PYPI / "json", + FIXTURE_PATH_REPOSITORIES_PYPI / "json" / "mocked", + ] + + +@pytest.fixture +def package_metadata_locations() -> list[Path]: + return [ + FIXTURE_PATH_REPOSITORIES_PYPI / "metadata", + FIXTURE_PATH_REPOSITORIES_PYPI / "metadata" / "mocked", + ] @pytest.fixture def package_distribution_lookup( - package_distribution_locations: list[Path], package_metadata_path: Path | None + package_distribution_locations: list[Path], ) -> PackageDistributionLookup: def lookup(name: str) -> Path | None: for location in package_distribution_locations: @@ -64,6 +75,7 @@ def lookup(name: str) -> Path | None: def pypi_repository( http: type[httpretty], legacy_repository_html_callback: HTTPrettyRequestCallback, + package_json_locations: list[Path], mock_files_python_hosted: None, ) -> PyPiRepository: def default_callback( @@ -84,6 +96,18 @@ def simple_callback( return json_callback(request, uri, headers) return legacy_repository_html_callback(request, uri, headers) + def _get_json_filepath(name: str, version: str | None = None) -> Path | None: + for base in package_json_locations: + if not version: + fixture = base / f"{name}.json" + else: + fixture = base / name / f"{version}.json" + + if fixture.exists(): + return fixture + + return None + def json_callback( request: HTTPrettyRequest, uri: str, headers: dict[str, Any] ) -> HTTPrettyResponse: @@ -91,13 +115,9 @@ def json_callback( parts = path.rstrip("/").split("/")[2:] name = parts[0] version = parts[1] if len(parts) == 3 else None - json_fixtures = FIXTURE_PATH_REPOSITORIES_PYPI / "json" - if not version: - fixture = json_fixtures / f"{name}.json" - else: - fixture = json_fixtures / name / (version + ".json") + fixture = _get_json_filepath(name, version) - if not fixture.exists(): + if fixture is None or not fixture.exists(): return default_callback(request, uri, headers) return 200, headers, fixture.read_bytes() diff --git a/tests/repositories/fixtures/python_hosted.py b/tests/repositories/fixtures/python_hosted.py index ebc4a7261f2..0bddf929a7b 100644 --- a/tests/repositories/fixtures/python_hosted.py +++ b/tests/repositories/fixtures/python_hosted.py @@ -24,18 +24,18 @@ @pytest.fixture def mock_files_python_hosted_factory(http: type[httpretty]) -> PythonHostedFileMocker: def factory( - distribution_locations: list[Path], metadata: Path | None = None + distribution_locations: list[Path], metadata_locations: list[Path] | None = None ) -> None: def file_callback( request: HTTPrettyRequest, uri: str, headers: dict[str, Any] ) -> list[int | dict[str, Any] | bytes | str]: name = Path(urlparse(uri).path).name - if metadata and name.endswith(".metadata"): - fixture = metadata / name - - if fixture.exists(): - return [200, headers, fixture.read_text()] + if metadata_locations and name.endswith(".metadata"): + for location in metadata_locations: + fixture = location / name + if fixture.exists(): + return [200, headers, fixture.read_text()] else: for location in distribution_locations: fixture = location / name @@ -44,12 +44,23 @@ def file_callback( return [404, headers, b"Not Found"] + def mock_file_callback( + request: HTTPrettyRequest, uri: str, headers: dict[str, Any] + ) -> list[int | dict[str, Any] | bytes | str]: + return [200, headers, b""] + http.register_uri( http.GET, re.compile("^https://files.pythonhosted.org/.*$"), body=file_callback, ) + http.register_uri( + http.GET, + re.compile("^https://mock.pythonhosted.org/.*$"), + body=mock_file_callback, + ) + return factory @@ -57,10 +68,10 @@ def file_callback( def mock_files_python_hosted( mock_files_python_hosted_factory: PythonHostedFileMocker, package_distribution_locations: list[Path], - package_metadata_path: Path | None, + package_metadata_locations: list[Path] | None, ) -> Iterator[None]: mock_files_python_hosted_factory( distribution_locations=package_distribution_locations, - metadata=package_metadata_path, + metadata_locations=package_metadata_locations, ) yield None diff --git a/tests/repositories/fixtures/single-page/mmcv_torch_releases.html b/tests/repositories/fixtures/single-page/mmcv_torch_releases.html new file mode 100644 index 00000000000..dff3ab240c3 --- /dev/null +++ b/tests/repositories/fixtures/single-page/mmcv_torch_releases.html @@ -0,0 +1,104 @@ +../torch1.12.0/mmcv-2.0.0-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.1-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.1-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.1-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.1-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.1-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.1-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.1-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.1-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.1.0-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.1.0-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.1.0-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.1.0-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.1.0-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.1.0-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.1.0-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.1.0-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp39-cp39-win_amd64.whl
diff --git a/tests/repositories/test_http_repository.py b/tests/repositories/test_http_repository.py index eb0de86819d..6d7fd667b02 100644 --- a/tests/repositories/test_http_repository.py +++ b/tests/repositories/test_http_repository.py @@ -1,5 +1,6 @@ from __future__ import annotations +import contextlib import shutil from pathlib import Path @@ -12,6 +13,7 @@ from packaging.metadata import parse_email from poetry.core.packages.utils.link import Link +from poetry.inspection.info import PackageInfoError from poetry.inspection.lazy_wheel import HTTPRangeRequestUnsupported from poetry.repositories.http_repository import HTTPRepository from poetry.utils.helpers import HTTPRangeRequestSupported @@ -116,13 +118,18 @@ def test_get_info_from_wheel_state_sequence(mocker: MockerFixture) -> None: # 1. range request and download mock_metadata_from_wheel_url.side_effect = HTTPRangeRequestUnsupported - repo._get_info_from_wheel(link) + + with contextlib.suppress(PackageInfoError): + repo._get_info_from_wheel(link) + assert mock_metadata_from_wheel_url.call_count == 1 assert mock_download.call_count == 1 assert mock_download.call_args[1]["raise_accepts_ranges"] is False # 2. only download - repo._get_info_from_wheel(link) + with contextlib.suppress(PackageInfoError): + repo._get_info_from_wheel(link) + assert mock_metadata_from_wheel_url.call_count == 1 assert mock_download.call_count == 2 assert mock_download.call_args[1]["raise_accepts_ranges"] is True @@ -130,26 +137,105 @@ def test_get_info_from_wheel_state_sequence(mocker: MockerFixture) -> None: # 3. download and range request mock_metadata_from_wheel_url.side_effect = None mock_download.side_effect = HTTPRangeRequestSupported - repo._get_info_from_wheel(link) + + with contextlib.suppress(PackageInfoError): + repo._get_info_from_wheel(link) + assert mock_metadata_from_wheel_url.call_count == 2 assert mock_download.call_count == 3 assert mock_download.call_args[1]["raise_accepts_ranges"] is True # 4. only range request - repo._get_info_from_wheel(link) + with contextlib.suppress(PackageInfoError): + repo._get_info_from_wheel(link) + assert mock_metadata_from_wheel_url.call_count == 3 assert mock_download.call_count == 3 # 5. range request and download mock_metadata_from_wheel_url.side_effect = HTTPRangeRequestUnsupported mock_download.side_effect = None - repo._get_info_from_wheel(link) + + with contextlib.suppress(PackageInfoError): + repo._get_info_from_wheel(link) + assert mock_metadata_from_wheel_url.call_count == 4 assert mock_download.call_count == 4 assert mock_download.call_args[1]["raise_accepts_ranges"] is False # 6. only range request mock_metadata_from_wheel_url.side_effect = None - repo._get_info_from_wheel(link) + + with contextlib.suppress(PackageInfoError): + repo._get_info_from_wheel(link) + assert mock_metadata_from_wheel_url.call_count == 5 assert mock_download.call_count == 4 + + +@pytest.mark.parametrize( + "mock_hashes", + [ + None, + {"sha256": "e216b70f013c47b82a72540d34347632c5bfe59fd54f5fe5d51f6a68b19aaf84"}, + {"md5": "be7589b4902793e66d7d979bd8581591"}, + ], +) +def test_calculate_sha256( + mocker: MockerFixture, mock_hashes: dict[str, Any] | None +) -> None: + filename = "poetry_core-1.5.0-py3-none-any.whl" + filepath = MockRepository.DIST_FIXTURES / filename + mock_download = mocker.patch( + "poetry.repositories.http_repository.download_file", + side_effect=lambda _, dest, *args, **kwargs: shutil.copy(filepath, dest), + ) + domain = "foo.com" + link = Link(f"https://{domain}/{filename}", hashes=mock_hashes) + repo = MockRepository() + + calculated_hash = repo.calculate_sha256(link) + + assert mock_download.call_count == 1 + assert ( + calculated_hash + == "sha256:e216b70f013c47b82a72540d34347632c5bfe59fd54f5fe5d51f6a68b19aaf84" + ) + + +def test_calculate_sha256_defaults_to_sha256_on_md5_errors( + mocker: MockerFixture, +) -> None: + raised_value_error = False + + def mock_hashlib_md5_error() -> None: + nonlocal raised_value_error + raised_value_error = True + raise ValueError( + "[digital envelope routines: EVP_DigestInit_ex] disabled for FIPS" + ) + + filename = "poetry_core-1.5.0-py3-none-any.whl" + filepath = MockRepository.DIST_FIXTURES / filename + mock_download = mocker.patch( + "poetry.repositories.http_repository.download_file", + side_effect=lambda _, dest, *args, **kwargs: shutil.copy(filepath, dest), + ) + mock_hashlib_md5 = mocker.patch("hashlib.md5", side_effect=mock_hashlib_md5_error) + + domain = "foo.com" + link = Link( + f"https://{domain}/{filename}", + hashes={"md5": "be7589b4902793e66d7d979bd8581591"}, + ) + repo = MockRepository() + + calculated_hash = repo.calculate_sha256(link) + + assert raised_value_error + assert mock_download.call_count == 1 + assert mock_hashlib_md5.call_count == 1 + assert ( + calculated_hash + == "sha256:e216b70f013c47b82a72540d34347632c5bfe59fd54f5fe5d51f6a68b19aaf84" + ) diff --git a/tests/repositories/test_installed_repository.py b/tests/repositories/test_installed_repository.py index 24a2f12f013..88c9a373abf 100644 --- a/tests/repositories/test_installed_repository.py +++ b/tests/repositories/test_installed_repository.py @@ -335,7 +335,7 @@ def test_load_pep_610_compliant_url_packages(repository: InstalledRepository) -> assert package.source_type == "url" assert ( package.source_url - == "https://python-poetry.org/distributions/url-pep-610-1.2.3.tar.gz" + == "https://mock.pythonhosted.org/distributions/url-pep-610-1.2.3.tar.gz" ) diff --git a/tests/repositories/test_legacy_repository.py b/tests/repositories/test_legacy_repository.py index 0d9f304f7c1..f4d955fbae6 100644 --- a/tests/repositories/test_legacy_repository.py +++ b/tests/repositories/test_legacy_repository.py @@ -592,7 +592,7 @@ def get_mock( monkeypatch.setattr(repo.session, "get", get_mock) page = repo.get_page("foo") assert page is not None - assert page._url == "http://legacy.redirect.bar/foo/" + assert page._url == "http://legacy.redirect.bar/foo" @pytest.mark.parametrize( diff --git a/tests/repositories/test_pypi_repository.py b/tests/repositories/test_pypi_repository.py index 27ffa793ea4..91c8a03eadc 100644 --- a/tests/repositories/test_pypi_repository.py +++ b/tests/repositories/test_pypi_repository.py @@ -28,7 +28,7 @@ def _use_simple_keyring(with_simple_keyring: None) -> None: def test_find_packages(pypi_repository: PyPiRepository) -> None: repo = pypi_repository - packages = repo.find_packages(Factory.create_dependency("requests", "^2.18")) + packages = repo.find_packages(Factory.create_dependency("requests", "~2.18.0")) assert len(packages) == 5 @@ -37,7 +37,7 @@ def test_find_packages_with_prereleases(pypi_repository: PyPiRepository) -> None repo = pypi_repository packages = repo.find_packages(Factory.create_dependency("toga", ">=0.3.0.dev2")) - assert len(packages) == 7 + assert len(packages) == 2 def test_find_packages_does_not_select_prereleases_if_not_allowed( @@ -104,8 +104,7 @@ def test_package( f"{package.name}-{package.version}.tar.gz", ] ] - - win_inet = package.extras[canonicalize_name("socks")][0] + win_inet = package.extras[canonicalize_name("socks")][1] assert win_inet.name == "win-inet-pton" assert win_inet.python_versions == "~2.7 || ~2.6" @@ -240,37 +239,11 @@ def test_fallback_pep_658_metadata( assert dep.python_versions == "~2.7" -def test_fallback_can_read_setup_to_get_dependencies( - pypi_repository: PyPiRepository, -) -> None: - repo = pypi_repository - repo._fallback = True - - package = repo.package("sqlalchemy", Version.parse("1.2.12")) - - assert package.name == "sqlalchemy" - assert len(package.requires) == 9 - assert len([r for r in package.requires if r.is_optional()]) == 9 - - assert package.extras == { - "mssql-pymssql": [Dependency("pymssql", "*")], - "mssql-pyodbc": [Dependency("pyodbc", "*")], - "mysql": [Dependency("mysqlclient", "*")], - "oracle": [Dependency("cx_oracle", "*")], - "postgresql": [Dependency("psycopg2", "*")], - "postgresql-pg8000": [Dependency("pg8000", "*")], - "postgresql-psycopg2binary": [Dependency("psycopg2-binary", "*")], - "postgresql-psycopg2cffi": [Dependency("psycopg2cffi", "*")], - "pymysql": [Dependency("pymysql", "*")], - } - - def test_pypi_repository_supports_reading_bz2_files( pypi_repository: PyPiRepository, ) -> None: repo = pypi_repository repo._fallback = True - package = repo.package("twisted", Version.parse("18.9.0")) assert package.name == "twisted" @@ -314,7 +287,9 @@ def test_invalid_versions_ignored(pypi_repository: PyPiRepository) -> None: # the json metadata for this package contains one malformed version # and a correct one. - packages = repo.find_packages(Factory.create_dependency("pygame-music-grid", "*")) + packages = repo.find_packages( + Factory.create_dependency("invalid-version-package", "*") + ) assert len(packages) == 1 diff --git a/tests/repositories/test_single_page_repository.py b/tests/repositories/test_single_page_repository.py index bbe3002c8e7..05789690874 100644 --- a/tests/repositories/test_single_page_repository.py +++ b/tests/repositories/test_single_page_repository.py @@ -8,7 +8,7 @@ from poetry.core.packages.dependency import Dependency from poetry.repositories.exceptions import PackageNotFound -from poetry.repositories.link_sources.html import SimpleRepositoryPage +from poetry.repositories.link_sources.html import HTMLPage from poetry.repositories.single_page_repository import SinglePageRepository @@ -22,18 +22,18 @@ class MockSinglePageRepository(SinglePageRepository): def __init__(self, page: str) -> None: super().__init__( "single-page", - url=f"http://single-page.foo.bar/{page}.html", + url=f"http://single-page.foo.bar/single/page/repo/{page}.html", disable_cache=True, ) self._lazy_wheel = False - def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage: + def _get_page(self, name: NormalizedName) -> HTMLPage: fixture = self.FIXTURES / self.url.rsplit("/", 1)[-1] if not fixture.exists(): raise PackageNotFound(f"Package [{name}] not found.") with fixture.open(encoding="utf-8") as f: - return SimpleRepositoryPage(self._url, f.read()) + return HTMLPage(self._url, f.read()) def _download( self, url: str, dest: Path, *, raise_accepts_ranges: bool = False @@ -67,3 +67,13 @@ def test_single_page_repository_find_packages() -> None: package = packages[0] assert package.name == dep.name assert package.to_dependency().to_pep_508() == dep.to_pep_508() + + +def test_single_page_repository_get_page_with_relative_links() -> None: + repo = MockSinglePageRepository("mmcv_torch_releases") + + base_path = Path("/single/page/torch1.12.0") + page = repo.get_page("mmcv") + for link in page.links: + path = Path(link.path) + assert path.parent == base_path diff --git a/tests/types.py b/tests/types.py index 29558ea6626..c334664af30 100644 --- a/tests/types.py +++ b/tests/types.py @@ -94,7 +94,9 @@ def __call__( class PythonHostedFileMocker(Protocol): def __call__( - self, distribution_locations: list[Path], metadata: Path | None = None + self, + distribution_locations: list[Path], + metadata_locations: list[Path] | None = None, ) -> None: ... diff --git a/tests/utils/env/test_env.py b/tests/utils/env/test_env.py index d631e151156..e3ee2f2c473 100644 --- a/tests/utils/env/test_env.py +++ b/tests/utils/env/test_env.py @@ -24,13 +24,17 @@ from poetry.utils.env import SystemEnv from poetry.utils.env import VirtualEnv from poetry.utils.env import build_environment +from poetry.utils.env import ephemeral_environment if TYPE_CHECKING: + from typing import Iterator + from pytest_mock import MockerFixture from poetry.poetry import Poetry from tests.types import FixtureDirGetter + from tests.types import SetProjectContext MINIMAL_SCRIPT = """\ @@ -463,35 +467,29 @@ def test_env_finds_fallback_executables_for_generic_env( @pytest.fixture -def extended_without_setup_poetry(fixture_dir: FixtureDirGetter) -> Poetry: - poetry = Factory().create_poetry(fixture_dir("extended_project_without_setup")) - - return poetry +def extended_without_setup_poetry( + fixture_dir: FixtureDirGetter, set_project_context: SetProjectContext +) -> Iterator[Poetry]: + with set_project_context("extended_project_without_setup") as cwd: + yield Factory().create_poetry(cwd) def test_build_environment_called_build_script_specified( - mocker: MockerFixture, extended_without_setup_poetry: Poetry, tmp_path: Path + mocker: MockerFixture, + extended_without_setup_poetry: Poetry, ) -> None: - project_env = MockEnv(path=tmp_path / "project") - ephemeral_env = MockEnv(path=tmp_path / "ephemeral") + patched_install = mocker.patch("poetry.utils.isolated_build.IsolatedEnv.install") - mocker.patch( - "poetry.utils.env.ephemeral_environment" - ).return_value.__enter__.return_value = ephemeral_env + with ephemeral_environment() as project_env: + import poetry.utils.env + + spy = mocker.spy(poetry.utils.env, "ephemeral_environment") + + with build_environment(extended_without_setup_poetry, project_env): + assert patched_install.call_count == 1 + assert patched_install.call_args == mocker.call(["poetry-core", "cython"]) - with build_environment(extended_without_setup_poetry, project_env) as env: - assert env == ephemeral_env - assert env.executed == [ # type: ignore[attr-defined] - [ - str(sys.executable), - str(env.pip_embedded), - "install", - "--disable-pip-version-check", - "--ignore-installed", - "--no-input", - *extended_without_setup_poetry.pyproject.build_system.requires, - ] - ] + assert spy.call_count == 1 def test_build_environment_not_called_without_build_script_specified( diff --git a/tests/utils/env/test_system_env.py b/tests/utils/env/test_system_env.py new file mode 100644 index 00000000000..4e71a2c595c --- /dev/null +++ b/tests/utils/env/test_system_env.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +import sys + +from pathlib import Path +from typing import TYPE_CHECKING + +from poetry.utils.env import SystemEnv + + +if TYPE_CHECKING: + from pytest_mock import MockerFixture + + +def test_get_marker_env_untagged_cpython(mocker: MockerFixture) -> None: + mocker.patch("platform.python_version", return_value="3.11.9+") + env = SystemEnv(Path(sys.prefix)) + marker_env = env.get_marker_env() + assert marker_env["python_full_version"] == "3.11.9" diff --git a/tests/utils/test_cache.py b/tests/utils/test_cache.py index 1ae518baa00..05e5e9b636a 100644 --- a/tests/utils/test_cache.py +++ b/tests/utils/test_cache.py @@ -177,12 +177,12 @@ def test_detect_corrupted_cache_key_file( def test_get_cache_directory_for_link(tmp_path: Path) -> None: cache = ArtifactCache(cache_dir=tmp_path) directory = cache.get_cache_directory_for_link( - Link("https://files.python-poetry.org/poetry-1.1.0.tar.gz") + Link("https://files.pythonhosted.org/poetry-1.1.0.tar.gz") ) expected = Path( - f"{tmp_path.as_posix()}/11/4f/a8/" - "1c89d75547e4967082d30a28360401c82c83b964ddacee292201bf85f2" + f"{tmp_path.as_posix()}/41/9c/6e/" + "ef83f08fcf4dac7cd78d843e7974d601a19c90e4bb90bb76b4a7a61548" ) assert directory == expected @@ -225,7 +225,7 @@ def test_get_cached_archives(fixture_dir: FixtureDirGetter) -> None: ("link", "strict", "available_packages"), [ ( - "https://files.python-poetry.org/demo-0.1.0.tar.gz", + "https://files.pythonhosted.org/demo-0.1.0.tar.gz", True, [ Path("/cache/demo-0.1.0-py2.py3-none-any"), @@ -271,7 +271,7 @@ def test_get_not_found_cached_archive_for_link( ("link", "cached", "strict"), [ ( - "https://files.python-poetry.org/demo-0.1.0.tar.gz", + "https://files.pythonhosted.org/demo-0.1.0.tar.gz", "/cache/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl", False, ), @@ -281,7 +281,7 @@ def test_get_not_found_cached_archive_for_link( False, ), ( - "https://files.python-poetry.org/demo-0.1.0.tar.gz", + "https://files.pythonhosted.org/demo-0.1.0.tar.gz", "/cache/demo-0.1.0.tar.gz", True, ), @@ -328,7 +328,7 @@ def test_get_cached_archive_for_link_no_race_condition( tmp_path: Path, mocker: MockerFixture ) -> None: cache = ArtifactCache(cache_dir=tmp_path) - link = Link("https://files.python-poetry.org/demo-0.1.0.tar.gz") + link = Link("https://files.pythonhosted.org/demo-0.1.0.tar.gz") def replace_file(_: str, dest: Path) -> None: dest.unlink(missing_ok=True) diff --git a/tests/utils/test_dependency_specification.py b/tests/utils/test_dependency_specification.py index 0246c85310a..24c9c710bd3 100644 --- a/tests/utils/test_dependency_specification.py +++ b/tests/utils/test_dependency_specification.py @@ -7,6 +7,7 @@ from deepdiff import DeepDiff +from poetry.inspection.info import PackageInfo from poetry.utils.dependency_specification import RequirementsParser @@ -79,11 +80,11 @@ ("../demo", ({"name": "demo", "path": "../demo"},)), ("../demo/demo.whl", ({"name": "demo", "path": "../demo/demo.whl"},)), ( - "https://example.com/distributions/demo-0.1.0.tar.gz", + "https://files.pythonhosted.org/distributions/demo-0.1.0.tar.gz", ( { "name": "demo", - "url": "https://example.com/distributions/demo-0.1.0.tar.gz", + "url": "https://files.pythonhosted.org/distributions/demo-0.1.0.tar.gz", }, ), ), @@ -167,6 +168,8 @@ def test_parse_dependency_specification( ) -> None: original = Path.exists + # Parsing file and path dependencies reads metadata from the file or path in + # question: for these tests we mock that out. def _mock(self: Path) -> bool: if "/" in requirement and self == Path.cwd().joinpath(requirement): return True @@ -174,6 +177,11 @@ def _mock(self: Path) -> bool: mocker.patch("pathlib.Path.exists", _mock) + mocker.patch( + "poetry.inspection.info.get_pep517_metadata", + return_value=PackageInfo(name="demo", version="0.1.2"), + ) + assert any( not DeepDiff( RequirementsParser(artifact_cache=artifact_cache).parse(requirement), diff --git a/tests/utils/test_helpers.py b/tests/utils/test_helpers.py index 2399e298552..884db33b903 100644 --- a/tests/utils/test_helpers.py +++ b/tests/utils/test_helpers.py @@ -1,5 +1,8 @@ from __future__ import annotations +import base64 +import re + from typing import TYPE_CHECKING from typing import Any @@ -7,6 +10,7 @@ from poetry.core.utils.helpers import parse_requires +from poetry.utils.helpers import Downloader from poetry.utils.helpers import HTTPRangeRequestSupported from poetry.utils.helpers import download_file from poetry.utils.helpers import get_file_hash @@ -19,6 +23,7 @@ from httpretty import httpretty from httpretty.core import HTTPrettyRequest + from tests.conftest import Config from tests.types import FixtureDirGetter @@ -188,3 +193,35 @@ def handle_request( else: download_file(url, dest, raise_accepts_ranges=raise_accepts_ranges) assert dest.is_file() + + +def test_downloader_uses_authenticator_by_default( + config: Config, + http: type[httpretty], + tmp_working_directory: Path, +) -> None: + import poetry.utils.authenticator + + # force set default authenticator to None so that it is recreated using patched config + poetry.utils.authenticator._authenticator = None + + config.merge( + { + "repositories": {"foo": {"url": "https://foo.bar/files/"}}, + "http-basic": {"foo": {"username": "bar", "password": "baz"}}, + } + ) + + http.register_uri( + http.GET, + re.compile("^https?://foo.bar/(.+?)$"), + ) + + Downloader( + "https://foo.bar/files/foo-0.1.0.tar.gz", + tmp_working_directory / "foo-0.1.0.tar.gz", + ) + + request = http.last_request() + basic_auth = base64.b64encode(b"bar:baz").decode() + assert request.headers["Authorization"] == f"Basic {basic_auth}" diff --git a/tests/utils/test_isolated_build.py b/tests/utils/test_isolated_build.py new file mode 100644 index 00000000000..044dac1404e --- /dev/null +++ b/tests/utils/test_isolated_build.py @@ -0,0 +1,97 @@ +from __future__ import annotations + +import shutil +import sys + +from pathlib import Path +from typing import TYPE_CHECKING + +import pytest + +from poetry.factory import Factory +from poetry.puzzle.exceptions import SolverProblemError +from poetry.puzzle.provider import IncompatibleConstraintsError +from poetry.repositories import RepositoryPool +from poetry.repositories.installed_repository import InstalledRepository +from poetry.utils.env import ephemeral_environment +from poetry.utils.isolated_build import IsolatedBuildInstallError +from poetry.utils.isolated_build import IsolatedEnv +from poetry.utils.isolated_build import isolated_builder +from tests.helpers import get_dependency + + +if TYPE_CHECKING: + from collections.abc import Collection + + from pytest_mock import MockerFixture + + from poetry.repositories.pypi_repository import PyPiRepository + from tests.types import FixtureDirGetter + + +@pytest.fixture() +def pool(pypi_repository: PyPiRepository) -> RepositoryPool: + pool = RepositoryPool() + + pool.add_repository(pypi_repository) + + return pool + + +@pytest.fixture(autouse=True) +def setup(mocker: MockerFixture, pool: RepositoryPool) -> None: + mocker.patch.object(Factory, "create_pool", return_value=pool) + + +def test_isolated_env_install_success(pool: RepositoryPool) -> None: + with ephemeral_environment(Path(sys.executable)) as venv: + env = IsolatedEnv(venv, pool) + assert not InstalledRepository.load(venv).find_packages( + get_dependency("poetry-core") + ) + + env.install({"poetry-core"}) + assert InstalledRepository.load(venv).find_packages( + get_dependency("poetry-core") + ) + + +@pytest.mark.parametrize( + ("requirements", "exception"), + [ + ({"poetry-core==1.5.0", "poetry-core==1.6.0"}, IncompatibleConstraintsError), + ({"black==19.10b0", "attrs==17.4.0"}, SolverProblemError), + ], +) +def test_isolated_env_install_error( + requirements: Collection[str], exception: type[Exception], pool: RepositoryPool +) -> None: + with ephemeral_environment(Path(sys.executable)) as venv: + env = IsolatedEnv(venv, pool) + with pytest.raises(exception): + env.install(requirements) + + +def test_isolated_env_install_failure( + pool: RepositoryPool, mocker: MockerFixture +) -> None: + mocker.patch("poetry.installation.installer.Installer.run", return_value=1) + with ephemeral_environment(Path(sys.executable)) as venv: + env = IsolatedEnv(venv, pool) + with pytest.raises(IsolatedBuildInstallError) as e: + env.install({"a", "b>1"}) + assert e.value.requirements == {"a", "b>1"} + + +def test_isolated_builder_outside_poetry_project_context( + tmp_working_directory: Path, fixture_dir: FixtureDirGetter +) -> None: + source = tmp_working_directory / "source" + shutil.copytree(fixture_dir("project_with_setup"), source) + destination = tmp_working_directory / "dist" + + try: + with isolated_builder(source, "wheel") as builder: + builder.metadata_path(destination) + except RuntimeError: + pytest.fail("Isolated builder did not fallback to default repository pool") diff --git a/tests/utils/test_patterns.py b/tests/utils/test_patterns.py index 87abb287219..f3df7d52be6 100644 --- a/tests/utils/test_patterns.py +++ b/tests/utils/test_patterns.py @@ -40,3 +40,34 @@ def test_wheel_file_re(filename: str, expected: dict[str, str | None]) -> None: groups = match.groupdict() assert groups == expected + + +@pytest.mark.parametrize( + ["filename", "expected"], + [ + ( + "poetry_core-1.5.0.tar.gz", + { + "namever": "poetry_core-1.5.0", + "name": "poetry_core", + "ver": "1.5.0", + "format": "tar.gz", + }, + ), + ( + "flask-restful-swagger-2-0.35.tar.gz", + { + "namever": "flask-restful-swagger-2-0.35", + "name": "flask-restful-swagger-2", + "ver": "0.35", + "format": "tar.gz", + }, + ), + ], +) +def test_sdist_file_re(filename: str, expected: dict[str, str | None]) -> None: + match = patterns.sdist_file_re.match(filename) + assert match is not None + groups = match.groupdict() + + assert groups == expected diff --git a/tests/utils/test_setup_reader.py b/tests/utils/test_setup_reader.py deleted file mode 100644 index 444debfbf16..00000000000 --- a/tests/utils/test_setup_reader.py +++ /dev/null @@ -1,245 +0,0 @@ -from __future__ import annotations - -from pathlib import Path -from typing import TYPE_CHECKING - -import pytest - -from poetry.core.version.exceptions import InvalidVersion - -from poetry.utils.setup_reader import SetupReader - - -if TYPE_CHECKING: - from collections.abc import Callable - - -@pytest.fixture() -def setup() -> Callable[[str], Path]: - def _setup(name: str) -> Path: - return Path(__file__).parent / "fixtures" / "setups" / name - - return _setup - - -def test_setup_reader_read_minimal_setup_py(setup: Callable[[str], Path]) -> None: - result = SetupReader.read_from_directory(setup("minimal")) - - expected_name = None - expected_version = None - expected_description = None - expected_install_requires: list[str] = [] - expected_extras_require: dict[str, list[str]] = {} - expected_python_requires = None - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] == expected_python_requires - - -def test_setup_reader_read_first_level_setup_call_with_direct_types( - setup: Callable[[str], Path], -) -> None: - result = SetupReader.read_from_directory(setup("flask")) - - expected_name = "Flask" - expected_version = None - expected_description = "A simple framework for building complex web applications." - expected_install_requires = [ - "Werkzeug>=0.14", - "Jinja2>=2.10", - "itsdangerous>=0.24", - "click>=5.1", - ] - expected_extras_require = { - "dotenv": ["python-dotenv"], - "dev": [ - "pytest>=3", - "coverage", - "tox", - "sphinx", - "pallets-sphinx-themes", - "sphinxcontrib-log-cabinet", - ], - "docs": ["sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet"], - } - expected_python_requires = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] == expected_python_requires - - -def test_setup_reader_read_first_level_setup_call_with_variables( - setup: Callable[[str], Path], -) -> None: - result = SetupReader.read_from_directory(setup("requests")) - - expected_name = None - expected_version = None - expected_description = None - expected_install_requires = [ - "chardet>=3.0.2,<3.1.0", - "idna>=2.5,<2.8", - "urllib3>=1.21.1,<1.25", - "certifi>=2017.4.17", - ] - expected_extras_require = { - "security": ["pyOpenSSL >= 0.14", "cryptography>=1.3.4", "idna>=2.0.0"], - "socks": ["PySocks>=1.5.6, !=1.5.7"], - 'socks:sys_platform == "win32" and python_version == "2.7"': ["win_inet_pton"], - } - expected_python_requires = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] == expected_python_requires - - -def test_setup_reader_read_sub_level_setup_call_with_direct_types( - setup: Callable[[str], Path], -) -> None: - result = SetupReader.read_from_directory(setup("sqlalchemy")) - - expected_name = "SQLAlchemy" - expected_version = None - expected_description = "Database Abstraction Library" - expected_install_requires: list[str] = [] - expected_extras_require = { - "mysql": ["mysqlclient"], - "pymysql": ["pymysql"], - "postgresql": ["psycopg2"], - "postgresql_pg8000": ["pg8000"], - "postgresql_psycopg2cffi": ["psycopg2cffi"], - "oracle": ["cx_oracle"], - "mssql_pyodbc": ["pyodbc"], - "mssql_pymssql": ["pymssql"], - } - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] is None - - -def test_setup_reader_read_setup_cfg(setup: Callable[[str], Path]) -> None: - result = SetupReader.read_from_directory(setup("with-setup-cfg")) - - expected_name = "with-setup-cfg" - expected_version = "1.2.3" - expected_description = "Package with setup.cfg" - expected_install_requires = ["six", "tomlkit"] - expected_extras_require = { - "validation": ["cerberus"], - "tests": ["pytest", "pytest-xdist", "pytest-cov"], - } - expected_python_requires = ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3" - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] == expected_python_requires - - -def test_setup_reader_read_minimal_setup_cfg(setup: Callable[[str], Path]) -> None: - result = SetupReader.read_from_directory(setup("with-setup-cfg-minimal")) - - expected_name = None - expected_version = None - expected_description = None - expected_install_requires: list[str] = [] - expected_extras_require: dict[str, list[str]] = {} - expected_python_requires = None - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] == expected_python_requires - - -def test_setup_reader_read_setup_cfg_with_attr(setup: Callable[[str], Path]) -> None: - with pytest.raises(InvalidVersion): - SetupReader.read_from_directory(setup("with-setup-cfg-attr")) - - -def test_setup_reader_read_setup_kwargs(setup: Callable[[str], Path]) -> None: - result = SetupReader.read_from_directory(setup("pendulum")) - - expected_name = "pendulum" - expected_version = "2.0.4" - expected_description = "Python datetimes made easy" - expected_install_requires = ["python-dateutil>=2.6,<3.0", "pytzdata>=2018.3"] - expected_extras_require = {':python_version < "3.5"': ["typing>=3.6,<4.0"]} - expected_python_requires = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] == expected_python_requires - - -def test_setup_reader_read_setup_call_in_main(setup: Callable[[str], Path]) -> None: - result = SetupReader.read_from_directory(setup("pyyaml")) - - expected_name = "PyYAML" - expected_version = "3.13" - expected_description = "YAML parser and emitter for Python" - expected_install_requires: list[str] = [] - expected_extras_require: dict[str, list[str]] = {} - expected_python_requires = None - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] == expected_python_requires - - -def test_setup_reader_read_extras_require_with_variables( - setup: Callable[[str], Path], -) -> None: - result = SetupReader.read_from_directory(setup("extras_require_with_vars")) - - expected_name = "extras_require_with_vars" - expected_version = "0.0.1" - expected_description = "test setup_reader.py" - expected_install_requires: list[str] = [] - expected_extras_require = {"test": ["pytest"]} - expected_python_requires = None - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description - assert result["install_requires"] == expected_install_requires - assert result["extras_require"] == expected_extras_require - assert result["python_requires"] == expected_python_requires - - -def test_setup_reader_setuptools(setup: Callable[[str], Path]) -> None: - result = SetupReader.read_from_directory(setup("setuptools_setup")) - - expected_name = "my_package" - expected_version = "0.1.2" - expected_description = "Just a description" - - assert result["name"] == expected_name - assert result["version"] == expected_version - assert result["description"] == expected_description diff --git a/tests/vcs/git/test_backend.py b/tests/vcs/git/test_backend.py index cd9a7c5e781..dce587fd330 100644 --- a/tests/vcs/git/test_backend.py +++ b/tests/vcs/git/test_backend.py @@ -1,5 +1,8 @@ from __future__ import annotations +import pytest + +from poetry.vcs.git.backend import Git from poetry.vcs.git.backend import is_revision_sha @@ -24,3 +27,17 @@ def test_invalid_revision_sha_min_len() -> None: def test_invalid_revision_sha_max_len() -> None: result = is_revision_sha(VALID_SHA + "42") assert result is False + + +@pytest.mark.parametrize( + ("url"), + [ + "git@github.com:python-poetry/poetry.git", + "https://github.com/python-poetry/poetry.git", + "https://github.com/python-poetry/poetry", + "https://github.com/python-poetry/poetry/", + ], +) +def test_get_name_from_source_url(url: str) -> None: + name = Git.get_name_from_source_url(url) + assert name == "poetry"