mirror of
				https://git.mirrors.martin98.com/https://github.com/actions/setup-python
				synced 2025-10-31 13:41:06 +08:00 
			
		
		
		
	
							parent
							
								
									3f824b7ca6
								
							
						
					
					
						commit
						0d5da6a89a
					
				
							
								
								
									
										21
									
								
								.github/workflows/e2e-tests.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/e2e-tests.yml
									
									
									
									
										vendored
									
									
								
							| @ -79,3 +79,24 @@ jobs: | |||||||
|         run: python __tests__/verify-python.py 3.10 |         run: python __tests__/verify-python.py 3.10 | ||||||
|       - name: Run python-path sample 3.10 |       - name: Run python-path sample 3.10 | ||||||
|         run: pipx run --python '${{ steps.cp310.outputs.python-path }}' nox --version |         run: pipx run --python '${{ steps.cp310.outputs.python-path }}' nox --version | ||||||
|  | 
 | ||||||
|  |       - name: Run with setup-python ==3.8 | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           python-version: '==3.8' | ||||||
|  |       - name: Verify ==3.8 | ||||||
|  |         run: python __tests__/verify-python.py 3.8 | ||||||
|  | 
 | ||||||
|  |       - name: Run with setup-python <3.11 | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           python-version: '<3.11' | ||||||
|  |       - name: Verify <3.11 | ||||||
|  |         run: python __tests__/verify-python.py 3.10 | ||||||
|  | 
 | ||||||
|  |       - name: Run with setup-python >3.8 | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           python-version: '>3.8' | ||||||
|  |       - name: Verify >3.8 | ||||||
|  |         run: python __tests__/verify-python.py 3.11 | ||||||
|  | |||||||
							
								
								
									
										147
									
								
								.github/workflows/test-python.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										147
									
								
								.github/workflows/test-python.yml
									
									
									
									
										vendored
									
									
								
							| @ -86,7 +86,152 @@ jobs: | |||||||
|         id: setup-python |         id: setup-python | ||||||
|         uses: ./ |         uses: ./ | ||||||
|         with: |         with: | ||||||
|           python-version-file: '.python-version' |           python-version-file: .python-version | ||||||
|  | 
 | ||||||
|  |       - name: Check python-path | ||||||
|  |         run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' | ||||||
|  |         shell: bash | ||||||
|  | 
 | ||||||
|  |       - name: Validate version | ||||||
|  |         run: | | ||||||
|  |           $pythonVersion = (python --version) | ||||||
|  |           if ("Python ${{ matrix.python }}" -ne "$pythonVersion"){ | ||||||
|  |             Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python }}" | ||||||
|  |             exit 1 | ||||||
|  |           } | ||||||
|  |           $pythonVersion | ||||||
|  |         shell: pwsh | ||||||
|  | 
 | ||||||
|  |       - name: Run simple code | ||||||
|  |         run: python -c 'import math; print(math.factorial(5))' | ||||||
|  | 
 | ||||||
|  |   setup-versions-from-file-without-parameter: | ||||||
|  |     name: Setup ${{ matrix.python }} ${{ matrix.os }} version file without parameter | ||||||
|  |     runs-on: ${{ matrix.os }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] | ||||||
|  |         python: [3.5.4, 3.6.7, 3.7.5, 3.8.15, 3.9.13] | ||||||
|  |         exclude: | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.5.4 | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.6.7 | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.7.5 | ||||||
|  |           - os: windows-latest | ||||||
|  |             python: 3.8.15 | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  | 
 | ||||||
|  |       - name: build-version-file ${{ matrix.python }} | ||||||
|  |         run: echo ${{ matrix.python }} > .python-version | ||||||
|  | 
 | ||||||
|  |       - name: setup-python ${{ matrix.python }} | ||||||
|  |         id: setup-python | ||||||
|  |         uses: ./ | ||||||
|  | 
 | ||||||
|  |       - name: Check python-path | ||||||
|  |         run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' | ||||||
|  |         shell: bash | ||||||
|  | 
 | ||||||
|  |       - name: Validate version | ||||||
|  |         run: | | ||||||
|  |           $pythonVersion = (python --version) | ||||||
|  |           if ("Python ${{ matrix.python }}" -ne "$pythonVersion"){ | ||||||
|  |             Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python }}" | ||||||
|  |             exit 1 | ||||||
|  |           } | ||||||
|  |           $pythonVersion | ||||||
|  |         shell: pwsh | ||||||
|  | 
 | ||||||
