diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index eac39ab6..9d3185d3 100644 --- a/__tests__/utils.test.ts +++ b/__tests__/utils.test.ts @@ -129,6 +129,30 @@ describe('Version from file test', () => { expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]); } ); + it.each([getVersionInputFromTomlFile, getVersionInputFromFile])( + 'Version from mise .mise.toml test', + async _fn => { + await io.mkdirP(tempDir); + const pythonVersionFileName = '.mise.toml'; + const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName); + const pythonVersion = '3.7.0'; + const pythonVersionFileContent = `[tools]\npython = "${pythonVersion}"`; + fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent); + expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]); + } + ); + it.each([getVersionInputFromTomlFile, getVersionInputFromFile])( + 'Version from mise verbose .mise.toml test', + async _fn => { + await io.mkdirP(tempDir); + const pythonVersionFileName = '.mise.toml'; + const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName); + const pythonVersion = '3.7.0'; + const pythonVersionFileContent = `[tools]\npython = { version="${pythonVersion}", virtualenv=".venv" }`; + fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent); + expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]); + } + ); it.each([getVersionInputFromTomlFile, getVersionInputFromFile])( 'Version undefined', async _fn => { diff --git a/dist/setup/index.js b/dist/setup/index.js index e56f9660..06717ff7 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -92094,6 +92094,9 @@ function getOSInfo() { }); } exports.getOSInfo = getOSInfo; +function isString(value) { + return typeof value === 'string' || value instanceof String; +} /** * Extract a value from an object by following the keys path provided. * If the value is present, it is returned. Otherwise undefined is returned. @@ -92104,9 +92107,12 @@ function extractValue(obj, keys) { if (keys.length > 1 && value !== undefined) { return extractValue(value, keys.slice(1)); } - else { + else if (isString(value)) { return value; } + else { + return; + } } else { return; @@ -92126,19 +92132,26 @@ function getVersionInputFromTomlFile(versionFile) { // Normalize the line endings in the pyprojectFile pyprojectFile = pyprojectFile.replace(/\r\n/g, '\n'); const pyprojectConfig = toml.parse(pyprojectFile); - let keys = []; + let keyPaths = []; if ('project' in pyprojectConfig) { // standard project metadata (PEP 621) - keys = ['project', 'requires-python']; + keyPaths = [['project', 'requires-python']]; } else { - // python poetry - keys = ['tool', 'poetry', 'dependencies', 'python']; + keyPaths = [ + // python poetry + ['tool', 'poetry', 'dependencies', 'python'], + // mise + ['tools', 'python'], + ['tools', 'python', 'version'] + ]; } const versions = []; - const version = extractValue(pyprojectConfig, keys); - if (version !== undefined) { - versions.push(version); + for (const keys of keyPaths) { + const value = extractValue(pyprojectConfig, keys); + if (value !== undefined) { + versions.push(value); + } } core.info(`Extracted ${versions} from ${versionFile}`); const rawVersions = Array.from(versions, version => version.split(',').join(' ')); diff --git a/src/utils.ts b/src/utils.ts index a6dab63e..85eded14 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -202,6 +202,10 @@ export async function getOSInfo() { } } +function isString(value: unknown): value is string { + return typeof value === 'string' || value instanceof String; +} + /** * Extract a value from an object by following the keys path provided. * If the value is present, it is returned. Otherwise undefined is returned. @@ -211,8 +215,10 @@ function extractValue(obj: any, keys: string[]): string | undefined { const value = obj[keys[0]]; if (keys.length > 1 && value !== undefined) { return extractValue(value, keys.slice(1)); - } else { + } else if (isString(value)) { return value; + } else { + return; } } else { return; @@ -235,19 +241,29 @@ export function getVersionInputFromTomlFile(versionFile: string): string[] { pyprojectFile = pyprojectFile.replace(/\r\n/g, '\n'); const pyprojectConfig = toml.parse(pyprojectFile); - let keys = []; + + let keyPaths = []; if ('project' in pyprojectConfig) { // standard project metadata (PEP 621) - keys = ['project', 'requires-python']; + keyPaths = [['project', 'requires-python']]; } else { - // python poetry - keys = ['tool', 'poetry', 'dependencies', 'python']; + keyPaths = [ + // python poetry + ['tool', 'poetry', 'dependencies', 'python'], + // mise + ['tools', 'python'], + ['tools', 'python', 'version'] + ]; } + const versions = []; - const version = extractValue(pyprojectConfig, keys); - if (version !== undefined) { - versions.push(version); + + for (const keys of keyPaths) { + const value = extractValue(pyprojectConfig, keys); + if (value !== undefined) { + versions.push(value); + } } core.info(`Extracted ${versions} from ${versionFile}`);