Merge pull request #281 from patrick91/feature/poetry-caching
Add poetry caching support
This commit is contained in:
		
						commit
						6c566026c0
					
				
							
								
								
									
										30
									
								
								.github/workflows/e2e-cache.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.github/workflows/e2e-cache.yml
									
									
									
									
										vendored
									
									
								
							| @ -21,7 +21,7 @@ jobs: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [ubuntu-latest, windows-latest, macos-latest] | ||||
|         python-version: ['3.8', '3.9', 'pypy-3.7-v7.x'] | ||||
|         python-version: ['3.9', 'pypy-3.7-v7.x'] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Setup Python | ||||
| @ -39,7 +39,7 @@ jobs: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [ubuntu-latest, windows-latest, macos-latest] | ||||
|         python-version: ['3.8', '3.9', 'pypy-3.7-v7.x'] | ||||
|         python-version: ['3.9', 'pypy-3.7-v7.x'] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Setup Python | ||||
| @ -52,6 +52,28 @@ jobs: | ||||
|       - 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 | ||||
| 
 | ||||
|   python-pip-dependencies-caching-path: | ||||
|     name: Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) | ||||
|     runs-on: ${{ matrix.os }} | ||||
| @ -59,7 +81,7 @@ jobs: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [ubuntu-latest, windows-latest, macos-latest] | ||||
|         python-version: ['3.8', '3.9', 'pypy-3.7-v7.x'] | ||||
|         python-version: ['3.9', 'pypy-3.7-v7.x'] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Setup Python | ||||
| @ -78,7 +100,7 @@ jobs: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [ubuntu-latest, windows-latest, macos-latest] | ||||
|         python-version: ['3.8', '3.9', 'pypy-3.7-v7.x'] | ||||
|         python-version: ['3.9', 'pypy-3.7-v7.x'] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Setup Python | ||||
|  | ||||
							
								
								
									
										25
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								README.md
									
									
									
									
									
								
							| @ -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 and pipenv. | ||||
| - optionally caching dependencies for pip, pipenv and poetry. | ||||
| - 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 and pipenv dependencies | ||||
| - Support for built-in caching of pip, pipenv and poetry dependencies | ||||
| 
 | ||||
| # Usage | ||||
| 
 | ||||
| @ -209,18 +209,19 @@ 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` and `pipenv`. 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`, `pipenv` and `poetry`. 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 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. | ||||
| 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. | ||||
| 
 | ||||