|  |       - name: Run simple code | ||||||
|  |         run: python -c 'import math; print(math.factorial(5))' | ||||||
|  | 
 | ||||||
|  |   setup-versions-from-standard-pyproject-file: | ||||||
|  |     name: Setup ${{ matrix.python }} ${{ matrix.os }} standard pyproject file | ||||||
|  |     runs-on: ${{ matrix.os }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] | ||||||
|  |         python: [3.5.4, 3.6.7, 3.7.5, 3.8.15, 3.9.13] | ||||||
|  |         exclude: | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.5.4 | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.6.7 | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.7.5 | ||||||
|  |           - os: windows-latest | ||||||
|  |             python: 3.8.15 | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  | 
 | ||||||
|  |       - name: build-version-file ${{ matrix.python }} | ||||||
|  |         run: | | ||||||
|  |           echo '[project] | ||||||
|  |             requires-python = "${{ matrix.python }}" | ||||||
|  |           ' > pyproject.toml | ||||||
|  | 
 | ||||||
|  |       - name: setup-python ${{ matrix.python }} | ||||||
|  |         id: setup-python | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           python-version-file: pyproject.toml | ||||||
|  | 
 | ||||||
|  |       - name: Check python-path | ||||||
|  |         run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' | ||||||
|  |         shell: bash | ||||||
|  | 
 | ||||||
|  |       - name: Validate version | ||||||
|  |         run: | | ||||||
|  |           $pythonVersion = (python --version) | ||||||
|  |           if ("Python ${{ matrix.python }}" -ne "$pythonVersion"){ | ||||||
|  |             Write-Host "The current version is $pythonVersion; expected version is ${{ matrix.python }}" | ||||||
|  |             exit 1 | ||||||
|  |           } | ||||||
|  |           $pythonVersion | ||||||
|  |         shell: pwsh | ||||||
|  | 
 | ||||||
|  |       - name: Run simple code | ||||||
|  |         run: python -c 'import math; print(math.factorial(5))' | ||||||
|  | 
 | ||||||
|  |   setup-versions-from-poetry-pyproject-file: | ||||||
|  |     name: Setup ${{ matrix.python }} ${{ matrix.os }} poetry pyproject file | ||||||
|  |     runs-on: ${{ matrix.os }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] | ||||||
|  |         python: [3.5.4, 3.6.7, 3.7.5, 3.8.15, 3.9.13] | ||||||
|  |         exclude: | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.5.4 | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.6.7 | ||||||
|  |           - os: ubuntu-22.04 | ||||||
|  |             python: 3.7.5 | ||||||
|  |           - os: windows-latest | ||||||
|  |             python: 3.8.15 | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  | 
 | ||||||
|  |       - name: build-version-file ${{ matrix.python }} | ||||||
|  |         run: | | ||||||
|  |           echo '[tool.poetry.dependencies] | ||||||
|  |             python = "${{ matrix.python }}" | ||||||
|  |           ' > pyproject.toml | ||||||
|  | 
 | ||||||
|  |       - name: setup-python ${{ matrix.python }} | ||||||
|  |         id: setup-python | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           python-version-file: pyproject.toml | ||||||
| 
 | 
 | ||||||
|       - name: Check python-path |       - name: Check python-path | ||||||
|         run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' |         run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								.licenses/npm/@iarna/toml.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								.licenses/npm/@iarna/toml.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | --- | ||||||
|  | name: "@iarna/toml" | ||||||
|  | version: 2.2.5 | ||||||
|  | type: npm | ||||||
|  | summary: Better TOML parsing and stringifying all in that familiar JSON interface. | ||||||
|  | homepage: https://github.com/iarna/iarna-toml#readme | ||||||
|  | license: isc | ||||||
|  | licenses: | ||||||
|  | - sources: LICENSE | ||||||
|  |   text: |+ | ||||||
|  |     Copyright (c) 2016, Rebecca Turner <me@re-becca.org> | ||||||
|  | 
 | ||||||
|  |     Permission to use, copy, modify, and/or distribute this software for any | ||||||
|  |     purpose with or without fee is hereby granted, provided that the above | ||||||
|  |     copyright notice and this permission notice appear in all copies. | ||||||
|  | 
 | ||||||
