You've already forked setup-python
							
							
				mirror of
				https://github.com/actions/setup-python.git
				synced 2025-11-04 08:46:41 +07:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			tiwarishub
			...
			releases/v
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e9aba2c848 | |||
| 75f3110429 | 
							
								
								
									
										4
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							@ -23,10 +23,10 @@ jobs:
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
 | 
			
		||||
      - name: Set Node.js 16.x
 | 
			
		||||
      - name: Set Node.js 12.x
 | 
			
		||||
        uses: actions/setup-node@v1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version: 16.x
 | 
			
		||||
          node-version: 12.x
 | 
			
		||||
 | 
			
		||||
      - name: Install dependencies
 | 
			
		||||
        run: npm ci
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							@ -2,7 +2,6 @@ name: "Code scanning - action"
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [ 'main' ]
 | 
			
		||||
  pull_request:
 | 
			
		||||
  schedule:
 | 
			
		||||
    - cron: '25 3 * * 5'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										60
									
								
								.github/workflows/e2e-cache.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								.github/workflows/e2e-cache.yml
									
									
									
									
										vendored
									
									
								
							@ -23,7 +23,7 @@ jobs:
 | 
			
		||||
        os: [ubuntu-latest, windows-latest, macos-latest]
 | 
			
		||||
        python-version: ['3.9', 'pypy-3.7-v7.x']
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - name: Setup Python
 | 
			
		||||
        uses: ./
 | 
			
		||||
        with:
 | 
			
		||||
@ -39,40 +39,26 @@ jobs:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: [ubuntu-latest, windows-latest, macos-latest]
 | 
			
		||||
        python-version: ['3.9', 'pypy-3.7-v7.x']
 | 
			
		||||
        python-version: ['3.9', 'pypy-3.9-v7.x']
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - name: Setup Python
 | 
			
		||||
        uses: ./
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: ${{ matrix.python-version }}
 | 
			
		||||
          cache: 'pipenv'
 | 
			
		||||
      - name: Install pipenv
 | 
			
		||||
        run: pipx install pipenv
 | 
			
		||||
        run: curl https://raw.githubusercontent.com/pypa/pipenv/main/get-pipenv.py | python
 | 
			
		||||
      - name: Install dependencies
 | 
			
		||||
        run: pipenv install numpy
 | 
			
		||||
 | 
			
		||||
  python-poetry-dependencies-caching:
 | 
			
		||||
    name: Test poetry (Python ${{ matrix.python-version}}, ${{ matrix.os }})
 | 
			
		||||
    runs-on: ${{ matrix.os }}
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: [ubuntu-latest, windows-latest, macos-latest]
 | 
			
		||||
        python-version: ['3.9', 'pypy-3.7-v7.x']
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - name: Install poetry
 | 
			
		||||
        run: pipx install poetry
 | 
			
		||||
      - name: Setup Python
 | 
			
		||||
        uses: ./
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: ${{ matrix.python-version }}
 | 
			
		||||
          cache: 'poetry'
 | 
			
		||||
      - name: Init pyproject.toml
 | 
			
		||||
        run: poetry init -n
 | 
			
		||||
      - name: Install dependencies
 | 
			
		||||
        run: poetry add flake8
 | 
			
		||||
        shell: pwsh
 | 
			
		||||
        run: |
 | 
			
		||||
          mv ./__tests__/data/Pipfile.lock .
 | 
			
		||||
          mv ./__tests__/data/Pipfile .
 | 
			
		||||
          if ("${{ matrix.python-version }}" -Match "pypy") {
 | 
			
		||||
            pipenv install --keep-outdated --python pypy
 | 
			
		||||
          } else {
 | 
			
		||||
            pipenv install --keep-outdated --python ${{ matrix.python-version }}
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
  python-pip-dependencies-caching-path:
 | 
			
		||||
    name: Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }})
 | 
			
		||||
@ -83,7 +69,7 @@ jobs:
 | 
			
		||||
        os: [ubuntu-latest, windows-latest, macos-latest]
 | 
			
		||||
        python-version: ['3.9', 'pypy-3.7-v7.x']
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - name: Setup Python
 | 
			
		||||
        uses: ./
 | 
			
		||||
        with:
 | 
			
		||||
@ -100,16 +86,24 @@ jobs:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: [ubuntu-latest, windows-latest, macos-latest]
 | 
			
		||||
        python-version: ['3.9', 'pypy-3.7-v7.x']
 | 
			
		||||
        python-version: ['3.9', 'pypy-3.9-v7.x']
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - name: Setup Python
 | 
			
		||||
        uses: ./
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: ${{ matrix.python-version }}
 | 
			
		||||
          cache: 'pipenv'
 | 
			
		||||
          cache-dependency-path: '**/requirements-linux.txt'
 | 
			
		||||
          cache-dependency-path: '**/pipenv-requirements.txt'
 | 
			
		||||
      - name: Install pipenv
 | 
			
		||||
        run: pipx install pipenv
 | 
			
		||||
        run: curl https://raw.githubusercontent.com/pypa/pipenv/main/get-pipenv.py | python
 | 
			
		||||
      - name: Install dependencies
 | 
			
		||||
        run: pipenv install numpy
 | 
			
		||||
        shell: pwsh
 | 
			
		||||
        run: |
 | 
			
		||||
          mv ./__tests__/data/Pipfile.lock .
 | 
			
		||||
          mv ./__tests__/data/Pipfile .
 | 
			
		||||
          if ("${{ matrix.python-version }}" -Match "pypy") {
 | 
			
		||||
            pipenv install --keep-outdated --python pypy
 | 
			
		||||
          } else {
 | 
			
		||||
            pipenv install --keep-outdated --python ${{ matrix.python-version }}
 | 
			
		||||
          }
 | 
			
		||||
							
								
								
									
										6
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							@ -14,15 +14,15 @@ jobs:
 | 
			
		||||
    name: Check licenses
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - name: Set Node.js 16.x
 | 
			
		||||
      - name: Set Node.js 12.x
 | 
			
		||||
        uses: actions/setup-node@v2
 | 
			
		||||
        with:
 | 
			
		||||
          node-version: 16.x
 | 
			
		||||
          node-version: 12.x
 | 
			
		||||
      - run: npm ci
 | 
			
		||||
      - name: Install licensed
 | 
			
		||||
        run: |
 | 
			
		||||
          cd $RUNNER_TEMP
 | 
			
		||||
          curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/3.4.4/licensed-3.4.4-linux-x64.tar.gz
 | 
			
		||||
          curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/3.3.1/licensed-3.3.1-linux-x64.tar.gz
 | 
			
		||||
          sudo tar -xzf licensed.tar.gz
 | 
			
		||||
          sudo mv licensed /usr/local/bin/licensed
 | 
			
		||||
      - run: licensed status
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/test-pypy.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/test-pypy.yml
									
									
									
									
										vendored
									
									
								
							@ -18,7 +18,7 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: [macos-latest, windows-latest, ubuntu-18.04, ubuntu-latest]
 | 
			
		||||
        os: [macos-latest, windows-latest, ubuntu-latest]
 | 
			
		||||
        pypy:
 | 
			
		||||
        - 'pypy-2.7'
 | 
			
		||||
        - 'pypy-3.7'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								.github/workflows/test-python.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/test-python.yml
									
									
									
									
										vendored
									
									
								
							@ -18,7 +18,7 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: [macos-latest, windows-latest, ubuntu-18.04, ubuntu-20.04]
 | 
			
		||||
        os: [macos-latest, windows-latest, ubuntu-20.04]
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2
 | 
			
		||||
@ -38,7 +38,7 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: [macos-latest, windows-latest, ubuntu-18.04, ubuntu-20.04]
 | 
			
		||||
        os: [macos-latest, windows-latest, ubuntu-20.04]
 | 
			
		||||
        python: [3.5.4, 3.6.7, 3.7.5, 3.8.1]
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
@ -68,7 +68,7 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: [macos-latest, windows-latest, ubuntu-18.04, ubuntu-20.04]
 | 
			
		||||
        os: [macos-latest, windows-latest, ubuntu-20.04]
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2
 | 
			
		||||
@ -91,3 +91,18 @@ jobs:
 | 
			
		||||
    - name: Run simple code
 | 
			
		||||
      run: python -c 'import math; print(math.factorial(5))'
 | 
			
		||||
 | 
			
		||||
  setup-pypy-legacy:
 | 
			
		||||
    name: Setup PyPy ${{ matrix.os }}
 | 
			
		||||
    runs-on: ${{ matrix.os }}
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: [macos-11, windows-2019, ubuntu-20.04]
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2
 | 
			
		||||
 | 
			
		||||
    - name: setup-python pypy3
 | 
			
		||||
      uses: ./
 | 
			
		||||
      with:
 | 
			
		||||
        python-version: 'pypy-3.8'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							@ -14,18 +14,18 @@ jobs:
 | 
			
		||||
    runs-on: ${{ matrix.operating-system }}
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        operating-system: [ubuntu-latest, windows-latest]
 | 
			
		||||
        operating-system: [ubuntu-20.04, windows-latest]
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2
 | 
			
		||||
 | 
			
		||||
    - name: Set Node.js 16.x
 | 
			
		||||
    - name: Set Node.js 12.x
 | 
			
		||||
      uses: actions/setup-node@v1
 | 
			
		||||
      with:
 | 
			
		||||
        node-version: 16.x
 | 
			
		||||
        node-version: 12.x
 | 
			
		||||
 | 
			
		||||
    - name: npm ci
 | 
			
		||||
      run: npm ci
 | 
			
		||||
    - name: npm install
 | 
			
		||||
      run: npm install
 | 
			
		||||
 | 
			
		||||
    - name: Lint
 | 
			
		||||
      run: npm run format-check
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								.licenses/npm/@actions/cache.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.licenses/npm/@actions/cache.dep.yml
									
									
									
										generated
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
---
 | 
			
		||||
name: "@actions/cache"
 | 
			
		||||
version: 2.0.0
 | 
			
		||||
version: 1.0.8
 | 
			
		||||
type: npm
 | 
			
		||||
summary: Actions cache lib
 | 
			
		||||
homepage: https://github.com/actions/toolkit/tree/main/packages/cache
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								.licenses/npm/@types/node.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.licenses/npm/@types/node.dep.yml
									
									
									
										generated
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
---
 | 
			
		||||
name: "@types/node"
 | 
			
		||||
version: 16.11.25
 | 
			
		||||
version: 12.20.36
 | 
			
		||||
type: npm
 | 
			
		||||
summary: TypeScript definitions for Node.js
 | 
			
		||||
homepage: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										71
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								README.md
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
# setup-python V3
 | 
			
		||||
# setup-python V2
 | 
			
		||||
 | 
			
		||||
<p align="left">
 | 
			
		||||
  <a href="https://github.com/actions/setup-python"><img alt="GitHub Actions status" src="https://github.com/actions/setup-python/workflows/Main%20workflow/badge.svg"></a>
 | 
			
		||||
@ -9,7 +9,7 @@ This action sets up a Python environment for use in actions by:
 | 
			
		||||
- optionally installing and adding to PATH a version of Python that is already installed in the tools cache.
 | 
			
		||||