|  - 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: | ||||
| @ -245,6 +246,20 @@ steps: | ||||
| - 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: | ||||
|  | ||||
| @ -10,6 +10,16 @@ describe('restore-cache', () => { | ||||
|     '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; | ||||
| @ -47,6 +57,9 @@ describe('restore-cache', () => { | ||||
|       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}; | ||||
|     }); | ||||
| @ -82,7 +95,8 @@ describe('restore-cache', () => { | ||||
|       ], | ||||
|       ['pip', '3.8.12', '__tests__/data/requirements.txt', requirementsHash], | ||||
|       ['pipenv', '3.9.1', undefined, pipFileLockHash], | ||||
|       ['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash] | ||||
|       ['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash], | ||||
|       ['poetry', '3.9.1', undefined, poetryLockHash] | ||||
|     ])( | ||||
|       'restored dependencies for %s by primaryKey', | ||||
|       async (packageManager, pythonVersion, dependencyFile, fileHash) => { | ||||
| @ -138,7 +152,8 @@ describe('restore-cache', () => { | ||||
|       ], | ||||
|       ['pip', '3.8.12', '__tests__/data/requirements.txt', pipFileLockHash], | ||||
|       ['pipenv', '3.9.1', undefined, requirementsHash], | ||||
|       ['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash] | ||||
|       ['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash], | ||||
|       ['poetry', '3.9.1', undefined, requirementsHash] | ||||
|     ])( | ||||
|       'restored dependencies for %s by primaryKey', | ||||
|       async (packageManager, pythonVersion, dependencyFile, fileHash) => { | ||||
| @ -154,10 +169,17 @@ describe('restore-cache', () => { | ||||
|         ); | ||||
|         await cacheDistributor.restoreCache(); | ||||
|         let result = ''; | ||||
|         if (packageManager !== 'pipenv') { | ||||
|           result = `Cache restored from key: ${fileHash}`; | ||||
|         } else { | ||||
|           result = 'pipenv cache is not found'; | ||||
| 
 | ||||
|         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; | ||||
|         } | ||||
| 
 | ||||
|         expect(infoSpy).toHaveBeenCalledWith(result); | ||||
|  | ||||
| @ -11,6 +11,8 @@ describe('run', () => { | ||||
|     'd8110e0006d7fb5ee76365d565eef9d37df1d11598b912d3eb66d398d57a1121'; | ||||
|   const requirementsLinuxHash = | ||||
|     '2d0ff7f46b0e120e3d3294db65768b474934242637b9899b873e6283dfd16d7c'; | ||||
|   const poetryLockHash = | ||||
|     '571bf984f8d210e6a97f854e479fdd4a2b5af67b5fdac109ec337a0ea16e7836'; | ||||
| 
 | ||||
|   // core spy
 | ||||
|   let infoSpy: jest.SpyInstance; | ||||
| @ -114,6 +116,22 @@ 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', () => { | ||||
| @ -168,6 +186,32 @@ 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(() => { | ||||
|  | ||||
							
								
								
									
										413
									
								
								__tests__/data/poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										413
									
								
								__tests__/data/poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,413 @@ | ||||
| [[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"}, | ||||
| ] | ||||
| @ -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.' | ||||
|     description: 'Used to specify a package manager for caching in the default directory. Supported values: pip, pipenv, poetry.' | ||||
|     required: false | ||||
|   architecture: | ||||
|     description: 'The target architecture (x86, x64) of the Python interpreter.' | ||||
|  | ||||
							
								
								
									
										99
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										99
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							| @ -38756,7 +38756,100 @@ exports.setLogLevel = setLogLevel; | ||||
| /* 495 */, | ||||
| /* 496 */, | ||||
| /* 497 */, | ||||
| /* 498 */, | ||||
| /* 498 */ | ||||
| /***/ (function(__unusedmodule, exports, __webpack_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||||
|     return (mod && mod.__esModule) ? mod : { "default": mod }; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const glob = __importStar(__webpack_require__(281)); | ||||
| const path = __importStar(__webpack_require__(622)); | ||||
| const exec = __importStar(__webpack_require__(986)); | ||||
| const cache_distributor_1 = __importDefault(__webpack_require__(435)); | ||||
| class PoetryCache extends cache_distributor_1.default { | ||||
|     constructor(pythonVersion, patterns = '**/poetry.lock') { | ||||
|         super('poetry', patterns); | ||||
|         this.pythonVersion = pythonVersion; | ||||
|         this.patterns = patterns; | ||||
|     } | ||||
|     getCacheGlobalDirectories() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const poetryConfig = yield 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; | ||||
|         }); | ||||
|     } | ||||
|     computeKeys() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const hash = yield 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 | ||||
|             }; | ||||
|         }); | ||||
|     } | ||||
|     getPoetryConfiguration() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const { stdout, stderr, exitCode } = yield 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 = {}; | ||||
|             for (let line of lines) { | ||||
|                 line = line.replace(/#.*$/, ''); | ||||
|                 const [key, value] = line.split('=').map(part => part.trim()); | ||||
|                 config[key] = JSON.parse(value); | ||||
|             } | ||||
|             return config; | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.default = PoetryCache; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| /* 499 */ | ||||
| /***/ (function(module, __unusedexports, __webpack_require__) { | ||||
| 
 | ||||
| @ -44017,10 +44110,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| exports.getCacheDistributor = exports.PackageManagers = void 0; | ||||
| const pip_cache_1 = __importDefault(__webpack_require__(394)); | ||||
| const pipenv_cache_1 = __importDefault(__webpack_require__(235)); | ||||
| const poetry_cache_1 = __importDefault(__webpack_require__(498)); | ||||
| var PackageManagers; | ||||
| (function (PackageManagers) { | ||||
|     PackageManagers["Pip"] = "pip"; | ||||
|     PackageManagers["Pipenv"] = "pipenv"; | ||||
|     PackageManagers["Poetry"] = "poetry"; | ||||
| })(PackageManagers = exports.PackageManagers || (exports.PackageManagers = {})); | ||||
| function getCacheDistributor(packageManager, pythonVersion, cacheDependencyPath) { | ||||
|     switch (packageManager) { | ||||
| @ -44028,6 +44123,8 @@ function getCacheDistributor(packageManager, pythonVersion, cacheDependencyPath) | ||||
|             return new pip_cache_1.default(pythonVersion, cacheDependencyPath); | ||||
|         case PackageManagers.Pipenv: | ||||
|             return new pipenv_cache_1.default(pythonVersion, cacheDependencyPath); | ||||
|         case PackageManagers.Poetry: | ||||
|             return new poetry_cache_1.default(pythonVersion, cacheDependencyPath); | ||||
|         default: | ||||
|             throw new Error(`Caching for '${packageManager}' is not supported`); | ||||
|     } | ||||
|  | ||||
| @ -1,9 +1,11 @@ | ||||
| import PipCache from './pip-cache'; | ||||
| import PipenvCache from './pipenv-cache'; | ||||
| import PoetryCache from './poetry-cache'; | ||||
| 
 | ||||
| export enum PackageManagers { | ||||
|   Pip = 'pip', | ||||
|   Pipenv = 'pipenv' | ||||
|   Pipenv = 'pipenv', | ||||
|   Poetry = 'poetry' | ||||
| } | ||||
| 
 | ||||
| export function getCacheDistributor( | ||||
| @ -16,6 +18,8 @@ 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`); | ||||
|   } | ||||
|  | ||||
							
								
								
									
										76
									
								
								src/cache-distributions/poetry-cache.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								src/cache-distributions/poetry-cache.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| 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; | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user