|  |     THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||||
|  |     WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||||
|  |     MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||||
|  |     ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||||
|  |     WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||||
|  |     ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||||
|  |     OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  | 
 | ||||||
|  | notices: [] | ||||||
|  | ... | ||||||
| @ -1,9 +1,17 @@ | |||||||
| import * as cache from '@actions/cache'; | import * as cache from '@actions/cache'; | ||||||
| import * as core from '@actions/core'; | import * as core from '@actions/core'; | ||||||
|  | import * as io from '@actions/io'; | ||||||
|  | 
 | ||||||
|  | import fs from 'fs'; | ||||||
|  | import path from 'path'; | ||||||
|  | 
 | ||||||
| import { | import { | ||||||
|   validateVersion, |   validateVersion, | ||||||
|   validatePythonVersionFormatForPyPy, |   validatePythonVersionFormatForPyPy, | ||||||
|   isCacheFeatureAvailable |   isCacheFeatureAvailable, | ||||||
|  |   getVersionInputFromFile, | ||||||
|  |   getVersionInputFromPlainFile, | ||||||
|  |   getVersionInputFromTomlFile | ||||||
| } from '../src/utils'; | } from '../src/utils'; | ||||||
| 
 | 
 | ||||||
| jest.mock('@actions/cache'); | jest.mock('@actions/cache'); | ||||||
| @ -73,3 +81,58 @@ describe('isCacheFeatureAvailable', () => { | |||||||
|     expect(isCacheFeatureAvailable()).toBe(true); |     expect(isCacheFeatureAvailable()).toBe(true); | ||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
|  | 
 | ||||||
|  | const tempDir = path.join( | ||||||
|  |   __dirname, | ||||||
|  |   'runner', | ||||||
|  |   path.join(Math.random().toString(36).substring(7)), | ||||||
|  |   'temp' | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | describe('Version from file test', () => { | ||||||
|  |   it.each([getVersionInputFromPlainFile, getVersionInputFromFile])( | ||||||
|  |     'Version from plain file test', | ||||||
|  |     async _fn => { | ||||||
|  |       await io.mkdirP(tempDir); | ||||||
|  |       const pythonVersionFileName = 'python-version.file'; | ||||||
|  |       const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName); | ||||||
|  |       const pythonVersionFileContent = '3.7'; | ||||||
|  |       fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent); | ||||||
|  |       expect(_fn(pythonVersionFilePath)).toEqual([pythonVersionFileContent]); | ||||||
|  |     } | ||||||
|  |   ); | ||||||
|  |   it.each([getVersionInputFromTomlFile, getVersionInputFromFile])( | ||||||
|  |     'Version from standard pyproject.toml test', | ||||||
|  |     async _fn => { | ||||||
|  |       await io.mkdirP(tempDir); | ||||||
|  |       const pythonVersionFileName = 'pyproject.toml'; | ||||||
|  |       const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName); | ||||||
|  |       const pythonVersion = '>=3.7'; | ||||||
|  |       const pythonVersionFileContent = `[project]\nrequires-python = "${pythonVersion}"`; | ||||||
|  |       fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent); | ||||||
|  |       expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]); | ||||||
|  |     } | ||||||
|  |   ); | ||||||
|  |   it.each([getVersionInputFromTomlFile, getVersionInputFromFile])( | ||||||
|  |     'Version from poetry pyproject.toml test', | ||||||
|  |     async _fn => { | ||||||
|  |       await io.mkdirP(tempDir); | ||||||
|  |       const pythonVersionFileName = 'pyproject.toml'; | ||||||
|  |       const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName); | ||||||
|  |       const pythonVersion = '>=3.7'; | ||||||
|  |       const pythonVersionFileContent = `[tool.poetry.dependencies]\npython = "${pythonVersion}"`; | ||||||
|  |       fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent); | ||||||
|  |       expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]); | ||||||
|  |     } | ||||||
|  |   ); | ||||||
|  |   it.each([getVersionInputFromTomlFile, getVersionInputFromFile])( | ||||||
|  |     'Version undefined', | ||||||
|  |     async _fn => { | ||||||
|  |       await io.mkdirP(tempDir); | ||||||
|  |       const pythonVersionFileName = 'pyproject.toml'; | ||||||
|  |       const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName); | ||||||
|  |       fs.writeFileSync(pythonVersionFilePath, ``); | ||||||
|  |       expect(_fn(pythonVersionFilePath)).toEqual([]); | ||||||
|  |     } | ||||||
|  |   ); | ||||||
|  | }); | ||||||
|  | |||||||
							
								
								
									
										2294
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2294
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -78,6 +78,17 @@ steps: | |||||||
| 
 | 
 | ||||||