- downloading, installing and adding to PATH an available version of Python from GitHub Releases ([actions/python-versions](https://github.com/actions/python-versions/releases)) if a specific version is not available in the tools cache.
 | 
			
		||||
- failing if a specific version of Python is not preinstalled or available for download.
 | 
			
		||||
- optionally caching dependencies for pip, pipenv and poetry.
 | 
			
		||||
- optionally caching dependencies for pip and pipenv.
 | 
			
		||||
- registering problem matchers for error output.
 | 
			
		||||
 | 
			
		||||
# What's new
 | 
			
		||||
@ -19,7 +19,7 @@ This action sets up a Python environment for use in actions by:
 | 
			
		||||
- Automatic setup and download of Python packages if using a self-hosted runner.
 | 
			
		||||
- Support for pre-release versions of Python.
 | 
			
		||||
- Support for installing any version of PyPy on-flight
 | 
			
		||||
- Support for built-in caching of pip, pipenv and poetry dependencies
 | 
			
		||||
- Support for built-in caching of pip and pipenv dependencies
 | 
			
		||||
 | 
			
		||||
# Usage
 | 
			
		||||
 | 
			
		||||
@ -28,8 +28,8 @@ See [action.yml](action.yml)
 | 
			
		||||
Basic:
 | 
			
		||||
```yaml
 | 
			
		||||
steps:
 | 
			
		||||
- uses: actions/checkout@v3
 | 
			
		||||
- uses: actions/setup-python@v3
 | 
			
		||||
- uses: actions/checkout@v2
 | 
			
		||||
- uses: actions/setup-python@v2
 | 
			
		||||
  with:
 | 
			
		||||
    python-version: '3.x' # Version range or exact version of a Python version to use, using SemVer's version range syntax
 | 
			
		||||
    architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
 | 
			
		||||
@ -46,9 +46,9 @@ jobs:
 | 
			
		||||
        python-version: [ '2.x', '3.x', 'pypy-2.7', 'pypy-3.7', 'pypy-3.8' ]
 | 
			
		||||
    name: Python ${{ matrix.python-version }} sample
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - name: Set up Python
 | 
			
		||||
        uses: actions/setup-python@v3
 | 
			
		||||
        uses: actions/setup-python@v2
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: ${{ matrix.python-version }}
 | 
			
		||||
          architecture: x64
 | 
			
		||||
@ -70,9 +70,9 @@ jobs:
 | 
			
		||||
          - os: windows-latest
 | 
			
		||||
            python-version: '3.6'
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - name: Set up Python
 | 
			
		||||
        uses: actions/setup-python@v3
 | 
			
		||||
        uses: actions/setup-python@v2
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: ${{ matrix.python-version }}
 | 
			
		||||
      - name: Display Python version
 | 
			
		||||
@ -89,8 +89,8 @@ jobs:
 | 
			
		||||
        # in this example, there is a newer version already installed, 3.7.7, so the older version will be downloaded
 | 
			
		||||
        python-version: ['3.7.4', '3.8', '3.9', '3.10']
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/setup-python@v3
 | 
			
		||||
    - uses: actions/checkout@v2
 | 
			
		||||
    - uses: actions/setup-python@v2
 | 
			
		||||
      with:
 | 
			
		||||
        python-version: ${{ matrix.python-version }}
 | 
			
		||||
    - run: python my_script.py
 | 
			
		||||
@ -99,8 +99,8 @@ jobs:
 | 
			
		||||
Download and set up an accurate pre-release version of Python:
 | 
			
		||||
```yaml
 | 
			
		||||
steps:
 | 
			
		||||
- uses: actions/checkout@v3
 | 
			
		||||
- uses: actions/setup-python@v3
 | 
			
		||||
- uses: actions/checkout@v2
 | 
			
		||||
- uses: actions/setup-python@v2
 | 
			
		||||
  with:
 | 
			
		||||
    python-version: '3.11.0-alpha.1'
 | 
			
		||||
- run: python my_script.py
 | 
			
		||||
@ -109,8 +109,8 @@ steps:
 | 
			
		||||
Download and set up the latest available version of Python (includes both pre-release and stable versions):
 | 
			
		||||
```yaml
 | 
			
		||||
steps:
 | 
			
		||||
- uses: actions/checkout@v3
 | 
			
		||||
- uses: actions/setup-python@v3
 | 
			
		||||
- uses: actions/checkout@v2
 | 
			
		||||
- uses: actions/setup-python@v2
 | 
			
		||||
  with:
 | 
			
		||||
    python-version: '3.11.0-alpha - 3.11.0' # SemVer's version range syntax
 | 
			
		||||
- run: python my_script.py
 | 
			
		||||
@ -129,8 +129,8 @@ jobs:
 | 
			
		||||
        - 'pypy-3.7-v7.3.3' # Python 3.7 and PyPy 7.3.3
 | 
			
		||||
        - 'pypy-3.8' # the latest available version of PyPy that supports Python 3.8
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/setup-python@v3
 | 
			
		||||
    - uses: actions/checkout@v2
 | 
			
		||||
    - uses: actions/setup-python@v2
 | 
			
		||||
      with:
 | 
			
		||||
        python-version: ${{ matrix.python-version }}
 | 
			
		||||
    - run: python my_script.py
 | 
			
		||||
@ -209,24 +209,23 @@ pypy-3.7-nightly # Python 3.7 and nightly PyPy
 | 
			
		||||
 | 
			
		||||
# Caching packages dependencies
 | 
			
		||||
 | 
			
		||||
The action has built-in functionality for caching and restoring dependencies. It uses [actions/cache](https://github.com/actions/toolkit/tree/main/packages/cache) under the hood for caching dependencies but requires less configuration settings. Supported package managers are `pip`, `pipenv` and `poetry`. The `cache` input is optional, and caching is turned off by default.
 | 
			
		||||
The action has built-in functionality for caching and restoring dependencies. It uses [actions/cache](https://github.com/actions/toolkit/tree/main/packages/cache) under the hood for caching dependencies but requires less configuration settings. Supported package managers are `pip` and `pipenv`. The `cache` input is optional, and caching is turned off by default.
 | 
			
		||||
 | 
			
		||||
The action defaults to searching for a dependency file (`requirements.txt` for pip, `Pipfile.lock` for pipenv or `poetry.lock` for poetry) in the repository, and uses its hash as a part of the cache key. Use `cache-dependency-path` for cases where multiple dependency files are used, they are located in different subdirectories or different files for the hash want to be used.
 | 
			
		||||
The action defaults to searching for a dependency file (`requirements.txt` for pip or `Pipfile.lock` for pipenv) in the repository, and uses its hash as a part of the cache key. Use `cache-dependency-path` for cases where multiple dependency files are used, they are located in different subdirectories or different files for the hash want to be used.
 | 
			
		||||
 | 
			
		||||
 - For pip, the action will cache global cache directory
 | 
			
		||||
 - For pipenv, the action will cache virtualenv directory
 | 
			
		||||
 - For poetry, the action will cache virtualenv directory
 | 
			
		||||
 | 
			
		||||
**Please Note:** Restored cache will not be used if the requirements.txt file is not updated for a long time and a newer version of the dependency is available that can lead to an increase in total build time.
 | 
			
		||||
 | 
			
		||||
The requirements file format allows to specify dependency versions using logical operators (for example chardet>=3.0.4) or specify dependencies without any versions. In this case the pip install -r requirements.txt command will always try to install the latest available package version. To be sure that the cache will be used, please stick to a specific dependency version and update it manually if necessary.
 | 
			
		||||
 | 
			
		||||
**Caching pip dependencies:**
 | 
			
		||||
**Caching pip dependencies:**  
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
steps:
 | 
			
		||||
- uses: actions/checkout@v3
 | 
			
		||||
- uses: actions/setup-python@v3
 | 
			
		||||
- uses: actions/checkout@v2
 | 
			
		||||
- uses: actions/setup-python@v2
 | 
			
		||||
  with:
 | 
			
		||||
    python-version: '3.9'
 | 
			
		||||
    cache: 'pip'
 | 
			
		||||
@ -236,35 +235,21 @@ steps:
 | 
			
		||||
**Caching pipenv dependencies:**
 | 
			
		||||
```yaml
 | 
			
		||||
steps:
 | 
			
		||||
- uses: actions/checkout@v3
 | 
			
		||||
- uses: actions/checkout@v2
 | 
			
		||||
- name: Install pipenv
 | 
			
		||||
  run: pipx install pipenv
 | 
			
		||||
- uses: actions/setup-python@v3
 | 
			
		||||
- uses: actions/setup-python@v2
 | 
			
		||||
  with:
 | 
			
		||||
    python-version: '3.9'
 | 
			
		||||
    cache: 'pipenv'
 | 
			
		||||
- run: pipenv install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Caching poetry dependencies:**
 | 
			
		||||
```yaml
 | 
			
		||||
steps:
 | 
			
		||||
- uses: actions/checkout@v2
 | 
			
		||||
- name: Install poetry
 | 
			
		||||
  run: pipx install poetry
 | 
			
		||||
- uses: actions/setup-python@v2
 | 
			
		||||
  with:
 | 
			
		||||
    python-version: '3.9'
 | 
			
		||||
    cache: 'poetry'
 | 
			
		||||
- run: poetry install
 | 
			
		||||
- run: poetry run pytest
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Using wildcard patterns to cache dependencies**
 | 
			
		||||
```yaml
 | 
			
		||||
steps:
 | 
			
		||||
- uses: actions/checkout@v3
 | 
			
		||||
- uses: actions/setup-python@v3
 | 
			
		||||
- uses: actions/checkout@v2
 | 
			
		||||
- uses: actions/setup-python@v2
 | 
			
		||||
  with:
 | 
			
		||||
    python-version: '3.9'
 | 
			
		||||
    cache: 'pip'
 | 
			
		||||
@ -275,10 +260,10 @@ steps:
 | 
			
		||||
**Using a list of file paths to cache dependencies**
 | 
			
		||||
```yaml
 | 
			
		||||
steps:
 | 
			
		||||
- uses: actions/checkout@v3
 | 
			
		||||
- uses: actions/checkout@v2
 | 
			
		||||
- name: Install pipenv
 | 
			
		||||
  run: pipx install pipenv
 | 
			
		||||
- uses: actions/setup-python@v3
 | 
			
		||||
- uses: actions/setup-python@v2
 | 
			
		||||
  with:
 | 
			
		||||
    python-version: '3.9'
 | 
			
		||||
    cache: 'pipenv'
 | 
			
		||||
 | 
			
		||||
@ -5,21 +5,11 @@ import {getCacheDistributor} from '../src/cache-distributions/cache-factory';
 | 
			
		||||
 | 
			
		||||
describe('restore-cache', () => {
 | 
			
		||||
  const pipFileLockHash =
 | 
			
		||||
    '67d817abcde9c72da0ed5b8f235647cb14638b9ff9d742b42e4406d2eb16fe3c';
 | 
			
		||||
    'a3bdcc71289e4979ca9e051810d81999cc99823109faf6912e17ff14c8e621a6';
 | 
			
		||||
  const requirementsHash =
 | 
			
		||||
    'd8110e0006d7fb5ee76365d565eef9d37df1d11598b912d3eb66d398d57a1121';
 | 
			
		||||
  const requirementsLinuxHash =
 | 
			
		||||
    '2d0ff7f46b0e120e3d3294db65768b474934242637b9899b873e6283dfd16d7c';
 | 
			
		||||
  const poetryLockHash =
 | 
			
		||||
    '571bf984f8d210e6a97f854e479fdd4a2b5af67b5fdac109ec337a0ea16e7836';
 | 
			
		||||
  const poetryConfigOutput = `
 | 
			
		||||
cache-dir = "/Users/patrick/Library/Caches/pypoetry"
 | 
			
		||||
experimental.new-installer = false
 | 
			
		||||
installer.parallel = true
 | 
			
		||||
virtualenvs.create = true
 | 
			
		||||
virtualenvs.in-project = true
 | 
			
		||||
virtualenvs.path = "{cache-dir}/virtualenvs"  # /Users/patrick/Library/Caches/pypoetry/virtualenvs
 | 
			
		||||
  `;
 | 
			
		||||
 | 
			
		||||
  // core spy
 | 
			
		||||
  let infoSpy: jest.SpyInstance;
 | 
			
		||||
@ -57,9 +47,6 @@ virtualenvs.path = "{cache-dir}/virtualenvs"  # /Users/patrick/Library/Caches/py
 | 
			
		||||
      if (input.includes('pip')) {
 | 
			
		||||
        return {stdout: 'pip', stderr: '', exitCode: 0};
 | 
			
		||||
      }
 | 
			
		||||
      if (input.includes('poetry')) {
 | 
			
		||||
        return {stdout: poetryConfigOutput, stderr: '', exitCode: 0};
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      return {stdout: '', stderr: 'Error occured', exitCode: 2};
 | 
			
		||||
    });
 | 
			
		||||
@ -95,8 +82,7 @@ virtualenvs.path = "{cache-dir}/virtualenvs"  # /Users/patrick/Library/Caches/py
 | 
			
		||||
      ],
 | 
			
		||||
      ['pip', '3.8.12', '__tests__/data/requirements.txt', requirementsHash],
 | 
			
		||||
      ['pipenv', '3.9.1', undefined, pipFileLockHash],
 | 
			
		||||
      ['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash],
 | 
			
		||||
      ['poetry', '3.9.1', undefined, poetryLockHash]
 | 
			
		||||
      ['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash]
 | 
			
		||||
    ])(
 | 
			
		||||
      'restored dependencies for %s by primaryKey',
 | 
			
		||||
      async (packageManager, pythonVersion, dependencyFile, fileHash) => {
 | 
			
		||||
@ -152,8 +138,7 @@ virtualenvs.path = "{cache-dir}/virtualenvs"  # /Users/patrick/Library/Caches/py
 | 
			
		||||
      ],
 | 
			
		||||
      ['pip', '3.8.12', '__tests__/data/requirements.txt', pipFileLockHash],
 | 
			
		||||
      ['pipenv', '3.9.1', undefined, requirementsHash],
 | 
			
		||||
      ['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash],
 | 
			
		||||
      ['poetry', '3.9.1', undefined, requirementsHash]
 | 
			
		||||
      ['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash]
 | 
			
		||||
    ])(
 | 
			
		||||
      'restored dependencies for %s by primaryKey',
 | 
			
		||||
      async (packageManager, pythonVersion, dependencyFile, fileHash) => {
 | 
			
		||||
@ -169,17 +154,10 @@ virtualenvs.path = "{cache-dir}/virtualenvs"  # /Users/patrick/Library/Caches/py
 | 
			
		||||
        );
 | 
			
		||||
        await cacheDistributor.restoreCache();
 | 
			
		||||
        let result = '';
 | 
			
		||||
 | 
			
		||||
        switch (packageManager) {
 | 
			
		||||
          case 'pip':
 | 
			
		||||
            result = `Cache restored from key: ${fileHash}`;
 | 
			
		||||
            break;
 | 
			
		||||
          case 'pipenv':
 | 
			
		||||
            result = 'pipenv cache is not found';
 | 
			
		||||
            break;
 | 
			
		||||
          case 'poetry':
 | 
			
		||||
            result = 'poetry cache is not found';
 | 
			
		||||
            break;
 | 
			
		||||
        if (packageManager !== 'pipenv') {
 | 
			
		||||
          result = `Cache restored from key: ${fileHash}`;
 | 
			
		||||
        } else {
 | 
			
		||||
          result = 'pipenv cache is not found';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        expect(infoSpy).toHaveBeenCalledWith(result);
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,6 @@ describe('run', () => {
 | 
			
		||||
    'd8110e0006d7fb5ee76365d565eef9d37df1d11598b912d3eb66d398d57a1121';
 | 
			
		||||
  const requirementsLinuxHash =
 | 
			
		||||
    '2d0ff7f46b0e120e3d3294db65768b474934242637b9899b873e6283dfd16d7c';
 | 
			
		||||
  const poetryLockHash =
 | 
			
		||||
    '571bf984f8d210e6a97f854e479fdd4a2b5af67b5fdac109ec337a0ea16e7836';
 | 
			
		||||
 | 
			
		||||
  // core spy
 | 
			
		||||
  let infoSpy: jest.SpyInstance;
 | 
			
		||||
@ -116,22 +114,6 @@ describe('run', () => {
 | 
			
		||||
      );
 | 
			
		||||
      expect(setFailedSpy).not.toHaveBeenCalled();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should not save cache for pipenv', async () => {
 | 
			
		||||
      inputs['cache'] = 'pipenv';
 | 
			
		||||
 | 
			
		||||
      await run();
 | 
			
		||||
 | 
			
		||||
      expect(getInputSpy).toHaveBeenCalled();
 | 
			
		||||
      expect(debugSpy).toHaveBeenCalledWith(
 | 
			
		||||
        `paths for caching are ${__dirname}`
 | 
			
		||||
      );
 | 
			
		||||
      expect(getStateSpy).toHaveBeenCalledTimes(3);
 | 
			
		||||
      expect(infoSpy).toHaveBeenCalledWith(
 | 
			
		||||
        `Cache hit occurred on the primary key ${requirementsHash}, not saving cache.`
 | 
			
		||||
      );
 | 
			
		||||
      expect(setFailedSpy).not.toHaveBeenCalled();
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  describe('action saves the cache', () => {
 | 
			
		||||
@ -186,32 +168,6 @@ describe('run', () => {
 | 
			
		||||
      );
 | 
			
		||||
      expect(setFailedSpy).not.toHaveBeenCalled();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('saves cache from poetry', async () => {
 | 
			
		||||
      inputs['cache'] = 'poetry';
 | 
			
		||||
      getStateSpy.mockImplementation((name: string) => {
 | 
			
		||||
        if (name === State.CACHE_MATCHED_KEY) {
 | 
			
		||||
          return poetryLockHash;
 | 
			
		||||
        } else if (name === State.CACHE_PATHS) {
 | 
			
		||||
          return JSON.stringify([__dirname]);
 | 
			
		||||
        } else {
 | 
			
		||||
          return requirementsHash;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      await run();
 | 
			
		||||
 | 
			
		||||
      expect(getInputSpy).toHaveBeenCalled();
 | 
			
		||||
      expect(getStateSpy).toHaveBeenCalledTimes(3);
 | 
			
		||||
      expect(infoSpy).not.toHaveBeenCalledWith(
 | 
			
		||||
        `Cache hit occurred on the primary key ${poetryLockHash}, not saving cache.`
 | 
			
		||||
      );
 | 
			
		||||
      expect(saveCacheSpy).toHaveBeenCalled();
 | 
			
		||||
      expect(infoSpy).toHaveBeenLastCalledWith(
 | 
			
		||||
        `Cache saved with the key: ${requirementsHash}`
 | 
			
		||||
      );
 | 
			
		||||
      expect(setFailedSpy).not.toHaveBeenCalled();
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  afterEach(() => {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								__tests__/data/Pipfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								__tests__/data/Pipfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
[[source]]
 | 
			
		||||
url = "https://pypi.org/simple"
 | 
			
		||||
verify_ssl = true
 | 
			
		||||
name = "pypi"
 | 
			
		||||
 | 
			
		||||
[packages]
 | 
			
		||||
flake8 = "==4.0.1"
 | 
			
		||||
numpy = "==1.23.0"
 | 
			
		||||
 | 
			
		||||
[dev-packages]
 | 
			
		||||
 | 
			
		||||
[requires]
 | 
			
		||||
python_version = "*"
 | 
			
		||||
							
								
								
									
										290
									
								
								__tests__/data/Pipfile.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										290
									
								
								__tests__/data/Pipfile.lock
									
									
									
										generated
									
									
									
								
							@ -1,11 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
    "_meta": {
 | 
			
		||||
        "hash": {
 | 
			
		||||
            "sha256": "408f110354c997d8df1e17841d5335ae690f5b25f8c78040d62257f9535c6005"
 | 
			
		||||
            "sha256": "e9c37110984955621040e2dc8548c026eb8466c23db1b8e69430289b10be8938"
 | 
			
		||||
        },
 | 
			
		||||
        "pipfile-spec": 6,
 | 
			
		||||
        "requires": {
 | 
			
		||||
            "python_version": "3.7"
 | 
			
		||||
            "python_version": "*"
 | 
			
		||||
        },
 | 
			
		||||
        "sources": [
 | 
			
		||||
            {
 | 
			
		||||
@ -16,260 +16,64 @@
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    "default": {
 | 
			
		||||
        "altgraph": {
 | 
			
		||||
        "flake8": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:743628f2ac6a7c26f5d9223c91ed8ecbba535f506f4b6f558885a8a56a105857",
 | 
			
		||||
                "sha256:ebf2269361b47d97b3b88e696439f6e4cbc607c17c51feb1754f90fb79839158"
 | 
			
		||||
            ],
 | 
			
		||||
            "version": "==0.17.2"
 | 
			
		||||
        },
 | 
			
		||||
        "certifi": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3",
 | 
			
		||||
                "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"
 | 
			
		||||
                "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d",
 | 
			
		||||
                "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==2020.6.20"
 | 
			
		||||
            "version": "==4.0.1"
 | 
			
		||||
        },
 | 
			
		||||
        "chardet": {
 | 
			
		||||
        "mccabe": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
 | 
			
		||||
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
 | 
			
		||||
                "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
 | 
			
		||||
                "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
 | 
			
		||||
            ],
 | 
			
		||||
            "version": "==0.6.1"
 | 
			
		||||
        },
 | 
			
		||||
        "numpy": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:092f5e6025813e64ad6d1b52b519165d08c730d099c114a9247c9bb635a2a450",
 | 
			
		||||
                "sha256:196cd074c3f97c4121601790955f915187736f9cf458d3ee1f1b46aff2b1ade0",
 | 
			
		||||
                "sha256:1c29b44905af288b3919803aceb6ec7fec77406d8b08aaa2e8b9e63d0fe2f160",
 | 
			
		||||
                "sha256:2b2da66582f3a69c8ce25ed7921dcd8010d05e59ac8d89d126a299be60421171",
 | 
			
		||||
                "sha256:5043bcd71fcc458dfb8a0fc5509bbc979da0131b9d08e3d5f50fb0bbb36f169a",
 | 
			
		||||
                "sha256:58bfd40eb478f54ff7a5710dd61c8097e169bc36cc68333d00a9bcd8def53b38",
 | 
			
		||||
                "sha256:79a506cacf2be3a74ead5467aee97b81fca00c9c4c8b3ba16dbab488cd99ba10",
 | 
			
		||||
                "sha256:94b170b4fa0168cd6be4becf37cb5b127bd12a795123984385b8cd4aca9857e5",
 | 
			
		||||
                "sha256:97a76604d9b0e79f59baeca16593c711fddb44936e40310f78bfef79ee9a835f",
 | 
			
		||||
                "sha256:98e8e0d8d69ff4d3fa63e6c61e8cfe2d03c29b16b58dbef1f9baa175bbed7860",
 | 
			
		||||
                "sha256:ac86f407873b952679f5f9e6c0612687e51547af0e14ddea1eedfcb22466babd",
 | 
			
		||||
                "sha256:ae8adff4172692ce56233db04b7ce5792186f179c415c37d539c25de7298d25d",
 | 
			
		||||
                "sha256:bd3fa4fe2e38533d5336e1272fc4e765cabbbde144309ccee8675509d5cd7b05",
 | 
			
		||||
                "sha256:d0d2094e8f4d760500394d77b383a1b06d3663e8892cdf5df3c592f55f3bff66",
 | 
			
		||||
                "sha256:d54b3b828d618a19779a84c3ad952e96e2c2311b16384e973e671aa5be1f6187",
 | 
			
		||||
                "sha256:d6ca8dabe696c2785d0c8c9b0d8a9b6e5fdbe4f922bde70d57fa1a2848134f95",
 | 
			
		||||
                "sha256:d8cc87bed09de55477dba9da370c1679bd534df9baa171dd01accbb09687dac3",
 | 
			
		||||
                "sha256:f0f18804df7370571fb65db9b98bf1378172bd4e962482b857e612d1fec0f53e",
 | 
			
		||||
                "sha256:f1d88ef79e0a7fa631bb2c3dda1ea46b32b1fe614e10fedd611d3d5398447f2f",
 | 
			
		||||
                "sha256:f9c3fc2adf67762c9fe1849c859942d23f8d3e0bee7b5ed3d4a9c3eeb50a2f07",
 | 
			
		||||
                "sha256:fc431493df245f3c627c0c05c2bd134535e7929dbe2e602b80e42bf52ff760bc",
 | 
			
		||||
                "sha256:fe8b9683eb26d2c4d5db32cd29b38fdcf8381324ab48313b5b69088e0e355379"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==3.0.4"
 | 
			
		||||
            "version": "==1.23.0"
 | 
			
		||||
        },
 | 
			
		||||
        "docutils": {
 | 
			
		||||
        "pycodestyle": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
 | 
			
		||||
                "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
 | 
			
		||||
                "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20",
 | 
			
		||||
                "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==0.16"
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
 | 
			
		||||
            "version": "==2.8.0"
 | 
			
		||||
        },
 | 
			
		||||
        "future": {
 | 
			
		||||
        "pyflakes": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
 | 
			
		||||
                "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c",
 | 
			
		||||
                "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
 | 
			
		||||
            "version": "==0.18.2"
 | 
			
		||||
        },
 | 
			
		||||
        "idna": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
 | 
			
		||||
                "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==2.9"
 | 
			
		||||
        },
 | 
			
		||||
        "itsdangerous": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
 | 
			
		||||
                "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==1.1.0"
 | 
			
		||||
        },
 | 
			
		||||
        "kivy": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:090d3ded9835a17477cd93fbdaf0a7c42ff2218981cf198ded5ad8795bc74391",
 | 
			
		||||
                "sha256:11e85eaf6efbfa2362a3334ffdad179a1b0ca8d255cca79eaa6a2765560d4982",
 | 
			
		||||
                "sha256:1a1ff32f8a95f1e175198cbab81fcd2596783b180d4eafe63e87d171aa7fdb5e",
 | 
			
		||||
                "sha256:1d28b198a64c30db8d94a0488e85f3037af60d514ab0d7ad5ab45add3ab77090",
 | 
			
		||||
                "sha256:4a5480cbf837d3780c77a4f61b32b56d22ae9f03845e7a89dd3eaef1ae5fd037",
 | 
			
		||||
                "sha256:4d0e596f74271e901b551f77661dde238df4765484fce9f5d1c72e8022984e84",
 | 
			
		||||
                "sha256:5c3d0f2749522d62e9cce09cd54b2d823bf1b6b644ff1f627be49de6f3e3cba0",
 | 
			
		||||
                "sha256:815a5c0b3b72fcd81ca7b2aa0744087163ed03e4cf9ab4e7c9733cea99fc1571",
 | 
			
		||||
                "sha256:8819a27a09871af451760cb69486ced52e830c8a0a37480f22ef5e692f12c05b",
 | 
			
		||||
                "sha256:a687602d90c4629dd036f577ca39acb76ba581370f9d915f3cab99be818ba8ad",
 | 
			
		||||
                "sha256:b7ef6aad43a86d8df3fb865db864e354f2155a748019f8517f69f65c1a29cb64",
 | 
			
		||||
                "sha256:b85ccf165050cbf2ee8447671eebbc222b369b40f0e0038dd9547d49a5e37373",
 | 
			
		||||
                "sha256:c36652caa7f6c327dee834cfc699d5962d346b7a53e54bd81abc17c314226d89",
 | 
			
		||||
                "sha256:ece170514db3f49844a41e4c910ad9ce9bc46da6f47a49158e11266bdcc6e479",
 | 
			
		||||
                "sha256:f3bea6e4a21991827885d04127fc6d09a0e974ecfa12da7bf5faae93562ea102",
 | 
			
		||||
                "sha256:f835462dd9aa491272552ef079b948a088598e2e95d68bb1d885d2c3f3d4e2c3"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==1.11.1"
 | 
			
		||||
        },
 | 
			
		||||
        "kivy-deps-angle": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:50605fdd4c9fdbe9f717069734a598a9aba0afe5d3f0412afbe2ecff0326e92d",
 | 
			
		||||
                "sha256:64ac7f33c000585dc30194e604aed925972c6b7c3848b5c3b073ae916fb0b55c",
 | 
			
		||||
                "sha256:99c40d53582a958748e251dfbd61aa67fb85963e27529ca08a21f2f5eeed04e1",
 | 
			
		||||
                "sha256:a2cea09e8a5e899629466403fbd540459f1cdef8d08c6c479b6607b95309be02",
 | 
			
		||||
                "sha256:b167e19b3eea55a9a8c606a607bb909ec1bedda88deee40347c780b310155a79",
 | 
			
		||||
                "sha256:b9d07976b0bf6bac724a42aa8ed5a8c7caa95609046db30c8f15bb731f8e4d36",
 | 
			
		||||
                "sha256:bb4d53f15a093214adbbe205c108ede5cc0f6af6eff104c1b8c468ddaaf6400a",
 | 
			
		||||
                "sha256:d0e7b7b9eb9669837a5d70808a7ea45f2b61961b56f9f69a233bad6bd36ce260"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==0.3.0"
 | 
			
		||||
        },
 | 
			
		||||
        "kivy-deps.glew": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:09f72ee5ef33ff273332e2a229dc97d650d29818a0189339421949e4e0f63d93",
 | 
			
		||||
                "sha256:1e28e40017af9d081fc0fc95b4fadaf31d15e9f63478dcee1c4257d67079894e",
 | 
			
		||||
                "sha256:45aa7f0e8d9bcf5fc1810c9c38bc20edf7dee61df81ecf62102e0f84153f924a",
 | 
			
		||||
                "sha256:6bb435620c3187d2c61054adb9ec277ed487256b457a0a7b1491bc0cb7247e18",
 | 
			
		||||
                "sha256:92e72fa2c425887987d1aa861c99537033dc20d68ae1c54864871f0401682586",
 | 
			
		||||
                "sha256:ab81783a82bef88a8d2bcf8a93bc21df6b8b0db6ee551eb802727d18f9074b17",
 | 
			
		||||
                "sha256:c843104690c0c8f3a58105c53c57f31506f6f90562c18de00bd19317cc1045a7",
 | 
			
		||||
                "sha256:cf351aad171796f8051af8e49ec430a9aa128d8557d8643e73f2bb1e5f9c2dab",
 | 
			
		||||
                "sha256:ee8ab67abb2c98d84feede657cae472e7723e529af07394244bdd33caafb1a38",
 | 
			
		||||
                "sha256:ef1116d99bd9cc737cb8c0e13e676955c17d6e4d6d1af5cfccef089a430071bb"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==0.1.12"
 | 
			
		||||
        },
 | 
			
		||||
        "kivy-deps.gstreamer": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:0d9598d2d31c0e780adf4b767fa3a691123621fd0ffef94b83cf82c2da84341b",
 | 
			
		||||
                "sha256:309eca64dee5939f16f8465e5cbb08bdde7c90ded1af6a00690c7e928326af79",
 | 
			
		||||
                "sha256:3d53d2c84c0a997c4cac6c239b1e0a6486e533836321003dc365ec42b97a664b",
 | 
			
		||||
                "sha256:4d996377111e854b3dea90846f9b2f98766a44529fd8b72125e18c552381d928",
 | 
			
		||||
                "sha256:4f2ddd61d185310258d338ae80a646df7822efdd7d67e57f49dc7b87555c5d7e",
 | 
			
		||||
                "sha256:6fa9f76afe600baa221abee31ce7dc63e653d0affe0f6c558bfc4f35af96396f",
 | 
			
		||||
                "sha256:739cd331b9f33a822d700273674a79a3157054e9358a01a0d553f094a5f4a8c9",
 | 
			
		||||
                "sha256:c29cfc63fe70a58dad889e631f1ba4711c9ea80103f2b2b8d670a97f093076c8",
 | 
			
		||||
                "sha256:c4709765e2b17c6c96b46a92207b0457def147544d825654077603eaf0d424de"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==0.1.17"
 | 
			
		||||
        },
 | 
			
		||||
        "kivy-deps.sdl2": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:053f26e8c05d5545bdbc7eeb8c450b8e4410ee355792e9345af536110fe247e2",
 | 
			
		||||
                "sha256:1b987bdd4fbbcb31baf0d7fc9584ad99912179b8968311bb7e30fbeb14e98e0d",
 | 
			
		||||
                "sha256:228128cdd8112dc7505ac43027a770476e9ef282e0b84ca68037133cd025960b",
 | 
			
		||||
                "sha256:2c2fd5a12a7a9afe3bb962b273561099a180edae91bb9c8f8386b72253fcae4a",
 | 
			
		||||
                "sha256:5ce23f1a3286d6288751a12b0eaefd02f947ea101bb807e9781b964e496fc3f3",
 | 
			
		||||
                "sha256:7928746eaed51944c10d1bb36fcefebe3d1aff1b97ba32359c2c97ba74707e1b",
 | 
			
		||||
                "sha256:9270fa8ed5130074b167a7a3a9c85efc3cfe3c04584ab084cb6ae9e4edfa8168",
 | 
			
		||||
                "sha256:92ed97d3247bc8ce98f336cbc940bb889310199326e9ccf251c49ae7e4b80de8",
 | 
			
		||||
                "sha256:96e1fa89fd8b5351f2d3c26bbffd50df8d554b03fba4025ecc941d773d241698",
 | 
			
		||||
                "sha256:c3ace0ddde0e59cdcaf260eda1daa0c05ca9bf8cd0c4ea404539de25a5dcaec7"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==0.1.22"
 | 
			
		||||
        },
 | 
			
		||||
        "kivy-garden": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:9b7d9de5efacbcd0c4b3dd873b30622a86093c9965aa47b523c7a32f3eb34610",
 | 
			
		||||
                "sha256:c256f42788421273a08fbb0a228f0fb0e80dd86b629fb8c0920507f645be6c72"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==0.1.4"
 | 
			
		||||
        },
 | 
			
		||||
        "packaging": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7",
 | 
			
		||||
                "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==21.0"
 | 
			
		||||
        },
 | 
			
		||||
        "pdf2image": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:a0d9906f5507192210a8d5d7ead63145e9dec4bccc4564b1fb644e923913c31c"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==1.12.1"
 | 
			
		||||
        },
 | 
			
		||||
        "pefile": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:344a49e40a94e10849f0fe34dddc80f773a12b40675bf2f7be4b8be578bdd94a"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_full_version >= '3.6.0'",
 | 
			
		||||
            "version": "==2021.9.3"
 | 
			
		||||
        },
 | 
			
		||||
        "pillow": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f",
 | 
			
		||||
                "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8",
 | 
			
		||||
                "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad",
 | 
			
		||||
                "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f",
 | 
			
		||||
                "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae",
 | 
			
		||||
                "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d",
 | 
			
		||||
                "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5",
 | 
			
		||||
                "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b",
 | 
			
		||||
                "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8",
 | 
			
		||||
                "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233",
 | 
			
		||||
                "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6",
 | 
			
		||||
                "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727",
 | 
			
		||||
                "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f",
 | 
			
		||||
                "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38",
 | 
			
		||||
                "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4",
 | 
			
		||||
                "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626",
 | 
			
		||||
                "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d",
 | 
			
		||||
                "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6",
 | 
			
		||||
                "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6",
 | 
			
		||||
                "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63",
 | 
			
		||||
                "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f",
 | 
			
		||||
                "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41",
 | 
			
		||||
                "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1",
 | 
			
		||||
                "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117",
 | 
			
		||||
                "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d",
 | 
			
		||||
                "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9",
 | 
			
		||||
                "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a",
 | 
			
		||||
                "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==7.2"
 | 
			
		||||
        },
 | 
			
		||||
        "pygments": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44",
 | 
			
		||||
                "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==2.6.1"
 | 
			
		||||
        },
 | 
			
		||||
        "pyinstaller": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:3730fa80d088f8bb7084d32480eb87cbb4ddb64123363763cf8f2a1378c1c4b7"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==3.6"
 | 
			
		||||
        },
 | 
			
		||||
        "pyparsing": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
 | 
			
		||||
                "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
 | 
			
		||||
            ],
 | 
			
		||||
            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
 | 
			
		||||
            "version": "==2.4.7"
 | 
			
		||||
        },
 | 
			
		||||
        "pywin32-ctypes": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942",
 | 
			
		||||
                "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"
 | 
			
		||||
            ],
 | 
			
		||||
            "version": "==0.2.0"
 | 
			
		||||
        },
 | 
			
		||||
        "requests": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b",
 | 
			
		||||
                "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==2.24.0"
 | 
			
		||||
        },
 | 
			
		||||
        "urllib3": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527",
 | 
			
		||||
                "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==1.25.9"
 | 
			
		||||
        },
 | 
			
		||||
        "xlrd": {
 | 
			
		||||
            "hashes": [
 | 
			
		||||
                "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2",
 | 
			
		||||
                "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde"
 | 
			
		||||
            ],
 | 
			
		||||
            "index": "pypi",
 | 
			
		||||
            "version": "==1.2.0"
 | 
			
		||||
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
 | 
			
		||||
            "version": "==2.4.0"
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "develop": {}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								__tests__/data/pipenv-requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								__tests__/data/pipenv-requirements.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
numpy==1.22.3
 | 
			
		||||
pandas==1.4.2
 | 
			
		||||
							
								
								
									
										413
									
								
								__tests__/data/poetry.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										413
									
								
								__tests__/data/poetry.lock
									
									
									
										generated
									
									
									
								
							@ -1,413 +0,0 @@
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "altgraph"
 | 
			
		||||
version = "0.17.2"
 | 
			
		||||
description = "Python graph (network) package"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "certifi"
 | 
			
		||||
version = "2020.6.20"
 | 
			
		||||
description = "Python package for providing Mozilla's CA Bundle."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "chardet"
 | 
			
		||||
version = "3.0.4"
 | 
			
		||||
description = "Universal encoding detector for Python 2 and 3"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "dis3"
 | 
			
		||||
version = "0.1.3"
 | 
			
		||||
description = "Python 2.7 backport of the \"dis\" module from Python 3.5+"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "docutils"
 | 
			
		||||
version = "0.16"
 | 
			
		||||
description = "Docutils -- Python Documentation Utilities"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "future"
 | 
			
		||||
version = "0.18.2"
 | 
			
		||||
description = "Clean single-source support for Python 3 and 2"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "idna"
 | 
			
		||||
version = "2.9"
 | 
			
		||||
description = "Internationalized Domain Names in Applications (IDNA)"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "itsdangerous"
 | 
			
		||||
version = "1.1.0"
 | 
			
		||||
description = "Various helpers to pass data to untrusted environments and back."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kivy"
 | 
			
		||||
version = "1.11.1"
 | 
			
		||||
description = "A software library for rapid development of hardware-accelerated multitouch applications."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[package.dependencies]
 | 
			
		||||
docutils = "*"
 | 
			
		||||
Kivy-Garden = ">=0.1.4"
 | 
			
		||||
pygments = "*"
 | 
			
		||||
 | 
			
		||||
[package.extras]
 | 
			
		||||
tuio = ["oscpy"]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kivy-deps.angle"
 | 
			
		||||
version = "0.3.0"
 | 
			
		||||
description = "Repackaged binary dependency of Kivy."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kivy-deps.glew"
 | 
			
		||||
version = "0.1.12"
 | 
			
		||||
description = "Repackaged binary dependency of Kivy."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kivy-deps.gstreamer"
 | 
			
		||||
version = "0.1.17"
 | 
			
		||||
description = "Repackaged binary dependency of Kivy."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kivy-deps.sdl2"
 | 
			
		||||
version = "0.1.22"
 | 
			
		||||
description = "Repackaged binary dependency of Kivy."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kivy-garden"
 | 
			
		||||
version = "0.1.4"
 | 
			
		||||
description = "Garden tool for kivy flowers."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[package.dependencies]
 | 
			
		||||
requests = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "packaging"
 | 
			
		||||
version = "21.0"
 | 
			
		||||
description = "Core utilities for Python packages"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=3.6"
 | 
			
		||||
 | 
			
		||||
[package.dependencies]
 | 
			
		||||
pyparsing = ">=2.0.2"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pdf2image"
 | 
			
		||||
version = "1.12.1"
 | 
			
		||||
description = "A wrapper around the pdftoppm and pdftocairo command line tools to convert PDF to a PIL Image list."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[package.dependencies]
 | 
			
		||||
pillow = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pefile"
 | 
			
		||||
version = "2021.9.3"
 | 
			
		||||
description = "Python PE parsing module"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=3.6.0"
 | 
			
		||||
 | 
			
		||||
[package.dependencies]
 | 
			
		||||
future = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pillow"
 | 
			
		||||
version = "7.2.0"
 | 
			
		||||
description = "Python Imaging Library (Fork)"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=3.5"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pygments"
 | 
			
		||||
version = "2.6.1"
 | 
			
		||||
description = "Pygments is a syntax highlighting package written in Python."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=3.5"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pyinstaller"
 | 
			
		||||
version = "3.6"
 | 
			
		||||
description = "PyInstaller bundles a Python application and all its dependencies into a single package."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
			
		||||
 | 
			
		||||
[package.dependencies]
 | 
			
		||||
altgraph = "*"
 | 
			
		||||
dis3 = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pyparsing"
 | 
			
		||||
version = "2.4.7"
 | 
			
		||||
description = "Python parsing module"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pywin32-ctypes"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
description = ""
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = "*"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "requests"
 | 
			
		||||
version = "2.24.0"
 | 
			
		||||
description = "Python HTTP for Humans."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
			
		||||
 | 
			
		||||
[package.dependencies]
 | 
			
		||||
certifi = ">=2017.4.17"
 | 
			
		||||
chardet = ">=3.0.2,<4"
 | 
			
		||||
idna = ">=2.5,<3"
 | 
			
		||||
urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"
 | 
			
		||||
 | 
			
		||||
[package.extras]
 | 
			
		||||
security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
 | 
			
		||||
socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "urllib3"
 | 
			
		||||
version = "1.25.9"
 | 
			
		||||
description = "HTTP library with thread-safe connection pooling, file post, and more."
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 | 
			
		||||
 | 
			
		||||
[package.extras]
 | 
			
		||||
brotli = ["brotlipy (>=0.6.0)"]
 | 
			
		||||
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"]
 | 
			
		||||
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "xlrd"
 | 
			
		||||
version = "1.2.0"
 | 
			
		||||
description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files"
 | 
			
		||||
category = "main"
 | 
			
		||||
optional = false
 | 
			
		||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
			
		||||
 | 
			
		||||
[metadata]
 | 
			
		||||
lock-version = "1.1"
 | 
			
		||||
python-versions = "^3.8"
 | 
			
		||||
content-hash = "b3d607363c6daf2b5448aa5ee676cff28606af6200d8e9b42e89937a190a3d46"
 | 
			
		||||
 | 
			
		||||
[metadata.files]
 | 
			
		||||
altgraph = [
 | 
			
		||||
    {file = "altgraph-0.17.2-py2.py3-none-any.whl", hash = "sha256:743628f2ac6a7c26f5d9223c91ed8ecbba535f506f4b6f558885a8a56a105857"},
 | 
			
		||||
    {file = "altgraph-0.17.2.tar.gz", hash = "sha256:ebf2269361b47d97b3b88e696439f6e4cbc607c17c51feb1754f90fb79839158"},
 | 
			
		||||
]
 | 
			
		||||
certifi = [
 | 
			
		||||
    {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
 | 
			
		||||
    {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"},
 | 
			
		||||
]
 | 
			
		||||
chardet = [
 | 
			
		||||
    {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
 | 
			
		||||
    {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
 | 
			
		||||
]
 | 
			
		||||
dis3 = [
 | 
			
		||||
    {file = "dis3-0.1.3-py2-none-any.whl", hash = "sha256:61f7720dd0d8749d23fda3d7227ce74d73da11c2fade993a67ab2f9852451b14"},
 | 
			
		||||
    {file = "dis3-0.1.3-py3-none-any.whl", hash = "sha256:30b6412d33d738663e8ded781b138f4b01116437f0872aa56aa3adba6aeff218"},
 | 
			
		||||
    {file = "dis3-0.1.3.tar.gz", hash = "sha256:9259b881fc1df02ed12ac25f82d4a85b44241854330b1a651e40e0c675cb2d1e"},
 | 
			
		||||
]
 | 
			
		||||
docutils = [
 | 
			
		||||
    {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
 | 
			
		||||
    {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
 | 
			
		||||
]
 | 
			
		||||
future = [
 | 
			
		||||
    {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"},
 | 
			
		||||
]
 | 
			
		||||
idna = [
 | 
			
		||||
    {file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"},
 | 
			
		||||
    {file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"},
 | 
			
		||||
]
 | 
			
		||||
itsdangerous = [
 | 
			
		||||
    {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"},
 | 
			
		||||
    {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"},
 | 
			
		||||
]
 | 
			
		||||
kivy = [
 | 
			
		||||
    {file = "Kivy-1.11.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:11e85eaf6efbfa2362a3334ffdad179a1b0ca8d255cca79eaa6a2765560d4982"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp27-cp27m-win32.whl", hash = "sha256:5c3d0f2749522d62e9cce09cd54b2d823bf1b6b644ff1f627be49de6f3e3cba0"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp27-cp27m-win_amd64.whl", hash = "sha256:f835462dd9aa491272552ef079b948a088598e2e95d68bb1d885d2c3f3d4e2c3"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:090d3ded9835a17477cd93fbdaf0a7c42ff2218981cf198ded5ad8795bc74391"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:b85ccf165050cbf2ee8447671eebbc222b369b40f0e0038dd9547d49a5e37373"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp35-cp35m-win32.whl", hash = "sha256:4a5480cbf837d3780c77a4f61b32b56d22ae9f03845e7a89dd3eaef1ae5fd037"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a687602d90c4629dd036f577ca39acb76ba581370f9d915f3cab99be818ba8ad"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:c36652caa7f6c327dee834cfc699d5962d346b7a53e54bd81abc17c314226d89"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:b7ef6aad43a86d8df3fb865db864e354f2155a748019f8517f69f65c1a29cb64"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp36-cp36m-win32.whl", hash = "sha256:f3bea6e4a21991827885d04127fc6d09a0e974ecfa12da7bf5faae93562ea102"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ece170514db3f49844a41e4c910ad9ce9bc46da6f47a49158e11266bdcc6e479"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:8819a27a09871af451760cb69486ced52e830c8a0a37480f22ef5e692f12c05b"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1a1ff32f8a95f1e175198cbab81fcd2596783b180d4eafe63e87d171aa7fdb5e"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp37-cp37m-win32.whl", hash = "sha256:815a5c0b3b72fcd81ca7b2aa0744087163ed03e4cf9ab4e7c9733cea99fc1571"},
 | 
			
		||||
    {file = "Kivy-1.11.1-cp37-cp37m-win_amd64.whl", hash = "sha256:1d28b198a64c30db8d94a0488e85f3037af60d514ab0d7ad5ab45add3ab77090"},
 | 
			
		||||
    {file = "Kivy-1.11.1.tar.gz", hash = "sha256:4d0e596f74271e901b551f77661dde238df4765484fce9f5d1c72e8022984e84"},
 | 
			
		||||
]
 | 
			
		||||
"kivy-deps.angle" = [
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp310-cp310-win32.whl", hash = "sha256:7b56477c726e361592f794d49b2fdd96d579b7efd7225a8aadf7fd01d4e8cb80"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:a4b78fd9d47c76e5ff52fcbaa040920a2f97bff038f4c534346dd833dc8f3145"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp36-cp36m-win32.whl", hash = "sha256:a2cea09e8a5e899629466403fbd540459f1cdef8d08c6c479b6607b95309be02"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b167e19b3eea55a9a8c606a607bb909ec1bedda88deee40347c780b310155a79"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp37-cp37m-win32.whl", hash = "sha256:d0e7b7b9eb9669837a5d70808a7ea45f2b61961b56f9f69a233bad6bd36ce260"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b9d07976b0bf6bac724a42aa8ed5a8c7caa95609046db30c8f15bb731f8e4d36"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp38-cp38-win32.whl", hash = "sha256:99c40d53582a958748e251dfbd61aa67fb85963e27529ca08a21f2f5eeed04e1"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:50605fdd4c9fdbe9f717069734a598a9aba0afe5d3f0412afbe2ecff0326e92d"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp39-cp39-win32.whl", hash = "sha256:64ac7f33c000585dc30194e604aed925972c6b7c3848b5c3b073ae916fb0b55c"},
 | 
			
		||||
    {file = "kivy_deps.angle-0.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb4d53f15a093214adbbe205c108ede5cc0f6af6eff104c1b8c468ddaaf6400a"},
 | 
			
		||||
]
 | 
			
		||||
"kivy-deps.glew" = [
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp27-cp27m-win32.whl", hash = "sha256:92e72fa2c425887987d1aa861c99537033dc20d68ae1c54864871f0401682586"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp27-cp27m-win_amd64.whl", hash = "sha256:c843104690c0c8f3a58105c53c57f31506f6f90562c18de00bd19317cc1045a7"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp35-cp35m-win32.whl", hash = "sha256:ee8ab67abb2c98d84feede657cae472e7723e529af07394244bdd33caafb1a38"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp35-cp35m-win_amd64.whl", hash = "sha256:ab81783a82bef88a8d2bcf8a93bc21df6b8b0db6ee551eb802727d18f9074b17"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp36-cp36m-win32.whl", hash = "sha256:45aa7f0e8d9bcf5fc1810c9c38bc20edf7dee61df81ecf62102e0f84153f924a"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp36-cp36m-win_amd64.whl", hash = "sha256:ef1116d99bd9cc737cb8c0e13e676955c17d6e4d6d1af5cfccef089a430071bb"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp37-cp37m-win32.whl", hash = "sha256:1e28e40017af9d081fc0fc95b4fadaf31d15e9f63478dcee1c4257d67079894e"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp37-cp37m-win_amd64.whl", hash = "sha256:6bb435620c3187d2c61054adb9ec277ed487256b457a0a7b1491bc0cb7247e18"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp38-cp38-win32.whl", hash = "sha256:09f72ee5ef33ff273332e2a229dc97d650d29818a0189339421949e4e0f63d93"},
 | 
			
		||||
    {file = "kivy_deps.glew-0.1.12-cp38-cp38-win_amd64.whl", hash = "sha256:cf351aad171796f8051af8e49ec430a9aa128d8557d8643e73f2bb1e5f9c2dab"},
 | 
			
		||||
]
 | 
			
		||||
"kivy-deps.gstreamer" = [
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp27-cp27m-win32.whl", hash = "sha256:309eca64dee5939f16f8465e5cbb08bdde7c90ded1af6a00690c7e928326af79"},
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp27-cp27m-win_amd64.whl", hash = "sha256:0d9598d2d31c0e780adf4b767fa3a691123621fd0ffef94b83cf82c2da84341b"},
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp35-cp35m-win32.whl", hash = "sha256:4f2ddd61d185310258d338ae80a646df7822efdd7d67e57f49dc7b87555c5d7e"},
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp35-cp35m-win_amd64.whl", hash = "sha256:6fa9f76afe600baa221abee31ce7dc63e653d0affe0f6c558bfc4f35af96396f"},
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp36-cp36m-win32.whl", hash = "sha256:c4709765e2b17c6c96b46a92207b0457def147544d825654077603eaf0d424de"},
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp36-cp36m-win_amd64.whl", hash = "sha256:c29cfc63fe70a58dad889e631f1ba4711c9ea80103f2b2b8d670a97f093076c8"},
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp37-cp37m-win32.whl", hash = "sha256:4d996377111e854b3dea90846f9b2f98766a44529fd8b72125e18c552381d928"},
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp37-cp37m-win_amd64.whl", hash = "sha256:739cd331b9f33a822d700273674a79a3157054e9358a01a0d553f094a5f4a8c9"},
 | 
			
		||||
    {file = "kivy_deps.gstreamer-0.1.17-cp38-cp38-win_amd64.whl", hash = "sha256:3d53d2c84c0a997c4cac6c239b1e0a6486e533836321003dc365ec42b97a664b"},
 | 
			
		||||
]
 | 
			
		||||
"kivy-deps.sdl2" = [
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp27-cp27m-win32.whl", hash = "sha256:1b987bdd4fbbcb31baf0d7fc9584ad99912179b8968311bb7e30fbeb14e98e0d"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp27-cp27m-win_amd64.whl", hash = "sha256:228128cdd8112dc7505ac43027a770476e9ef282e0b84ca68037133cd025960b"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp35-cp35m-win32.whl", hash = "sha256:053f26e8c05d5545bdbc7eeb8c450b8e4410ee355792e9345af536110fe247e2"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp35-cp35m-win_amd64.whl", hash = "sha256:5ce23f1a3286d6288751a12b0eaefd02f947ea101bb807e9781b964e496fc3f3"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp36-cp36m-win32.whl", hash = "sha256:96e1fa89fd8b5351f2d3c26bbffd50df8d554b03fba4025ecc941d773d241698"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp36-cp36m-win_amd64.whl", hash = "sha256:c3ace0ddde0e59cdcaf260eda1daa0c05ca9bf8cd0c4ea404539de25a5dcaec7"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp37-cp37m-win32.whl", hash = "sha256:7928746eaed51944c10d1bb36fcefebe3d1aff1b97ba32359c2c97ba74707e1b"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp37-cp37m-win_amd64.whl", hash = "sha256:2c2fd5a12a7a9afe3bb962b273561099a180edae91bb9c8f8386b72253fcae4a"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp38-cp38-win32.whl", hash = "sha256:9270fa8ed5130074b167a7a3a9c85efc3cfe3c04584ab084cb6ae9e4edfa8168"},
 | 
			
		||||
    {file = "kivy_deps.sdl2-0.1.22-cp38-cp38-win_amd64.whl", hash = "sha256:92ed97d3247bc8ce98f336cbc940bb889310199326e9ccf251c49ae7e4b80de8"},
 | 
			
		||||
]
 | 
			
		||||
kivy-garden = [
 | 
			
		||||
    {file = "Kivy Garden-0.1.4.tar.gz", hash = "sha256:9b7d9de5efacbcd0c4b3dd873b30622a86093c9965aa47b523c7a32f3eb34610"},
 | 
			
		||||
    {file = "kivy-garden-0.1.4.tar.gz", hash = "sha256:c256f42788421273a08fbb0a228f0fb0e80dd86b629fb8c0920507f645be6c72"},
 | 
			
		||||
]
 | 
			
		||||
packaging = [
 | 
			
		||||
    {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
 | 
			
		||||
    {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"},
 | 
			
		||||
]
 | 
			
		||||
pdf2image = [
 | 
			
		||||
    {file = "pdf2image-1.12.1.tar.gz", hash = "sha256:a0d9906f5507192210a8d5d7ead63145e9dec4bccc4564b1fb644e923913c31c"},
 | 
			
		||||
]
 | 
			
		||||
pefile = [
 | 
			
		||||
    {file = "pefile-2021.9.3.tar.gz", hash = "sha256:344a49e40a94e10849f0fe34dddc80f773a12b40675bf2f7be4b8be578bdd94a"},
 | 
			
		||||
]
 | 
			
		||||
pillow = [
 | 
			
		||||
    {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp35-cp35m-win32.whl", hash = "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp36-cp36m-win32.whl", hash = "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp37-cp37m-win32.whl", hash = "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"},
 | 
			
		||||
    {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"},
 | 
			
		||||
    {file = "Pillow-7.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6"},
 | 
			
		||||
    {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"},
 | 
			
		||||
    {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"},
 | 
			
		||||
    {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"},
 | 
			
		||||
]
 | 
			
		||||
pygments = [
 | 
			
		||||
    {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"},
 | 
			
		||||
    {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"},
 | 
			
		||||
]
 | 
			
		||||
pyinstaller = [
 | 
			
		||||
    {file = "PyInstaller-3.6.tar.gz", hash = "sha256:3730fa80d088f8bb7084d32480eb87cbb4ddb64123363763cf8f2a1378c1c4b7"},
 | 
			
		||||
]
 | 
			
		||||
pyparsing = [
 | 
			
		||||
    {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
 | 
			
		||||
    {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
 | 
			
		||||
]
 | 
			
		||||
pywin32-ctypes = [
 | 
			
		||||
    {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"},
 | 
			
		||||
    {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"},
 | 
			
		||||
]
 | 
			
		||||
requests = [
 | 
			
		||||
    {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"},
 | 
			
		||||
    {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"},
 | 
			
		||||
]
 | 
			
		||||
urllib3 = [
 | 
			
		||||
    {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"},
 | 
			
		||||
    {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"},
 | 
			
		||||
]
 | 
			
		||||
xlrd = [
 | 
			
		||||
    {file = "xlrd-1.2.0-py2.py3-none-any.whl", hash = "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde"},
 | 
			
		||||
    {file = "xlrd-1.2.0.tar.gz", hash = "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2"},
 | 
			
		||||
]
 | 
			
		||||
@ -35,7 +35,7 @@ describe('Finder tests', () => {
 | 
			
		||||
    await io.mkdirP(pythonDir);
 | 
			
		||||
    fs.writeFileSync(`${pythonDir}.complete`, 'hello');
 | 
			
		||||
    // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
 | 
			
		||||
    await finder.useCpythonVersion('3.x', 'x64');
 | 
			
		||||
    await finder.findPythonVersion('3.x', 'x64');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('Finds stable Python version if it is not installed, but exists in the manifest', async () => {
 | 
			
		||||
@ -52,7 +52,7 @@ describe('Finder tests', () => {
 | 
			
		||||
      fs.writeFileSync(`${pythonDir}.complete`, 'hello');
 | 
			
		||||
    });
 | 
			
		||||
    // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
 | 
			
		||||
    await finder.useCpythonVersion('1.2.3', 'x64');
 | 
			
		||||
    await finder.findPythonVersion('1.2.3', 'x64');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('Finds pre-release Python version in the manifest', async () => {
 | 
			
		||||
@ -74,17 +74,25 @@ describe('Finder tests', () => {
 | 
			
		||||
      fs.writeFileSync(`${pythonDir}.complete`, 'hello');
 | 
			
		||||
    });
 | 
			
		||||
    // This will throw if it doesn't find it in the manifest (because no such version exists)
 | 
			
		||||
    await finder.useCpythonVersion('1.2.3-beta.2', 'x64');
 | 
			
		||||
    await finder.findPythonVersion('1.2.3-beta.2', 'x64');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('Errors if Python is not installed', async () => {
 | 
			
		||||
    // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
 | 
			
		||||
    let thrown = false;
 | 
			
		||||
    try {
 | 
			
		||||
      await finder.useCpythonVersion('3.300000', 'x64');
 | 
			
		||||
      await finder.findPythonVersion('3.300000', 'x64');
 | 
			
		||||
    } catch {
 | 
			
		||||
      thrown = true;
 | 
			
		||||
    }
 | 
			
		||||
    expect(thrown).toBeTruthy();
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('Finds PyPy if it is installed', async () => {
 | 
			
		||||
    const pythonDir: string = path.join(toolDir, 'PyPy', '2.0.0', 'x64');
 | 
			
		||||
    await io.mkdirP(pythonDir);
 | 
			
		||||
    fs.writeFileSync(`${pythonDir}.complete`, 'hello');
 | 
			
		||||
    // This will throw if it doesn't find it in the cache (because no such version exists)
 | 
			
		||||
    await finder.findPythonVersion('pypy2', 'x64');
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -1,14 +1,8 @@
 | 
			
		||||
import * as cache from '@actions/cache';
 | 
			
		||||
import * as core from '@actions/core';
 | 
			
		||||
import {
 | 
			
		||||
  validateVersion,
 | 
			
		||||
  validatePythonVersionFormatForPyPy,
 | 
			
		||||
  isCacheFeatureAvailable
 | 
			
		||||
  validatePythonVersionFormatForPyPy
 | 
			
		||||
} from '../src/utils';
 | 
			
		||||
 | 
			
		||||
jest.mock('@actions/cache');
 | 
			
		||||
jest.mock('@actions/core');
 | 
			
		||||
 | 
			
		||||
describe('validatePythonVersionFormatForPyPy', () => {
 | 
			
		||||
  it.each([
 | 
			
		||||
    ['3.6', true],
 | 
			
		||||
@ -38,39 +32,3 @@ describe('validateVersion', () => {
 | 
			
		||||
    expect(validateVersion(input)).toEqual(expected);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
describe('isCacheFeatureAvailable', () => {
 | 
			
		||||
  it('isCacheFeatureAvailable disabled on GHES', () => {
 | 
			
		||||
    jest.spyOn(cache, 'isFeatureAvailable').mockImplementation(() => false);
 | 
			
		||||
    try {
 | 
			
		||||
      process.env['GITHUB_SERVER_URL'] = 'http://example.com';
 | 
			
		||||
      isCacheFeatureAvailable();
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      expect(error).toHaveProperty(
 | 
			
		||||
        'message',
 | 
			
		||||
        'Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.'
 | 
			
		||||
      );
 | 
			
		||||
    } finally {
 | 
			
		||||
      delete process.env['GITHUB_SERVER_URL'];
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('isCacheFeatureAvailable disabled on dotcom', () => {
 | 
			
		||||
    jest.spyOn(cache, 'isFeatureAvailable').mockImplementation(() => false);
 | 
			
		||||
    const infoMock = jest.spyOn(core, 'warning');
 | 
			
		||||
    const message =
 | 
			
		||||
      'The runner was not able to contact the cache service. Caching will be skipped';
 | 
			
		||||
    try {
 | 
			
		||||
      process.env['GITHUB_SERVER_URL'] = 'http://github.com';
 | 
			
		||||
      expect(isCacheFeatureAvailable()).toBe(false);
 | 
			
		||||
      expect(infoMock).toHaveBeenCalledWith(message);
 | 
			
		||||
    } finally {
 | 
			
		||||
      delete process.env['GITHUB_SERVER_URL'];
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('isCacheFeatureAvailable is enabled', () => {
 | 
			
		||||
    jest.spyOn(cache, 'isFeatureAvailable').mockImplementation(() => true);
 | 
			
		||||
    expect(isCacheFeatureAvailable()).toBe(true);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ inputs:
 | 
			
		||||
    description: "Version range or exact version of a Python version to use, using SemVer's version range syntax."
 | 
			
		||||
    default: '3.x'
 | 
			
		||||
  cache:
 | 
			
		||||
    description: 'Used to specify a package manager for caching in the default directory. Supported values: pip, pipenv, poetry.'
 | 
			
		||||
    description: 'Used to specify a package manager for caching in the default directory. Supported values: pip, pipenv.'
 | 
			
		||||
    required: false
 | 
			
		||||
  architecture:
 | 
			
		||||
    description: 'The target architecture (x86, x64) of the Python interpreter.'
 | 
			
		||||
@ -20,7 +20,7 @@ outputs:
 | 
			
		||||
  python-version:
 | 
			
		||||
    description: "The installed python version. Useful when given a version range as input."
 | 
			
		||||
runs:
 | 
			
		||||
  using: 'node16'
 | 
			
		||||
  using: 'node12'
 | 
			
		||||
  main: 'dist/setup/index.js'
 | 
			
		||||
  post: 'dist/cache-save/index.js'
 | 
			
		||||
  post-if: success()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2297
									
								
								dist/cache-save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2297
									
								
								dist/cache-save/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										6007
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6007
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										11417
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										11417
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										10
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								package.json
									
									
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "setup-python",
 | 
			
		||||
  "version": "3.1.0",
 | 
			
		||||
  "version": "2.3.3",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "description": "Setup python action",
 | 
			
		||||
  "main": "dist/index.js",
 | 
			
		||||
@ -23,8 +23,8 @@
 | 
			
		||||
  "author": "GitHub",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@actions/cache": "^2.0.0",
 | 
			
		||||
    "@actions/core": "^1.2.3",
 | 
			
		||||
    "@actions/cache": "^1.0.8",
 | 
			
		||||
    "@actions/core": "^1.10.0",
 | 
			
		||||
    "@actions/exec": "^1.1.0",
 | 
			
		||||
    "@actions/glob": "^0.2.0",
 | 
			
		||||
    "@actions/io": "^1.0.2",
 | 
			
		||||
@ -33,7 +33,7 @@
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/jest": "^27.0.2",
 | 
			
		||||
    "@types/node": "^16.11.25",
 | 
			
		||||
    "@types/node": "^12.20.36",
 | 
			
		||||
    "@types/semver": "^7.1.0",
 | 
			
		||||
    "@zeit/ncc": "^0.22.0",
 | 
			
		||||
    "husky": "^7.0.2",
 | 
			
		||||
@ -41,7 +41,7 @@
 | 
			
		||||
    "jest-circus": "^27.2.5",
 | 
			
		||||
    "prettier": "^2.0.2",
 | 
			
		||||
    "ts-jest": "^27.0.5",
 | 
			
		||||
    "typescript": "^4.2.3"
 | 
			
		||||
    "typescript": "^3.8.3"
 | 
			
		||||
  },
 | 
			
		||||
  "husky": {
 | 
			
		||||
    "skipCI": true,
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,9 @@
 | 
			
		||||
import PipCache from './pip-cache';
 | 
			
		||||
import PipenvCache from './pipenv-cache';
 | 
			
		||||
import PoetryCache from './poetry-cache';
 | 
			
		||||
 | 
			
		||||
export enum PackageManagers {
 | 
			
		||||
  Pip = 'pip',
 | 
			
		||||
  Pipenv = 'pipenv',
 | 
			
		||||
  Poetry = 'poetry'
 | 
			
		||||
  Pipenv = 'pipenv'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getCacheDistributor(
 | 
			
		||||
@ -18,8 +16,6 @@ export function getCacheDistributor(
 | 
			
		||||
      return new PipCache(pythonVersion, cacheDependencyPath);
 | 
			
		||||
    case PackageManagers.Pipenv:
 | 
			
		||||
      return new PipenvCache(pythonVersion, cacheDependencyPath);
 | 
			
		||||
    case PackageManagers.Poetry:
 | 
			
		||||
      return new PoetryCache(pythonVersion, cacheDependencyPath);
 | 
			
		||||
    default:
 | 
			
		||||
      throw new Error(`Caching for '${packageManager}' is not supported`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -1,76 +0,0 @@
 | 
			
		||||
import * as glob from '@actions/glob';
 | 
			
		||||
import * as os from 'os';
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
import * as exec from '@actions/exec';
 | 
			
		||||
 | 
			
		||||
import CacheDistributor from './cache-distributor';
 | 
			
		||||
 | 
			
		||||
class PoetryCache extends CacheDistributor {
 | 
			
		||||
  constructor(
 | 
			
		||||
    private pythonVersion: string,
 | 
			
		||||
    protected patterns: string = '**/poetry.lock'
 | 
			
		||||
  ) {
 | 
			
		||||
    super('poetry', patterns);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected async getCacheGlobalDirectories() {
 | 
			
		||||
    const poetryConfig = await this.getPoetryConfiguration();
 | 
			
		||||
 | 
			
		||||
    const cacheDir = poetryConfig['cache-dir'];
 | 
			
		||||
    const virtualenvsPath = poetryConfig['virtualenvs.path'].replace(
 | 
			
		||||
      '{cache-dir}',
 | 
			
		||||
      cacheDir
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    const paths = [virtualenvsPath];
 | 
			
		||||
 | 
			
		||||
    if (poetryConfig['virtualenvs.in-project'] === true) {
 | 
			
		||||
      paths.push(path.join(process.cwd(), '.venv'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return paths;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected async computeKeys() {
 | 
			
		||||
    const hash = await glob.hashFiles(this.patterns);
 | 
			
		||||
    const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-${hash}`;
 | 
			
		||||
    const restoreKey = undefined;
 | 
			
		||||
    return {
 | 
			
		||||
      primaryKey,
 | 
			
		||||
      restoreKey
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private async getPoetryConfiguration() {
 | 
			
		||||
    const {stdout, stderr, exitCode} = await exec.getExecOutput('poetry', [
 | 
			
		||||
      'config',
 | 
			
		||||
      '--list'
 | 
			
		||||
    ]);
 | 
			
		||||
 | 
			
		||||
    if (exitCode && stderr) {
 | 
			
		||||
      throw new Error(
 | 
			
		||||
        'Could not get cache folder path for poetry package manager'
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const lines = stdout.trim().split('\n');
 | 
			
		||||
 | 
			
		||||
    const config: any = {};
 | 
			
		||||
 | 
			
		||||
    for (let line of lines) {
 | 
			
		||||
      line = line.replace(/#.*$/, '');
 | 
			
		||||
 | 
			
		||||
      const [key, value] = line.split('=').map(part => part.trim());
 | 
			
		||||
 | 
			
		||||
      config[key] = JSON.parse(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return config as {
 | 
			
		||||
      'cache-dir': string;
 | 
			
		||||
      'virtualenvs.in-project': boolean;
 | 
			
		||||
      'virtualenvs.path': string;
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default PoetryCache;
 | 
			
		||||
@ -30,7 +30,52 @@ function binDir(installDir: string): string {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function useCpythonVersion(
 | 
			
		||||
// Note on the tool cache layout for PyPy:
 | 
			
		||||
// PyPy has its own versioning scheme that doesn't follow the Python versioning scheme.
 | 
			
		||||
// A particular version of PyPy may contain one or more versions of the Python interpreter.
 | 
			
		||||
// For example, PyPy 7.0 contains Python 2.7, 3.5, and 3.6-alpha.
 | 
			
		||||
// We only care about the Python version, so we don't use the PyPy version for the tool cache.
 | 
			
		||||
function usePyPy(
 | 
			
		||||
  majorVersion: '2' | '3.6',
 | 
			
		||||
  architecture: string
 | 
			
		||||
): InstalledVersion {
 | 
			
		||||
  const findPyPy = tc.find.bind(undefined, 'PyPy', majorVersion);
 | 
			
		||||
  let installDir: string | null = findPyPy(architecture);
 | 
			
		||||
 | 
			
		||||
  if (!installDir && IS_WINDOWS) {
 | 
			
		||||
    // PyPy only precompiles binaries for x86, but the architecture parameter defaults to x64.
 | 
			
		||||
    // On our Windows virtual environments, we only install an x86 version.
 | 
			
		||||
    // Fall back to x86.
 | 
			
		||||
    installDir = findPyPy('x86');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!installDir) {
 | 
			
		||||
    // PyPy not installed in $(Agent.ToolsDirectory)
 | 
			
		||||
    throw new Error(`PyPy ${majorVersion} not found`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // For PyPy, Windows uses 'bin', not 'Scripts'.
 | 
			
		||||
  const _binDir = path.join(installDir, 'bin');
 | 
			
		||||
 | 
			
		||||
  // On Linux and macOS, the Python interpreter is in 'bin'.
 | 
			
		||||
  // On Windows, it is in the installation root.
 | 
			
		||||
  const pythonLocation = IS_WINDOWS ? installDir : _binDir;
 | 
			
		||||
  core.exportVariable('pythonLocation', pythonLocation);
 | 
			
		||||
 | 
			
		||||
  core.addPath(installDir);
 | 
			
		||||
  core.addPath(_binDir);
 | 
			
		||||
  // Starting from PyPy 7.3.1, the folder that is used for pip and anything that pip installs should be "Scripts" on Windows.
 | 
			
		||||
  if (IS_WINDOWS) {
 | 
			
		||||
    core.addPath(path.join(installDir, 'Scripts'));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const impl = 'pypy' + majorVersion.toString();
 | 
			
		||||
  core.setOutput('python-version', impl);
 | 
			
		||||
 | 
			
		||||
  return {impl: impl, version: versionFromPath(installDir)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function useCpythonVersion(
 | 
			
		||||
  version: string,
 | 
			
		||||
  architecture: string
 | 
			
		||||
): Promise<InstalledVersion> {
 | 
			
		||||
@ -141,3 +186,18 @@ export function pythonVersionToSemantic(versionSpec: string) {
 | 
			
		||||
  const prereleaseVersion = /(\d+\.\d+\.\d+)((?:a|b|rc)\d*)/g;
 | 
			
		||||
  return versionSpec.replace(prereleaseVersion, '$1-$2');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function findPythonVersion(
 | 
			
		||||
  version: string,
 | 
			
		||||
  architecture: string
 | 
			
		||||
): Promise<InstalledVersion> {
 | 
			
		||||
  switch (version.toUpperCase()) {
 | 
			
		||||
    case 'PYPY2':
 | 
			
		||||
      return usePyPy('2', architecture);
 | 
			
		||||
    case 'PYPY3':
 | 
			
		||||
      // keep pypy3 pointing to 3.6 for backward compatibility
 | 
			
		||||
      return usePyPy('3.6', architecture);
 | 
			
		||||
    default:
 | 
			
		||||
      return await useCpythonVersion(version, architecture);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,13 +4,16 @@ import * as finderPyPy from './find-pypy';
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
import * as os from 'os';
 | 
			
		||||
import {getCacheDistributor} from './cache-distributions/cache-factory';
 | 
			
		||||
import {isCacheFeatureAvailable} from './utils';
 | 
			
		||||
import {isGhes} from './utils';
 | 
			
		||||
 | 
			
		||||
function isPyPyVersion(versionSpec: string) {
 | 
			
		||||
  return versionSpec.startsWith('pypy-');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function cacheDependencies(cache: string, pythonVersion: string) {
 | 
			
		||||
  if (isGhes()) {
 | 
			
		||||
    throw new Error('Caching is not supported on GHES');
 | 
			
		||||
  }
 | 
			
		||||
  const cacheDependencyPath =
 | 
			
		||||
    core.getInput('cache-dependency-path') || undefined;
 | 
			
		||||
  const cacheDistributor = getCacheDistributor(
 | 
			
		||||
@ -25,6 +28,11 @@ async function run() {
 | 
			
		||||
  try {
 | 
			
		||||
    const version = core.getInput('python-version');
 | 
			
		||||
    if (version) {
 | 
			
		||||
      if (version.trim().startsWith('2')) {
 | 
			
		||||
        core.warning(
 | 
			
		||||
          'The support for python 2.7 will be removed on June 19. Related issue: https://github.com/actions/setup-python/issues/672'
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
      let pythonVersion: string;
 | 
			
		||||
      const arch: string = core.getInput('architecture') || os.arch();
 | 
			
		||||
      if (isPyPyVersion(version)) {
 | 
			
		||||
@ -34,13 +42,13 @@ async function run() {
 | 
			
		||||
          `Successfully setup PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})`
 | 
			
		||||
        );
 | 
			
		||||
      } else {
 | 
			
		||||
        const installed = await finder.useCpythonVersion(version, arch);
 | 
			
		||||
        const installed = await finder.findPythonVersion(version, arch);
 | 
			
		||||
        pythonVersion = installed.version;
 | 
			
		||||
        core.info(`Successfully setup ${installed.impl} (${pythonVersion})`);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const cache = core.getInput('cache');
 | 
			
		||||
      if (cache && isCacheFeatureAvailable()) {
 | 
			
		||||
      if (cache) {
 | 
			
		||||
        await cacheDependencies(cache, pythonVersion);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/utils.ts
									
									
									
									
									
								
							@ -1,5 +1,3 @@
 | 
			
		||||
import * as cache from '@actions/cache';
 | 
			
		||||
import * as core from '@actions/core';
 | 
			
		||||
import fs from 'fs';
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
import * as semver from 'semver';
 | 
			
		||||
@ -25,7 +23,7 @@ export interface IPyPyManifestRelease {
 | 
			
		||||
  files: IPyPyManifestAsset[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** create Symlinks for downflfoaded PyPy
 | 
			
		||||
/** create Symlinks for downloaded PyPy
 | 
			
		||||
 *  It should be executed only for downloaded versions in runtime, because
 | 
			
		||||
 *  toolcache versions have this setup.
 | 
			
		||||
 */
 | 
			
		||||
@ -101,21 +99,3 @@ export function isGhes(): boolean {
 | 
			
		||||
  );
 | 
			
		||||
  return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function isCacheFeatureAvailable(): boolean {
 | 
			
		||||
  if (!cache.isFeatureAvailable()) {
 | 
			
		||||
    if (isGhes()) {
 | 
			
		||||
      throw new Error(
 | 
			
		||||
        'Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.'
 | 
			
		||||
      );
 | 
			
		||||
    } else {
 | 
			
		||||
      core.warning(
 | 
			
		||||
        'The runner was not able to contact the cache service. Caching will be skipped'
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user