| You can also use several types of ranges that are specified in [semver](https://github.com/npm/node-semver#ranges), for instance: | You can also use several types of ranges that are specified in [semver](https://github.com/npm/node-semver#ranges), for instance: | ||||||
| 
 | 
 | ||||||
|  | - **[ranges](https://github.com/npm/node-semver#ranges)** to download and set up the latest available version of Python satisfying a range: | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | steps: | ||||||
|  | - uses: actions/checkout@v3 | ||||||
|  | - uses: actions/setup-python@v4 | ||||||
|  |   with: | ||||||
|  |     python-version: '>=3.9 <3.10' | ||||||
|  | - run: python my_script.py | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
| - **[hyphen ranges](https://github.com/npm/node-semver#hyphen-ranges-xyz---abc)** to download and set up the latest available version of Python (includes both pre-release and stable versions): | - **[hyphen ranges](https://github.com/npm/node-semver#hyphen-ranges-xyz---abc)** to download and set up the latest available version of Python (includes both pre-release and stable versions): | ||||||
| 
 | 
 | ||||||
| ```yaml | ```yaml | ||||||
| @ -251,6 +262,16 @@ steps: | |||||||
|     python-version-file: '.python-version' # Read python version from a file .python-version |     python-version-file: '.python-version' # Read python version from a file .python-version | ||||||
| - run: python my_script.py | - run: python my_script.py | ||||||
| ``` | ``` | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | steps: | ||||||
|  | - uses: actions/checkout@v3 | ||||||
|  | - uses: actions/setup-python@v4 | ||||||
|  |   with: | ||||||
|  |     python-version-file: 'pyproject.toml' # Read python version from a file pyproject.toml | ||||||
|  | - run: python my_script.py | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
| ## Check latest version | ## Check latest version | ||||||
| 
 | 
 | ||||||
| The `check-latest` flag defaults to `false`. Use the default or set `check-latest` to `false` if you prefer stability and if you want to ensure a specific `Python or PyPy` version is always used. | The `check-latest` flag defaults to `false`. Use the default or set `check-latest` to `false` if you prefer stability and if you want to ensure a specific `Python or PyPy` version is always used. | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										11
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -16,6 +16,7 @@ | |||||||
|         "@actions/http-client": "^1.0.11", |         "@actions/http-client": "^1.0.11", | ||||||
|         "@actions/io": "^1.0.2", |         "@actions/io": "^1.0.2", | ||||||
|         "@actions/tool-cache": "^1.5.5", |         "@actions/tool-cache": "^1.5.5", | ||||||
|  |         "@iarna/toml": "^2.2.5", | ||||||
|         "semver": "^7.1.3" |         "semver": "^7.1.3" | ||||||
|       }, |       }, | ||||||
|       "devDependencies": { |       "devDependencies": { | ||||||
| @ -2048,6 +2049,11 @@ | |||||||
|       "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", |       "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@iarna/toml": { | ||||||
|  |       "version": "2.2.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", | ||||||
|  |       "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" | ||||||
|  |     }, | ||||||
|     "node_modules/@istanbuljs/load-nyc-config": { |     "node_modules/@istanbuljs/load-nyc-config": { | ||||||
|       "version": "1.1.0", |       "version": "1.1.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", |       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", | ||||||
| @ -8519,6 +8525,11 @@ | |||||||
|       "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", |       "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "@iarna/toml": { | ||||||
|  |       "version": "2.2.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", | ||||||
|  |       "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" | ||||||
|  |     }, | ||||||
|     "@istanbuljs/load-nyc-config": { |     "@istanbuljs/load-nyc-config": { | ||||||
|       "version": "1.1.0", |       "version": "1.1.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", |       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ | |||||||
|     "@actions/http-client": "^1.0.11", |     "@actions/http-client": "^1.0.11", | ||||||
|     "@actions/io": "^1.0.2", |     "@actions/io": "^1.0.2", | ||||||
|     "@actions/tool-cache": "^1.5.5", |     "@actions/tool-cache": "^1.5.5", | ||||||
|  |     "@iarna/toml": "^2.2.5", | ||||||
|     "semver": "^7.1.3" |     "semver": "^7.1.3" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  | |||||||
| @ -5,7 +5,13 @@ import * as path from 'path'; | |||||||
| import * as os from 'os'; | import * as os from 'os'; | ||||||
| import fs from 'fs'; | import fs from 'fs'; | ||||||
| import {getCacheDistributor} from './cache-distributions/cache-factory'; | import {getCacheDistributor} from './cache-distributions/cache-factory'; | ||||||
| import {isCacheFeatureAvailable, logWarning, IS_MAC} from './utils'; | import { | ||||||
|  |   isCacheFeatureAvailable, | ||||||
|  |   logWarning, | ||||||
|  |   IS_MAC, | ||||||
|  |   getVersionInputFromFile, | ||||||
|  |   getVersionInputFromPlainFile | ||||||
|  | } from './utils'; | ||||||
| 
 | 
 | ||||||
| function isPyPyVersion(versionSpec: string) { | function isPyPyVersion(versionSpec: string) { | ||||||
|   return versionSpec.startsWith('pypy'); |   return versionSpec.startsWith('pypy'); | ||||||
| @ -22,43 +28,46 @@ async function cacheDependencies(cache: string, pythonVersion: string) { | |||||||
|   await cacheDistributor.restoreCache(); |   await cacheDistributor.restoreCache(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function resolveVersionInput() { | function resolveVersionInputFromDefaultFile(): string[] { | ||||||
|   const versions = core.getMultilineInput('python-version'); |   const couples: [string, (versionFile: string) => string[]][] = [ | ||||||
|   let versionFile = core.getInput('python-version-file'); |     ['.python-version', getVersionInputFromPlainFile] | ||||||
| 
 |   ]; | ||||||
|   if (versions.length && versionFile) { |   for (const [versionFile, _fn] of couples) { | ||||||
|     core.warning( |     logWarning( | ||||||
|       'Both python-version and python-version-file inputs are specified, only python-version will be used.' |       `Neither 'python-version' nor 'python-version-file' inputs were supplied. Attempting to find '${versionFile}' file.` | ||||||
|     ); |     ); | ||||||
|  |     if (fs.existsSync(versionFile)) { | ||||||
|  |       return _fn(versionFile); | ||||||
|  |     } else { | ||||||
|  |       logWarning(`${versionFile} doesn't exist.`); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |   return []; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function resolveVersionInput() { | ||||||
|  |   let versions = core.getMultilineInput('python-version'); | ||||||
|  |   const versionFile = core.getInput('python-version-file'); | ||||||
| 
 | 
 | ||||||
|   if (versions.length) { |   if (versions.length) { | ||||||
|     return versions; |     if (versionFile) { | ||||||
|   } |       core.warning( | ||||||
| 
 |         'Both python-version and python-version-file inputs are specified, only python-version will be used.' | ||||||
|   if (versionFile) { |  | ||||||
|     if (!fs.existsSync(versionFile)) { |  | ||||||
|       throw new Error( |  | ||||||
|         `The specified python version file at: ${versionFile} doesn't exist.` |  | ||||||
|       ); |       ); | ||||||
|     } |     } | ||||||
|     const version = fs.readFileSync(versionFile, 'utf8'); |   } else { | ||||||
|     core.info(`Resolved ${versionFile} as ${version}`); |     if (versionFile) { | ||||||
|     return [version]; |       if (!fs.existsSync(versionFile)) { | ||||||
|  |         throw new Error( | ||||||
|  |           `The specified python version file at: ${versionFile} doesn't exist.` | ||||||
|  |         ); | ||||||
|  |       } | ||||||
|  |       versions = getVersionInputFromFile(versionFile); | ||||||
|  |     } else { | ||||||
|  |       versions = resolveVersionInputFromDefaultFile(); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   logWarning( |  | ||||||
|     "Neither 'python-version' nor 'python-version-file' inputs were supplied. Attempting to find '.python-version' file." |  | ||||||
|   ); |  | ||||||
|   versionFile = '.python-version'; |  | ||||||
|   if (fs.existsSync(versionFile)) { |  | ||||||
|     const version = fs.readFileSync(versionFile, 'utf8'); |  | ||||||
|     core.info(`Resolved ${versionFile} as ${version}`); |  | ||||||
|     return [version]; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   logWarning(`${versionFile} doesn't exist.`); |  | ||||||
| 
 |  | ||||||
|   return versions; |   return versions; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										71
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								src/utils.ts
									
									
									
									
									
								
							| @ -4,6 +4,7 @@ import * as core from '@actions/core'; | |||||||
| import fs from 'fs'; | import fs from 'fs'; | ||||||
| import * as path from 'path'; | import * as path from 'path'; | ||||||
| import * as semver from 'semver'; | import * as semver from 'semver'; | ||||||
|  | import * as toml from '@iarna/toml'; | ||||||
| import * as exec from '@actions/exec'; | import * as exec from '@actions/exec'; | ||||||
| 
 | 
 | ||||||
| export const IS_WINDOWS = process.platform === 'win32'; | export const IS_WINDOWS = process.platform === 'win32'; | ||||||
| @ -181,3 +182,73 @@ export async function getOSInfo() { | |||||||
|     return osInfo; |     return osInfo; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Extract a value from an object by following the keys path provided. | ||||||
|  |  * If the value is present, it is returned. Otherwise undefined is returned. | ||||||
|  |  */ | ||||||
|  | function extractValue(obj: any, keys: string[]): string | undefined { | ||||||
|  |   if (keys.length > 0) { | ||||||
|  |     const value = obj[keys[0]]; | ||||||
|  |     if (keys.length > 1 && value !== undefined) { | ||||||
|  |       return extractValue(value, keys.slice(1)); | ||||||
|  |     } else { | ||||||
|  |       return value; | ||||||
|  |     } | ||||||
|  |   } else { | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Python version extracted from the TOML file. | ||||||
|  |  * If the `project` key is present at the root level, the version is assumed to | ||||||
|  |  * be specified according to PEP 621 in `project.requires-python`. | ||||||
|  |  * Otherwise, if the `tool` key is present at the root level, the version is | ||||||
|  |  * assumed to be specified using poetry under `tool.poetry.dependencies.python`. | ||||||
|  |  * If none is present, returns an empty list. | ||||||
|  |  */ | ||||||
|  | export function getVersionInputFromTomlFile(versionFile: string): string[] { | ||||||
|  |   core.debug(`Trying to resolve version form ${versionFile}`); | ||||||
|  | 
 | ||||||
|  |   const pyprojectFile = fs.readFileSync(versionFile, 'utf8'); | ||||||
|  |   const pyprojectConfig = toml.parse(pyprojectFile); | ||||||
|  |   let keys = []; | ||||||
|  | 
 | ||||||
|  |   if ('project' in pyprojectConfig) { | ||||||
|  |     // standard project metadata (PEP 621)
 | ||||||
|  |     keys = ['project', 'requires-python']; | ||||||
|  |   } else { | ||||||
|  |     // python poetry
 | ||||||
|  |     keys = ['tool', 'poetry', 'dependencies', 'python']; | ||||||
|  |   } | ||||||
|  |   const versions = []; | ||||||
|  |   const version = extractValue(pyprojectConfig, keys); | ||||||
|  |   if (version !== undefined) { | ||||||
|  |     versions.push(version); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   core.info(`Extracted ${versions} from ${versionFile}`); | ||||||
|  |   return Array.from(versions, version => version.split(',').join(' ')); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Python version extracted from a plain text file. | ||||||
|  |  */ | ||||||
|  | export function getVersionInputFromPlainFile(versionFile: string): string[] { | ||||||
|  |   core.debug(`Trying to resolve version form ${versionFile}`); | ||||||
|  |   const version = fs.readFileSync(versionFile, 'utf8'); | ||||||
|  |   core.info(`Resolved ${versionFile} as ${version}`); | ||||||
|  |   return [version]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Python version extracted from a plain or TOML file. | ||||||
|  |  */ | ||||||
|  | export function getVersionInputFromFile(versionFile: string): string[] { | ||||||
|  |   if (versionFile.endsWith('.toml')) { | ||||||
|  |     return getVersionInputFromTomlFile(versionFile); | ||||||
|  |   } else { | ||||||
|  |     return getVersionInputFromPlainFile(versionFile); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dario Curreri
						Dario Curreri