From 4eb7dbcb9561cb76a85079ffa9d89b983166e00c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 12:13:45 -0500 Subject: [PATCH 01/17] Bump braces from 3.0.2 to 3.0.3 (#893) * Bump braces from 3.0.2 to 3.0.3 Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump undici from 5.28.3 to 5.28.4 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: HarithaVattikuti <73516759+HarithaVattikuti@users.noreply.github.com> --- .licenses/npm/undici.dep.yml | 2 +- dist/cache-save/index.js | 297 ++++++++++++++++++++++++++++++----- dist/setup/index.js | 297 ++++++++++++++++++++++++++++++----- package-lock.json | 20 +-- 4 files changed, 523 insertions(+), 93 deletions(-) diff --git a/.licenses/npm/undici.dep.yml b/.licenses/npm/undici.dep.yml index 58844ed3..cc74a6d2 100644 --- a/.licenses/npm/undici.dep.yml +++ b/.licenses/npm/undici.dep.yml @@ -1,6 +1,6 @@ --- name: undici -version: 5.28.3 +version: 5.28.4 type: npm summary: An HTTP/1.1 client, written from scratch for Node.js homepage: https://undici.nodejs.org diff --git a/dist/cache-save/index.js b/dist/cache-save/index.js index 400938d6..aa4501f9 100644 --- a/dist/cache-save/index.js +++ b/dist/cache-save/index.js @@ -57964,6 +57964,132 @@ function onConnectTimeout (socket) { module.exports = buildConnector +/***/ }), + +/***/ 4462: +/***/ ((module) => { + +"use strict"; + + +/** @type {Record} */ +const headerNameLowerCasedRecord = {} + +// https://developer.mozilla.org/docs/Web/HTTP/Headers +const wellknownHeaderNames = [ + 'Accept', + 'Accept-Encoding', + 'Accept-Language', + 'Accept-Ranges', + 'Access-Control-Allow-Credentials', + 'Access-Control-Allow-Headers', + 'Access-Control-Allow-Methods', + 'Access-Control-Allow-Origin', + 'Access-Control-Expose-Headers', + 'Access-Control-Max-Age', + 'Access-Control-Request-Headers', + 'Access-Control-Request-Method', + 'Age', + 'Allow', + 'Alt-Svc', + 'Alt-Used', + 'Authorization', + 'Cache-Control', + 'Clear-Site-Data', + 'Connection', + 'Content-Disposition', + 'Content-Encoding', + 'Content-Language', + 'Content-Length', + 'Content-Location', + 'Content-Range', + 'Content-Security-Policy', + 'Content-Security-Policy-Report-Only', + 'Content-Type', + 'Cookie', + 'Cross-Origin-Embedder-Policy', + 'Cross-Origin-Opener-Policy', + 'Cross-Origin-Resource-Policy', + 'Date', + 'Device-Memory', + 'Downlink', + 'ECT', + 'ETag', + 'Expect', + 'Expect-CT', + 'Expires', + 'Forwarded', + 'From', + 'Host', + 'If-Match', + 'If-Modified-Since', + 'If-None-Match', + 'If-Range', + 'If-Unmodified-Since', + 'Keep-Alive', + 'Last-Modified', + 'Link', + 'Location', + 'Max-Forwards', + 'Origin', + 'Permissions-Policy', + 'Pragma', + 'Proxy-Authenticate', + 'Proxy-Authorization', + 'RTT', + 'Range', + 'Referer', + 'Referrer-Policy', + 'Refresh', + 'Retry-After', + 'Sec-WebSocket-Accept', + 'Sec-WebSocket-Extensions', + 'Sec-WebSocket-Key', + 'Sec-WebSocket-Protocol', + 'Sec-WebSocket-Version', + 'Server', + 'Server-Timing', + 'Service-Worker-Allowed', + 'Service-Worker-Navigation-Preload', + 'Set-Cookie', + 'SourceMap', + 'Strict-Transport-Security', + 'Supports-Loading-Mode', + 'TE', + 'Timing-Allow-Origin', + 'Trailer', + 'Transfer-Encoding', + 'Upgrade', + 'Upgrade-Insecure-Requests', + 'User-Agent', + 'Vary', + 'Via', + 'WWW-Authenticate', + 'X-Content-Type-Options', + 'X-DNS-Prefetch-Control', + 'X-Frame-Options', + 'X-Permitted-Cross-Domain-Policies', + 'X-Powered-By', + 'X-Requested-With', + 'X-XSS-Protection' +] + +for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i] + const lowerCasedKey = key.toLowerCase() + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = + lowerCasedKey +} + +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(headerNameLowerCasedRecord, null) + +module.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord +} + + /***/ }), /***/ 8045: @@ -58796,6 +58922,7 @@ const { InvalidArgumentError } = __nccwpck_require__(8045) const { Blob } = __nccwpck_require__(4300) const nodeUtil = __nccwpck_require__(3837) const { stringify } = __nccwpck_require__(3477) +const { headerNameLowerCasedRecord } = __nccwpck_require__(4462) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -59005,6 +59132,15 @@ function parseKeepAliveTimeout (val) { return m ? parseInt(m[1], 10) * 1000 : null } +/** + * Retrieves a header name and returns its lowercase value. + * @param {string | Buffer} value Header name + * @returns {string} + */ +function headerNameToString (value) { + return headerNameLowerCasedRecord[value] || value.toLowerCase() +} + function parseHeaders (headers, obj = {}) { // For H2 support if (!Array.isArray(headers)) return headers @@ -59276,6 +59412,7 @@ module.exports = { isIterable, isAsyncIterable, isDestroyed, + headerNameToString, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -65923,14 +66060,18 @@ const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(3983 const assert = __nccwpck_require__(9491) const { isUint8Array } = __nccwpck_require__(9830) +let supportedHashes = [] + // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable /** @type {import('crypto')|undefined} */ let crypto try { crypto = __nccwpck_require__(6113) + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512'] + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)) +/* c8 ignore next 3 */ } catch { - } function responseURL (response) { @@ -66458,66 +66599,56 @@ function bytesMatch (bytes, metadataList) { return true } - // 3. If parsedMetadata is the empty set, return true. + // 3. If response is not eligible for integrity validation, return false. + // TODO + + // 4. If parsedMetadata is the empty set, return true. if (parsedMetadata.length === 0) { return true } - // 4. Let metadata be the result of getting the strongest + // 5. Let metadata be the result of getting the strongest // metadata from parsedMetadata. - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)) - // get the strongest algorithm - const strongest = list[0].algo - // get all entries that use the strongest algorithm; ignore weaker - const metadata = list.filter((item) => item.algo === strongest) + const strongest = getStrongestMetadata(parsedMetadata) + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest) - // 5. For each item in metadata: + // 6. For each item in metadata: for (const item of metadata) { // 1. Let algorithm be the alg component of item. const algorithm = item.algo // 2. Let expectedValue be the val component of item. - let expectedValue = item.hash + const expectedValue = item.hash // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e // "be liberal with padding". This is annoying, and it's not even in the spec. - if (expectedValue.endsWith('==')) { - expectedValue = expectedValue.slice(0, -2) - } - // 3. Let actualValue be the result of applying algorithm to bytes. let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64') - if (actualValue.endsWith('==')) { - actualValue = actualValue.slice(0, -2) + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2) + } else { + actualValue = actualValue.slice(0, -1) + } } // 4. If actualValue is a case-sensitive match for expectedValue, // return true. - if (actualValue === expectedValue) { - return true - } - - let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url') - - if (actualBase64URL.endsWith('==')) { - actualBase64URL = actualBase64URL.slice(0, -2) - } - - if (actualBase64URL === expectedValue) { + if (compareBase64Mixed(actualValue, expectedValue)) { return true } } - // 6. Return false. + // 7. Return false. return false } // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options // https://www.w3.org/TR/CSP2/#source-list-syntax // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 -const parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i +const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i /** * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata @@ -66531,8 +66662,6 @@ function parseMetadata (metadata) { // 2. Let empty be equal to true. let empty = true - const supportedHashes = crypto.getHashes() - // 3. For each token returned by splitting metadata on spaces: for (const token of metadata.split(' ')) { // 1. Set empty to false. @@ -66542,7 +66671,11 @@ function parseMetadata (metadata) { const parsedToken = parseHashWithOptions.exec(token) // 3. If token does not parse, continue to the next token. - if (parsedToken === null || parsedToken.groups === undefined) { + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { // Note: Chromium blocks the request at this point, but Firefox // gives a warning that an invalid integrity was given. The // correct behavior is to ignore these, and subsequently not @@ -66551,11 +66684,11 @@ function parseMetadata (metadata) { } // 4. Let algorithm be the hash-algo component of token. - const algorithm = parsedToken.groups.algo + const algorithm = parsedToken.groups.algo.toLowerCase() // 5. If algorithm is a hash function recognized by the user // agent, add the parsed token to result. - if (supportedHashes.includes(algorithm.toLowerCase())) { + if (supportedHashes.includes(algorithm)) { result.push(parsedToken.groups) } } @@ -66568,6 +66701,82 @@ function parseMetadata (metadata) { return result } +/** + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + */ +function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } + + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i] + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512' + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384' + } + } + return algorithm +} + +function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList + } + + let pos = 0 + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i] + } + } + + metadataList.length = pos + + return metadataList +} + +/** + * Compares two base64 strings, allowing for base64url + * in the second string. + * +* @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} + */ +function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true +} + // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { // TODO @@ -66983,7 +67192,8 @@ module.exports = { urlHasHttpsScheme, urlIsHttpHttpsScheme, readAllBytes, - normalizeMethodRecord + normalizeMethodRecord, + parseMetadata } @@ -69070,12 +69280,17 @@ function parseLocation (statusCode, headers) { // https://tools.ietf.org/html/rfc7231#section-6.4.4 function shouldRemoveHeader (header, removeContent, unknownOrigin) { - return ( - (header.length === 4 && header.toString().toLowerCase() === 'host') || - (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) || - (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') || - (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie') - ) + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header) + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false } // https://tools.ietf.org/html/rfc7231#section-6.4 diff --git a/dist/setup/index.js b/dist/setup/index.js index d558c611..e28c3be0 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -67150,6 +67150,132 @@ function onConnectTimeout (socket) { module.exports = buildConnector +/***/ }), + +/***/ 4462: +/***/ ((module) => { + +"use strict"; + + +/** @type {Record} */ +const headerNameLowerCasedRecord = {} + +// https://developer.mozilla.org/docs/Web/HTTP/Headers +const wellknownHeaderNames = [ + 'Accept', + 'Accept-Encoding', + 'Accept-Language', + 'Accept-Ranges', + 'Access-Control-Allow-Credentials', + 'Access-Control-Allow-Headers', + 'Access-Control-Allow-Methods', + 'Access-Control-Allow-Origin', + 'Access-Control-Expose-Headers', + 'Access-Control-Max-Age', + 'Access-Control-Request-Headers', + 'Access-Control-Request-Method', + 'Age', + 'Allow', + 'Alt-Svc', + 'Alt-Used', + 'Authorization', + 'Cache-Control', + 'Clear-Site-Data', + 'Connection', + 'Content-Disposition', + 'Content-Encoding', + 'Content-Language', + 'Content-Length', + 'Content-Location', + 'Content-Range', + 'Content-Security-Policy', + 'Content-Security-Policy-Report-Only', + 'Content-Type', + 'Cookie', + 'Cross-Origin-Embedder-Policy', + 'Cross-Origin-Opener-Policy', + 'Cross-Origin-Resource-Policy', + 'Date', + 'Device-Memory', + 'Downlink', + 'ECT', + 'ETag', + 'Expect', + 'Expect-CT', + 'Expires', + 'Forwarded', + 'From', + 'Host', + 'If-Match', + 'If-Modified-Since', + 'If-None-Match', + 'If-Range', + 'If-Unmodified-Since', + 'Keep-Alive', + 'Last-Modified', + 'Link', + 'Location', + 'Max-Forwards', + 'Origin', + 'Permissions-Policy', + 'Pragma', + 'Proxy-Authenticate', + 'Proxy-Authorization', + 'RTT', + 'Range', + 'Referer', + 'Referrer-Policy', + 'Refresh', + 'Retry-After', + 'Sec-WebSocket-Accept', + 'Sec-WebSocket-Extensions', + 'Sec-WebSocket-Key', + 'Sec-WebSocket-Protocol', + 'Sec-WebSocket-Version', + 'Server', + 'Server-Timing', + 'Service-Worker-Allowed', + 'Service-Worker-Navigation-Preload', + 'Set-Cookie', + 'SourceMap', + 'Strict-Transport-Security', + 'Supports-Loading-Mode', + 'TE', + 'Timing-Allow-Origin', + 'Trailer', + 'Transfer-Encoding', + 'Upgrade', + 'Upgrade-Insecure-Requests', + 'User-Agent', + 'Vary', + 'Via', + 'WWW-Authenticate', + 'X-Content-Type-Options', + 'X-DNS-Prefetch-Control', + 'X-Frame-Options', + 'X-Permitted-Cross-Domain-Policies', + 'X-Powered-By', + 'X-Requested-With', + 'X-XSS-Protection' +] + +for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i] + const lowerCasedKey = key.toLowerCase() + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = + lowerCasedKey +} + +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(headerNameLowerCasedRecord, null) + +module.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord +} + + /***/ }), /***/ 8045: @@ -67982,6 +68108,7 @@ const { InvalidArgumentError } = __nccwpck_require__(8045) const { Blob } = __nccwpck_require__(4300) const nodeUtil = __nccwpck_require__(3837) const { stringify } = __nccwpck_require__(3477) +const { headerNameLowerCasedRecord } = __nccwpck_require__(4462) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -68191,6 +68318,15 @@ function parseKeepAliveTimeout (val) { return m ? parseInt(m[1], 10) * 1000 : null } +/** + * Retrieves a header name and returns its lowercase value. + * @param {string | Buffer} value Header name + * @returns {string} + */ +function headerNameToString (value) { + return headerNameLowerCasedRecord[value] || value.toLowerCase() +} + function parseHeaders (headers, obj = {}) { // For H2 support if (!Array.isArray(headers)) return headers @@ -68462,6 +68598,7 @@ module.exports = { isIterable, isAsyncIterable, isDestroyed, + headerNameToString, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -75109,14 +75246,18 @@ const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(3983 const assert = __nccwpck_require__(9491) const { isUint8Array } = __nccwpck_require__(9830) +let supportedHashes = [] + // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable /** @type {import('crypto')|undefined} */ let crypto try { crypto = __nccwpck_require__(6113) + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512'] + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)) +/* c8 ignore next 3 */ } catch { - } function responseURL (response) { @@ -75644,66 +75785,56 @@ function bytesMatch (bytes, metadataList) { return true } - // 3. If parsedMetadata is the empty set, return true. + // 3. If response is not eligible for integrity validation, return false. + // TODO + + // 4. If parsedMetadata is the empty set, return true. if (parsedMetadata.length === 0) { return true } - // 4. Let metadata be the result of getting the strongest + // 5. Let metadata be the result of getting the strongest // metadata from parsedMetadata. - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)) - // get the strongest algorithm - const strongest = list[0].algo - // get all entries that use the strongest algorithm; ignore weaker - const metadata = list.filter((item) => item.algo === strongest) + const strongest = getStrongestMetadata(parsedMetadata) + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest) - // 5. For each item in metadata: + // 6. For each item in metadata: for (const item of metadata) { // 1. Let algorithm be the alg component of item. const algorithm = item.algo // 2. Let expectedValue be the val component of item. - let expectedValue = item.hash + const expectedValue = item.hash // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e // "be liberal with padding". This is annoying, and it's not even in the spec. - if (expectedValue.endsWith('==')) { - expectedValue = expectedValue.slice(0, -2) - } - // 3. Let actualValue be the result of applying algorithm to bytes. let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64') - if (actualValue.endsWith('==')) { - actualValue = actualValue.slice(0, -2) + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2) + } else { + actualValue = actualValue.slice(0, -1) + } } // 4. If actualValue is a case-sensitive match for expectedValue, // return true. - if (actualValue === expectedValue) { - return true - } - - let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url') - - if (actualBase64URL.endsWith('==')) { - actualBase64URL = actualBase64URL.slice(0, -2) - } - - if (actualBase64URL === expectedValue) { + if (compareBase64Mixed(actualValue, expectedValue)) { return true } } - // 6. Return false. + // 7. Return false. return false } // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options // https://www.w3.org/TR/CSP2/#source-list-syntax // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 -const parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i +const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i /** * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata @@ -75717,8 +75848,6 @@ function parseMetadata (metadata) { // 2. Let empty be equal to true. let empty = true - const supportedHashes = crypto.getHashes() - // 3. For each token returned by splitting metadata on spaces: for (const token of metadata.split(' ')) { // 1. Set empty to false. @@ -75728,7 +75857,11 @@ function parseMetadata (metadata) { const parsedToken = parseHashWithOptions.exec(token) // 3. If token does not parse, continue to the next token. - if (parsedToken === null || parsedToken.groups === undefined) { + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { // Note: Chromium blocks the request at this point, but Firefox // gives a warning that an invalid integrity was given. The // correct behavior is to ignore these, and subsequently not @@ -75737,11 +75870,11 @@ function parseMetadata (metadata) { } // 4. Let algorithm be the hash-algo component of token. - const algorithm = parsedToken.groups.algo + const algorithm = parsedToken.groups.algo.toLowerCase() // 5. If algorithm is a hash function recognized by the user // agent, add the parsed token to result. - if (supportedHashes.includes(algorithm.toLowerCase())) { + if (supportedHashes.includes(algorithm)) { result.push(parsedToken.groups) } } @@ -75754,6 +75887,82 @@ function parseMetadata (metadata) { return result } +/** + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + */ +function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } + + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i] + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512' + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384' + } + } + return algorithm +} + +function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList + } + + let pos = 0 + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i] + } + } + + metadataList.length = pos + + return metadataList +} + +/** + * Compares two base64 strings, allowing for base64url + * in the second string. + * +* @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} + */ +function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true +} + // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { // TODO @@ -76169,7 +76378,8 @@ module.exports = { urlHasHttpsScheme, urlIsHttpHttpsScheme, readAllBytes, - normalizeMethodRecord + normalizeMethodRecord, + parseMetadata } @@ -78256,12 +78466,17 @@ function parseLocation (statusCode, headers) { // https://tools.ietf.org/html/rfc7231#section-6.4.4 function shouldRemoveHeader (header, removeContent, unknownOrigin) { - return ( - (header.length === 4 && header.toString().toLowerCase() === 'host') || - (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) || - (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') || - (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie') - ) + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header) + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false } // https://tools.ietf.org/html/rfc7231#section-6.4 diff --git a/package-lock.json b/package-lock.json index 958c2181..b2695779 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2210,12 +2210,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3064,9 +3064,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -5287,9 +5287,9 @@ } }, "node_modules/undici": { - "version": "5.28.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", - "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dependencies": { "@fastify/busboy": "^2.0.0" }, From a0d74c0c423f896bc4e7be91d5cb1e2d54438db3 Mon Sep 17 00:00:00 2001 From: Matthieu Darbois Date: Thu, 27 Jun 2024 20:18:32 +0200 Subject: [PATCH 02/17] fix(ci): update all failing workflows (#863) * fix(ci): update all failing workflows With `macos-latest` moving to `macos-14`, most workflows are currently failing. Update them to be able to run on `macos-latest` Don't test python 3.5 on ubuntu. It's been EOL for almost 4 years and there are now some certificate issues with pip. * review: remove test with python 3.5, 3.6 & 3.7 * add latest versions to e2e-tests.yml --- .github/workflows/e2e-cache.yml | 11 ++-- .github/workflows/e2e-tests.yml | 60 +++++++++----------- .github/workflows/test-graalpy.yml | 1 + .github/workflows/test-pypy.yml | 33 +++++------ .github/workflows/test-python.yml | 89 ++++++++++-------------------- 5 files changed, 81 insertions(+), 113 deletions(-) diff --git a/.github/workflows/e2e-cache.yml b/.github/workflows/e2e-cache.yml index 6db7088e..0c73a0b0 100644 --- a/.github/workflows/e2e-cache.yml +++ b/.github/workflows/e2e-cache.yml @@ -10,6 +10,7 @@ on: - releases/* paths-ignore: - '**.md' + workflow_dispatch: permissions: contents: read @@ -21,7 +22,7 @@ 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@v4 - name: Setup Python @@ -75,7 +76,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.9', 'pypy-3.8'] + python-version: ['3.9', 'pypy-3.9'] steps: - uses: actions/checkout@v4 - name: Install poetry @@ -91,13 +92,13 @@ jobs: run: poetry install python-pip-dependencies-caching-path: - name: Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) + name: Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) 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'] + python-version: ['3.9', 'pypy-3.9-v7.x'] steps: - uses: actions/checkout@v4 - name: Setup Python @@ -110,7 +111,7 @@ jobs: run: pip install numpy pandas requests python-pipenv-dependencies-caching-path: - name: Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}) + name: Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) runs-on: ${{ matrix.os }} strategy: fail-fast: false diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index d1f4b446..a14739de 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -9,6 +9,7 @@ on: pull_request: paths-ignore: - '**.md' + workflow_dispatch: jobs: test-setup-python: @@ -21,27 +22,6 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Run with setup-python 3.5 - uses: ./ - with: - python-version: 3.5 - - name: Verify 3.5 - run: python __tests__/verify-python.py 3.5 - - - name: Run with setup-python 3.6 - uses: ./ - with: - python-version: 3.6 - - name: Verify 3.6 - run: python __tests__/verify-python.py 3.6 - - - name: Run with setup-python 3.7 - uses: ./ - with: - python-version: 3.7 - - name: Verify 3.7 - run: python __tests__/verify-python.py 3.7 - - name: Run with setup-python 3.8 uses: ./ with: @@ -49,26 +29,40 @@ jobs: - name: Verify 3.8 run: python __tests__/verify-python.py 3.8 - - name: Run with setup-python 3.7.5 + - name: Run with setup-python 3.8.10 uses: ./ with: - python-version: 3.7.5 - - name: Verify 3.7.5 - run: python __tests__/verify-python.py 3.7.5 + python-version: 3.8.10 + - name: Verify 3.8.10 + run: python __tests__/verify-python.py 3.8.10 - - name: Run with setup-python 3.6.7 + - name: Run with setup-python 3.9.13 uses: ./ with: - python-version: 3.6.7 - - name: Verify 3.6.7 - run: python __tests__/verify-python.py 3.6.7 + python-version: 3.9.13 + - name: Verify 3.9.13 + run: python __tests__/verify-python.py 3.9.13 - - name: Run with setup-python 3.8.1 + - name: Run with setup-python 3.9.13 uses: ./ with: - python-version: 3.8.1 - - name: Verify 3.8.1 - run: python __tests__/verify-python.py 3.8.1 + python-version: 3.10.11 + - name: Verify 3.10.11 + run: python __tests__/verify-python.py 3.10.11 + + - name: Run with setup-python 3.11.9 + uses: ./ + with: + python-version: 3.11.9 + - name: Verify 3.11.9 + run: python __tests__/verify-python.py 3.11.9 + + - name: Run with setup-python 3.12.4 + uses: ./ + with: + python-version: 3.12.4 + - name: Verify 3.12.4 + run: python __tests__/verify-python.py 3.12.4 - name: Run with setup-python 3.10 id: cp310 diff --git a/.github/workflows/test-graalpy.yml b/.github/workflows/test-graalpy.yml index febf0b86..fe8f497e 100644 --- a/.github/workflows/test-graalpy.yml +++ b/.github/workflows/test-graalpy.yml @@ -9,6 +9,7 @@ on: pull_request: paths-ignore: - '**.md' + workflow_dispatch: jobs: setup-graalpy: diff --git a/.github/workflows/test-pypy.yml b/.github/workflows/test-pypy.yml index abf77bd6..355bc232 100644 --- a/.github/workflows/test-pypy.yml +++ b/.github/workflows/test-pypy.yml @@ -11,6 +11,7 @@ on: - '**.md' schedule: - cron: 30 3 * * * + workflow_dispatch: jobs: setup-pypy: @@ -22,16 +23,16 @@ jobs: os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-latest] pypy: - 'pypy-2.7' - - 'pypy-3.7' + - 'pypy-3.10' - 'pypy3.9' - - 'pypy-2.7-v7.3.4' - - 'pypy-3.7-v7.3.5' - - 'pypy-3.7-v7.3.4' - - 'pypy-3.7-v7.3.x' - - 'pypy-3.7-v7.x' - - 'pypy-2.7-v7.3.4rc1' - - 'pypy-3.8-nightly' - - 'pypy3.8-v7.3.7' + - 'pypy-2.7-v7.3.14' + - 'pypy-3.10-v7.3.15' + - 'pypy-3.10-v7.3.14' + - 'pypy-3.10-v7.3.x' + - 'pypy-3.10-v7.x' + - 'pypy-2.7-v7.3.12rc1' + - 'pypy-3.10-nightly' + - 'pypy3.10-v7.3.15' steps: - name: Checkout @@ -74,7 +75,7 @@ jobs: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-latest] - pypy: ['pypy2.7', 'pypy3.7', 'pypy3.8', 'pypy3.9-nightly'] + pypy: ['pypy2.7', 'pypy3.9', 'pypy3.10-nightly'] steps: - name: Checkout @@ -104,7 +105,7 @@ jobs: - name: Setup PyPy and check latest uses: ./ with: - python-version: 'pypy-3.7-v7.3.x' + python-version: 'pypy-3.10-v7.3.x' check-latest: true - name: PyPy and Python version run: python --version @@ -120,7 +121,7 @@ jobs: - name: Assert expected binaries (or symlinks) are present run: | - EXECUTABLE="pypy-3.7-v7.3.x" + EXECUTABLE="pypy-3.10-v7.3.x" EXECUTABLE=${EXECUTABLE/-/} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe ${EXECUTABLE} --version @@ -138,8 +139,8 @@ jobs: uses: ./ with: python-version: | - pypy-3.7-v7.3.x - pypy3.8 + pypy-3.10-v7.3.x + pypy3.9 check-latest: true - name: PyPy and Python version run: python --version @@ -155,14 +156,14 @@ jobs: - name: Assert expected binaries (or symlinks) are present run: | - EXECUTABLE="pypy-3.7-v7.3.x" + EXECUTABLE="pypy-3.10-v7.3.x" EXECUTABLE=${EXECUTABLE/-/} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe ${EXECUTABLE} --version shell: bash - name: Assert expected binaries (or symlinks) are present run: | - EXECUTABLE='pypy3.8' + EXECUTABLE='pypy3.9' EXECUTABLE=${EXECUTABLE/pypy-/pypy} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe ${EXECUTABLE} --version diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml index 5982a897..c8aef26c 100644 --- a/.github/workflows/test-python.yml +++ b/.github/workflows/test-python.yml @@ -21,16 +21,10 @@ jobs: 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] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3] 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 + python: 3.8.10 steps: - name: Checkout uses: actions/checkout@v4 @@ -65,16 +59,10 @@ jobs: 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] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3] 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 + python: 3.8.10 steps: - name: Checkout uses: actions/checkout@v4 @@ -112,16 +100,10 @@ jobs: 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] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3] 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 + python: 3.8.10 steps: - name: Checkout uses: actions/checkout@v4 @@ -157,16 +139,10 @@ jobs: 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, '==3.10.10'] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, '==3.12.3'] 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 + python: 3.8.10 steps: - name: Checkout uses: actions/checkout@v4 @@ -207,16 +183,10 @@ jobs: 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] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3] 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 + python: 3.8.10 steps: - name: Checkout uses: actions/checkout@v4 @@ -251,21 +221,21 @@ jobs: run: python -c 'import math; print(math.factorial(5))' setup-pre-release-version-from-manifest: - name: Setup 3.9.0-beta.4 ${{ matrix.os }} + name: Setup 3.13.0-alpha.6 ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04] + os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] steps: - name: Checkout uses: actions/checkout@v4 - - name: setup-python 3.9.0-beta.4 + - name: setup-python 3.13.0-alpha.6 id: setup-python uses: ./ with: - python-version: '3.9.0-beta.4' + python-version: '3.13.0-alpha.6' - name: Check python-path run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' @@ -274,8 +244,8 @@ jobs: - name: Validate version run: | $pythonVersion = (python --version) - if ("Python 3.9.0b4" -ne "$pythonVersion"){ - Write-Host "The current version is $pythonVersion; expected version is 3.9.0b4" + if ("Python 3.13.0a6" -ne "$pythonVersion"){ + Write-Host "The current version is $pythonVersion; expected version is 3.13.0a6" exit 1 } $pythonVersion @@ -285,7 +255,7 @@ jobs: run: python -c 'import math; print(math.factorial(5))' setup-dev-version: - name: Setup 3.9-dev ${{ matrix.os }} + name: Setup 3.13-dev ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -295,25 +265,25 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: setup-python 3.9-dev + - name: setup-python 3.13-dev id: setup-python uses: ./ with: - python-version: '3.9-dev' + python-version: '3.13-dev' - name: Check python-path run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' shell: bash - name: Validate version - run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.9.') }} + run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.13.') }} shell: bash - name: Run simple code run: python -c 'import math; print(math.factorial(5))' setup-prerelease-version: - name: Setup 3.12 ${{ matrix.os }} + name: Setup 3.13 ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -323,11 +293,11 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: setup-python 3.12 + - name: setup-python 3.13 id: setup-python uses: ./ with: - python-version: '3.12' + python-version: '3.13' allow-prereleases: true - name: Check python-path @@ -335,7 +305,7 @@ jobs: shell: bash - name: Validate version - run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.12.') }} + run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.13.') }} shell: bash - name: Run simple code @@ -348,7 +318,7 @@ jobs: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] - python: ['3.7', '3.8', '3.9', '3.10'] + python: ['3.8', '3.9', '3.10', '3.11', '3.12'] steps: - name: Checkout uses: actions/checkout@v4 @@ -372,7 +342,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.8', '3.9', '3.10'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] steps: - uses: actions/checkout@v4 - name: Setup Python and check latest @@ -402,16 +372,17 @@ jobs: uses: ./ with: python-version: | - 3.7 3.8 3.9 3.10 + 3.11 + 3.12 check-latest: true - name: Validate version run: | $pythonVersion = (python --version) - if ("$pythonVersion" -NotMatch "3.10"){ - Write-Host "The current version is $pythonVersion; expected version is 3.10" + if ("$pythonVersion" -NotMatch "3.12"){ + Write-Host "The current version is $pythonVersion; expected version is 3.12" exit 1 } $pythonVersion From 39cd14951b08e74b54015e9e001cdefcf80e669f Mon Sep 17 00:00:00 2001 From: gowridurgad <159780674+gowridurgad@users.noreply.github.com> Date: Wed, 10 Jul 2024 19:18:13 +0530 Subject: [PATCH 03/17] Documentation update for cache (#873) * updated doc * added note * modify1 * Update advanced-usage.md * Update 0000-caching-dependencies.md --------- Co-authored-by: gowridurgad --- docs/adrs/0000-caching-dependencies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/adrs/0000-caching-dependencies.md b/docs/adrs/0000-caching-dependencies.md index 8a172a07..7f9e4d04 100644 --- a/docs/adrs/0000-caching-dependencies.md +++ b/docs/adrs/0000-caching-dependencies.md @@ -18,7 +18,7 @@ Integration of caching functionality into `actions/setup-python` action will bri We will add support for Pip and Pipenv dependency caching. -We won't pursue the goal to provide wide customization of caching in the scope of `actions/setup-python` action. The purpose of this integration is to cover ~90% of basic use-cases. If users need flexible customization, we will advise them to use `actions/cache` directly. +We won't pursue the goal to provide wide customization of caching in the scope of `actions/setup-python` action. The purpose of this integration is to cover ~90% of basic use-cases. The action does not support dependency-specific caching for each job. If different dependencies are installed across jobs the cache from the first job will be used in the second job. To manage this aspect, users should create separate caches for jobs with different requirements. If users need flexible customization, we will advise them to use `actions/cache` directly. ## Decision From cb6845644151e35f879e10f2f0896c3c8bee372c Mon Sep 17 00:00:00 2001 From: priya-kinthali <147703874+priya-kinthali@users.noreply.github.com> Date: Tue, 23 Jul 2024 00:20:49 +0530 Subject: [PATCH 04/17] Updated @iarna/toml version to 3.0.0 (#912) --- .licenses/npm/@iarna/toml.dep.yml | 2 +- dist/setup/index.js | 134 +++++++++++++++++------------- package-lock.json | 8 +- package.json | 2 +- 4 files changed, 81 insertions(+), 65 deletions(-) diff --git a/.licenses/npm/@iarna/toml.dep.yml b/.licenses/npm/@iarna/toml.dep.yml index 82e52eeb..11f39798 100644 --- a/.licenses/npm/@iarna/toml.dep.yml +++ b/.licenses/npm/@iarna/toml.dep.yml @@ -1,6 +1,6 @@ --- name: "@iarna/toml" -version: 2.2.5 +version: 3.0.0 type: npm summary: Better TOML parsing and stringifying all in that familiar JSON interface. homepage: https://github.com/iarna/iarna-toml#readme diff --git a/dist/setup/index.js b/dist/setup/index.js index e28c3be0..039a5f5b 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -46726,7 +46726,7 @@ function makeParserClass (Parser) { let target = this.ctx let finalKey = kv.key.pop() for (let kw of kv.key) { - if (hasKey(target, kw) && (!isTable(target[kw]) || target[kw][_declared])) { + if (hasKey(target, kw) && !isTable(target[kw])) { throw this.error(new TomlError("Can't redefine existing key")) } target = target[kw] = target[kw] || Table() @@ -46734,6 +46734,7 @@ function makeParserClass (Parser) { if (hasKey(target, finalKey)) { throw this.error(new TomlError("Can't redefine existing key")) } + target[_declared] = true // unbox our numbers if (isInteger(kv.value) || isFloat(kv.value)) { target[finalKey] = kv.value.valueOf() @@ -46791,6 +46792,8 @@ function makeParserClass (Parser) { do { if (this.char === Parser.END || this.char === CTRL_J) { return this.return() + } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I)) { + throw this.errorControlCharIn('comments') } } while (this.nextChar()) } @@ -47004,7 +47007,7 @@ function makeParserClass (Parser) { } else if (this.atEndOfLine()) { throw this.error(new TomlError('Unterminated string')) } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I)) { - throw this.errorControlCharInString() + throw this.errorControlCharIn('strings') } else { this.consume() } @@ -47033,7 +47036,7 @@ function makeParserClass (Parser) { } else if (this.char === Parser.END) { throw this.error(new TomlError('Unterminated multi-line string')) } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I && this.char !== CTRL_J && this.char !== CTRL_M)) { - throw this.errorControlCharInString() + throw this.errorControlCharIn('strings') } else { this.consume() } @@ -47049,12 +47052,28 @@ function makeParserClass (Parser) { } parseLiteralMultiEnd2 () { if (this.char === CHAR_APOS) { - return this.return() + return this.next(this.parseLiteralMultiEnd3) } else { this.state.buf += "''" return this.goto(this.parseLiteralMultiStringContent) } } + parseLiteralMultiEnd3 () { + if (this.char === CHAR_APOS) { + this.state.buf += "'" + return this.next(this.parseLiteralMultiEnd4) + } else { + return this.returnNow() + } + } + parseLiteralMultiEnd4 () { + if (this.char === CHAR_APOS) { + this.state.buf += "'" + return this.return() + } else { + return this.returnNow() + } + } /* STRINGS double quoted */ parseDoubleString () { @@ -47073,7 +47092,7 @@ function makeParserClass (Parser) { } else if (this.atEndOfLine()) { throw this.error(new TomlError('Unterminated string')) } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I)) { - throw this.errorControlCharInString() + throw this.errorControlCharIn('strings') } else { this.consume() } @@ -47108,20 +47127,20 @@ function makeParserClass (Parser) { } else if (this.char === Parser.END) { throw this.error(new TomlError('Unterminated multi-line string')) } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I && this.char !== CTRL_J && this.char !== CTRL_M)) { - throw this.errorControlCharInString() + throw this.errorControlCharIn('strings') } else { this.consume() } } while (this.nextChar()) } - errorControlCharInString () { + errorControlCharIn (type) { let displayCode = '\\u00' if (this.char < 16) { displayCode += '0' } displayCode += this.char.toString(16) - return this.error(new TomlError(`Control characters (codes < 0x1f and 0x7f) are not allowed in strings, use ${displayCode} instead`)) + return this.error(new TomlError(`Control characters (codes < 0x1f and 0x7f) are not allowed in ${type}, use ${displayCode} instead`)) } recordMultiEscapeReplacement (replacement) { this.state.buf += replacement @@ -47137,12 +47156,28 @@ function makeParserClass (Parser) { } parseMultiEnd2 () { if (this.char === CHAR_QUOT) { - return this.return() + return this.next(this.parseMultiEnd3) } else { this.state.buf += '""' return this.goto(this.parseMultiStringContent) } } + parseMultiEnd3 () { + if (this.char === CHAR_QUOT) { + this.state.buf += '"' + return this.next(this.parseMultiEnd4) + } else { + return this.returnNow() + } + } + parseMultiEnd4 () { + if (this.char === CHAR_QUOT) { + this.state.buf += '"' + return this.return() + } else { + return this.returnNow() + } + } parseMultiEscape () { if (this.char === CTRL_M || this.char === CTRL_J) { return this.next(this.parseMultiTrim) @@ -47704,13 +47739,7 @@ function makeParserClass (Parser) { } } recordInlineListValue (value) { - if (this.state.resultArr) { - const listType = this.state.resultArr[_contentType] - const valueType = tomlType(value) - if (listType !== valueType) { - throw this.error(new TomlError(`Inline lists must be a single type, not a mix of ${listType} and ${valueType}`)) - } - } else { + if (!this.state.resultArr) { this.state.resultArr = InlineList(tomlType(value)) } if (isFloat(value) || isInteger(value)) { @@ -47773,13 +47802,26 @@ function makeParserClass (Parser) { } else if (this.char === Parser.END || this.char === CHAR_NUM || this.char === CTRL_J || this.char === CTRL_M) { throw this.error(new TomlError('Unterminated inline array')) } else if (this.char === CHAR_COMMA) { - return this.next(this.parseInlineTable) + return this.next(this.parseInlineTablePostComma) } else if (this.char === CHAR_RCUB) { return this.goto(this.parseInlineTable) } else { throw this.error(new TomlError('Invalid character, expected whitespace, comma (,) or close bracket (])')) } } + parseInlineTablePostComma () { + if (this.char === CHAR_SP || this.char === CTRL_I) { + return null + } else if (this.char === Parser.END || this.char === CHAR_NUM || this.char === CTRL_J || this.char === CTRL_M) { + throw this.error(new TomlError('Unterminated inline array')) + } else if (this.char === CHAR_COMMA) { + throw this.error(new TomlError('Empty elements in inline tables are not permitted')) + } else if (this.char === CHAR_RCUB) { + throw this.error(new TomlError('Trailing commas in inline tables are not permitted')) + } else { + return this.goto(this.parseInlineTable) + } + } } return TOMLParser } @@ -48017,10 +48059,6 @@ function typeError (type) { return new Error('Can only stringify objects, not ' + type) } -function arrayOneTypeError () { - return new Error("Array values can't have mixed types") -} - function getInlineKeys (obj) { return Object.keys(obj).filter(key => isInline(obj[key])) } @@ -48042,12 +48080,12 @@ function toJSON (obj) { function stringifyObject (prefix, indent, obj) { obj = toJSON(obj) - var inlineKeys - var complexKeys + let inlineKeys + let complexKeys inlineKeys = getInlineKeys(obj) complexKeys = getComplexKeys(obj) - var result = [] - var inlineIndent = indent || '' + const result = [] + const inlineIndent = indent || '' inlineKeys.forEach(key => { var type = tomlType(obj[key]) if (type !== 'undefined' && type !== 'null') { @@ -48055,7 +48093,7 @@ function stringifyObject (prefix, indent, obj) { } }) if (result.length > 0) result.push('') - var complexIndent = prefix && inlineKeys.length > 0 ? indent + ' ' : '' + const complexIndent = prefix && inlineKeys.length > 0 ? indent + ' ' : '' complexKeys.forEach(key => { result.push(stringifyComplex(prefix, complexIndent, key, obj[key])) }) @@ -48107,7 +48145,7 @@ function tomlType (value) { } function stringifyKey (key) { - var keyStr = String(key) + const keyStr = String(key) if (/^[-A-Za-z0-9_]+$/.test(keyStr)) { return keyStr } else { @@ -48203,9 +48241,7 @@ function stringifyFloat (value) { } else if (Object.is(value, -0)) { return '-0.0' } - var chunks = String(value).split('.') - var int = chunks[0] - var dec = chunks[1] || 0 + const [int, dec] = String(value).split('.') return stringifyInteger(int) + '.' + dec } @@ -48217,29 +48253,10 @@ function stringifyDatetime (value) { return value.toISOString() } -function isNumber (type) { - return type === 'float' || type === 'integer' -} -function arrayType (values) { - var contentType = tomlType(values[0]) - if (values.every(_ => tomlType(_) === contentType)) return contentType - // mixed integer/float, emit as floats - if (values.every(_ => isNumber(tomlType(_)))) return 'float' - return 'mixed' -} -function validateArray (values) { - const type = arrayType(values) - if (type === 'mixed') { - throw arrayOneTypeError() - } - return type -} - function stringifyInlineArray (values) { values = toJSON(values) - const type = validateArray(values) - var result = '[' - var stringified = values.map(_ => stringifyInline(_, type)) + let result = '[' + const stringified = values.map(_ => stringifyInline(_)) if (stringified.join(', ').length > 60 || /\n/.test(stringified)) { result += '\n ' + stringified.join(',\n ') + '\n' } else { @@ -48250,7 +48267,7 @@ function stringifyInlineArray (values) { function stringifyInlineTable (value) { value = toJSON(value) - var result = [] + const result = [] Object.keys(value).forEach(key => { result.push(stringifyKey(key) + ' = ' + stringifyAnyInline(value[key], false)) }) @@ -48258,7 +48275,7 @@ function stringifyInlineTable (value) { } function stringifyComplex (prefix, indent, key, value) { - var valueType = tomlType(value) + const valueType = tomlType(value) /* istanbul ignore else */ if (valueType === 'array') { return stringifyArrayOfTables(prefix, indent, key, value) @@ -48271,12 +48288,11 @@ function stringifyComplex (prefix, indent, key, value) { function stringifyArrayOfTables (prefix, indent, key, values) { values = toJSON(values) - validateArray(values) - var firstValueType = tomlType(values[0]) + const firstValueType = tomlType(values[0]) /* istanbul ignore if */ if (firstValueType !== 'table') throw typeError(firstValueType) - var fullKey = prefix + stringifyKey(key) - var result = '' + const fullKey = prefix + stringifyKey(key) + let result = '' values.forEach(table => { if (result.length > 0) result += '\n' result += indent + '[[' + fullKey + ']]\n' @@ -48286,8 +48302,8 @@ function stringifyArrayOfTables (prefix, indent, key, values) { } function stringifyComplexTable (prefix, indent, key, value) { - var fullKey = prefix + stringifyKey(key) - var result = '' + const fullKey = prefix + stringifyKey(key) + let result = '' if (getInlineKeys(value).length > 0) { result += indent + '[' + fullKey + ']\n' } diff --git a/package-lock.json b/package-lock.json index b2695779..e5b2190b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@actions/http-client": "^2.2.1", "@actions/io": "^1.0.2", "@actions/tool-cache": "^2.0.1", - "@iarna/toml": "^2.2.5", + "@iarna/toml": "^3.0.0", "semver": "^7.6.0" }, "devDependencies": { @@ -1084,9 +1084,9 @@ "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==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", diff --git a/package.json b/package.json index c9147771..f7c3ef48 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@actions/http-client": "^2.2.1", "@actions/io": "^1.0.2", "@actions/tool-cache": "^2.0.1", - "@iarna/toml": "^2.2.5", + "@iarna/toml": "^3.0.0", "semver": "^7.6.0" }, "devDependencies": { From 04c1311429f7be71707d8ab66c7af8a14e54b938 Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Tue, 23 Jul 2024 07:16:08 -0700 Subject: [PATCH 05/17] Fix display of emojis in contributors doc (#899) --- docs/contributors.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/contributors.md b/docs/contributors.md index dc3d8b38..6084cb4b 100644 --- a/docs/contributors.md +++ b/docs/contributors.md @@ -6,13 +6,13 @@ We have prepared a short guide so that the process of making your contribution i ## How can I contribute... -* [Contribute Documentation:green_book:](#contribute-documentation) +* [Contribute Documentation :green_book:](#contribute-documentation) * [Contribute Code :computer:](#contribute-code) -* [Provide Support on Issues:pencil:](#provide-support-on-issues) +* [Provide Support on Issues :pencil:](#provide-support-on-issues) -* [Review Pull Requests:mag:](#review-pull-requests) +* [Review Pull Requests :mag:](#review-pull-requests) ## Contribute documentation From 036a5236741fd24c89eea80d1b76179e8e5f9214 Mon Sep 17 00:00:00 2001 From: Priya Gupta <147705955+priyagupta108@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:53:34 +0530 Subject: [PATCH 06/17] Fix: Add `.zip` extension to Windows package downloads for `Expand-Archive` Compatibility (#916) * Fix: specify filename during Windows package download * Changed unit test download urls --- __tests__/utils.test.ts | 38 +++++++++++++++++++++++++++++++++++++- dist/setup/index.js | 22 +++++++++++++++++++--- src/install-pypy.ts | 6 ++++-- src/install-python.ts | 5 +++-- src/utils.ts | 14 ++++++++++++++ 5 files changed, 77 insertions(+), 8 deletions(-) diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index f5e36478..c2c6bca5 100644 --- a/__tests__/utils.test.ts +++ b/__tests__/utils.test.ts @@ -12,7 +12,9 @@ import { getVersionInputFromFile, getVersionInputFromPlainFile, getVersionInputFromTomlFile, - getNextPageUrl + getNextPageUrl, + IS_WINDOWS, + getDownloadFileName } from '../src/utils'; jest.mock('@actions/cache'); @@ -159,3 +161,37 @@ describe('getNextPageUrl', () => { expect(getNextPageUrl(generateResponse(page2Links))).toBeNull(); }); }); + +describe('getDownloadFileName', () => { + const originalEnv = process.env; + const tempDir = path.join(__dirname, 'runner', 'temp'); + + beforeEach(() => { + process.env = {...originalEnv}; + }); + + afterEach(() => { + process.env = originalEnv; + }); + + it('should return the correct path on Windows', () => { + if (IS_WINDOWS) { + process.env['RUNNER_TEMP'] = tempDir; + const downloadUrl = + 'https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-win32-x64.zip'; + const expectedPath = path.join( + process.env.RUNNER_TEMP, + path.basename(downloadUrl) + ); + expect(getDownloadFileName(downloadUrl)).toBe(expectedPath); + } + }); + + it('should return undefined on non-Windows', () => { + if (!IS_WINDOWS) { + const downloadUrl = + 'https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-linux-x64.tar.gz'; + expect(getDownloadFileName(downloadUrl)).toBeUndefined(); + } + }); +}); diff --git a/dist/setup/index.js b/dist/setup/index.js index 039a5f5b..e3bb93ba 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -91441,7 +91441,8 @@ function installPyPy(pypyVersion, pythonVersion, architecture, allowPreReleases, const downloadUrl = `${foundAsset.download_url}`; core.info(`Downloading PyPy from "${downloadUrl}" ...`); try { - const pypyPath = yield tc.downloadTool(downloadUrl); + const fileName = (0, utils_1.getDownloadFileName)(downloadUrl); + const pypyPath = yield tc.downloadTool(downloadUrl, fileName); core.info('Extracting downloaded archive...'); if (utils_1.IS_WINDOWS) { downloadDir = yield tc.extractZip(pypyPath); @@ -91703,7 +91704,8 @@ function installCpythonFromRelease(release) { core.info(`Download from "${downloadUrl}"`); let pythonPath = ''; try { - pythonPath = yield tc.downloadTool(downloadUrl, undefined, AUTH); + const fileName = (0, utils_1.getDownloadFileName)(downloadUrl); + pythonPath = yield tc.downloadTool(downloadUrl, fileName, AUTH); core.info('Extract downloaded archive'); let pythonExtractedFolder; if (utils_1.IS_WINDOWS) { @@ -91938,7 +91940,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getNextPageUrl = exports.getBinaryDirectory = exports.getVersionInputFromFile = exports.getVersionInputFromPlainFile = exports.getVersionInputFromTomlFile = exports.getOSInfo = exports.getLinuxInfo = exports.logWarning = exports.isCacheFeatureAvailable = exports.isGhes = exports.validatePythonVersionFormatForPyPy = exports.writeExactPyPyVersionFile = exports.readExactPyPyVersionFile = exports.getPyPyVersionFromPath = exports.isNightlyKeyword = exports.validateVersion = exports.createSymlinkInFolder = exports.WINDOWS_PLATFORMS = exports.WINDOWS_ARCHS = exports.IS_MAC = exports.IS_LINUX = exports.IS_WINDOWS = void 0; +exports.getDownloadFileName = exports.getNextPageUrl = exports.getBinaryDirectory = exports.getVersionInputFromFile = exports.getVersionInputFromPlainFile = exports.getVersionInputFromTomlFile = exports.getOSInfo = exports.getLinuxInfo = exports.logWarning = exports.isCacheFeatureAvailable = exports.isGhes = exports.validatePythonVersionFormatForPyPy = exports.writeExactPyPyVersionFile = exports.readExactPyPyVersionFile = exports.getPyPyVersionFromPath = exports.isNightlyKeyword = exports.validateVersion = exports.createSymlinkInFolder = exports.WINDOWS_PLATFORMS = exports.WINDOWS_ARCHS = exports.IS_MAC = exports.IS_LINUX = exports.IS_WINDOWS = void 0; /* eslint no-unsafe-finally: "off" */ const cache = __importStar(__nccwpck_require__(7799)); const core = __importStar(__nccwpck_require__(2186)); @@ -92198,6 +92200,20 @@ function getNextPageUrl(response) { return null; } exports.getNextPageUrl = getNextPageUrl; +/** + * Add temporary fix for Windows + * On Windows, it is necessary to retain the .zip extension for proper extraction. + * because the tc.extractZip() failure due to tc.downloadTool() not adding .zip extension. + * Related issue: https://github.com/actions/toolkit/issues/1179 + * Related issue: https://github.com/actions/setup-python/issues/819 + */ +function getDownloadFileName(downloadUrl) { + const tempDir = process.env.RUNNER_TEMP || '.'; + return exports.IS_WINDOWS + ? path.join(tempDir, path.basename(downloadUrl)) + : undefined; +} +exports.getDownloadFileName = getDownloadFileName; /***/ }), diff --git a/src/install-pypy.ts b/src/install-pypy.ts index b624f1d7..75922110 100644 --- a/src/install-pypy.ts +++ b/src/install-pypy.ts @@ -14,7 +14,8 @@ import { createSymlinkInFolder, isNightlyKeyword, writeExactPyPyVersionFile, - getBinaryDirectory + getBinaryDirectory, + getDownloadFileName } from './utils'; export async function installPyPy( @@ -69,7 +70,8 @@ export async function installPyPy( core.info(`Downloading PyPy from "${downloadUrl}" ...`); try { - const pypyPath = await tc.downloadTool(downloadUrl); + const fileName = getDownloadFileName(downloadUrl); + const pypyPath = await tc.downloadTool(downloadUrl, fileName); core.info('Extracting downloaded archive...'); if (IS_WINDOWS) { diff --git a/src/install-python.ts b/src/install-python.ts index 3abdfde3..d3421bf8 100644 --- a/src/install-python.ts +++ b/src/install-python.ts @@ -4,7 +4,7 @@ import * as tc from '@actions/tool-cache'; import * as exec from '@actions/exec'; import * as httpm from '@actions/http-client'; import {ExecOptions} from '@actions/exec/lib/interfaces'; -import {IS_WINDOWS, IS_LINUX} from './utils'; +import {IS_WINDOWS, IS_LINUX, getDownloadFileName} from './utils'; const TOKEN = core.getInput('token'); const AUTH = !TOKEN ? undefined : `token ${TOKEN}`; @@ -98,7 +98,8 @@ export async function installCpythonFromRelease(release: tc.IToolRelease) { core.info(`Download from "${downloadUrl}"`); let pythonPath = ''; try { - pythonPath = await tc.downloadTool(downloadUrl, undefined, AUTH); + const fileName = getDownloadFileName(downloadUrl); + pythonPath = await tc.downloadTool(downloadUrl, fileName, AUTH); core.info('Extract downloaded archive'); let pythonExtractedFolder; if (IS_WINDOWS) { diff --git a/src/utils.ts b/src/utils.ts index 644b4af5..3d1b3dff 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -310,3 +310,17 @@ export function getNextPageUrl(response: ifm.TypedResponse) { } return null; } + +/** + * Add temporary fix for Windows + * On Windows, it is necessary to retain the .zip extension for proper extraction. + * because the tc.extractZip() failure due to tc.downloadTool() not adding .zip extension. + * Related issue: https://github.com/actions/toolkit/issues/1179 + * Related issue: https://github.com/actions/setup-python/issues/819 + */ +export function getDownloadFileName(downloadUrl: string): string | undefined { + const tempDir = process.env.RUNNER_TEMP || '.'; + return IS_WINDOWS + ? path.join(tempDir, path.basename(downloadUrl)) + : undefined; +} From 80b49d3ed89312896dbdcbefc2ddb159c7f8ca43 Mon Sep 17 00:00:00 2001 From: Zxilly <31370133+Zxilly@users.noreply.github.com> Date: Thu, 8 Aug 2024 04:12:32 +0800 Subject: [PATCH 07/17] fix: add arch to cache key (#896) * fix: add arch to cache key * test: update tests accordingly --- __tests__/cache-restore.test.ts | 6 +++--- dist/setup/index.js | 12 ++++++------ src/cache-distributions/pip-cache.ts | 8 ++++---- src/cache-distributions/pipenv-cache.ts | 2 +- src/cache-distributions/poetry-cache.ts | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/__tests__/cache-restore.test.ts b/__tests__/cache-restore.test.ts index a1a8d8d2..d84c2296 100644 --- a/__tests__/cache-restore.test.ts +++ b/__tests__/cache-restore.test.ts @@ -186,15 +186,15 @@ virtualenvs.path = "{cache-dir}/virtualenvs" # /Users/patrick/Library/Caches/py if (process.platform === 'linux' && packageManager === 'pip') { expect(infoSpy).toHaveBeenCalledWith( - `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-20.04-Ubuntu-python-${pythonVersion}-${packageManager}-${fileHash}` + `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-20.04-Ubuntu-python-${pythonVersion}-${packageManager}-${fileHash}` ); } else if (packageManager === 'poetry') { expect(infoSpy).toHaveBeenCalledWith( - `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-python-${pythonVersion}-${packageManager}-v2-${fileHash}` + `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-python-${pythonVersion}-${packageManager}-v2-${fileHash}` ); } else { expect(infoSpy).toHaveBeenCalledWith( - `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-python-${pythonVersion}-${packageManager}-${fileHash}` + `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-python-${pythonVersion}-${packageManager}-${fileHash}` ); } }, diff --git a/dist/setup/index.js b/dist/setup/index.js index e3bb93ba..0530081c 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -90423,12 +90423,12 @@ class PipCache extends cache_distributor_1.default { let restoreKey = ''; if (utils_1.IS_LINUX) { const osInfo = yield (0, utils_1.getLinuxInfo)(); - primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; - restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}`; + primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; + restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}`; } else { - primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; - restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}`; + primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; + restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}`; } return { primaryKey, @@ -90514,7 +90514,7 @@ class PipenvCache extends cache_distributor_1.default { 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 primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${process.arch}-${this.pythonVersion}-${this.packageManager}-${hash}`; const restoreKey = undefined; return { primaryKey, @@ -90627,7 +90627,7 @@ class PoetryCache extends cache_distributor_1.default { return __awaiter(this, void 0, void 0, function* () { const hash = yield glob.hashFiles(this.patterns); // "v2" is here to invalidate old caches of this cache distributor, which were created broken: - const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-v2-${hash}`; + const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-v2-${hash}`; const restoreKey = undefined; return { primaryKey, diff --git a/src/cache-distributions/pip-cache.ts b/src/cache-distributions/pip-cache.ts index 2ec3f9b0..d64ae931 100644 --- a/src/cache-distributions/pip-cache.ts +++ b/src/cache-distributions/pip-cache.ts @@ -67,11 +67,11 @@ class PipCache extends CacheDistributor { if (IS_LINUX) { const osInfo = await getLinuxInfo(); - primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; - restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}`; + primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; + restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}`; } else { - primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; - restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}`; + primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; + restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}`; } return { diff --git a/src/cache-distributions/pipenv-cache.ts b/src/cache-distributions/pipenv-cache.ts index fd1994a6..8ddcbed8 100644 --- a/src/cache-distributions/pipenv-cache.ts +++ b/src/cache-distributions/pipenv-cache.ts @@ -32,7 +32,7 @@ class PipenvCache extends CacheDistributor { 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 primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; const restoreKey = undefined; return { primaryKey, diff --git a/src/cache-distributions/poetry-cache.ts b/src/cache-distributions/poetry-cache.ts index c31fb05d..cd3a189b 100644 --- a/src/cache-distributions/poetry-cache.ts +++ b/src/cache-distributions/poetry-cache.ts @@ -47,7 +47,7 @@ class PoetryCache extends CacheDistributor { protected async computeKeys() { const hash = await glob.hashFiles(this.patterns); // "v2" is here to invalidate old caches of this cache distributor, which were created broken: - const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-v2-${hash}`; + const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-v2-${hash}`; const restoreKey = undefined; return { primaryKey, From 2bd53f9a4d1dd1cd21eaffcc01a7b91a8e73ea4c Mon Sep 17 00:00:00 2001 From: gowridurgad <159780674+gowridurgad@users.noreply.github.com> Date: Thu, 8 Aug 2024 23:24:56 +0530 Subject: [PATCH 08/17] Documentation update for caching poetry dependencies (#908) * Create testing.yml * Update testing.yml * Fix for parsing version number from TOML 1.0.0 pyproject.toml file * Delete .github/workflows/testing.yml * fixed license issue * updated the Note * updated doc * updated the doc * npm run build * Mark up corrections --------- Co-authored-by: gowridurgad Co-authored-by: HarithaVattikuti <73516759+HarithaVattikuti@users.noreply.github.com> --- dist/setup/index.js | 2 +- docs/advanced-usage.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dist/setup/index.js b/dist/setup/index.js index 0530081c..126f4a32 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -90514,7 +90514,7 @@ class PipenvCache extends cache_distributor_1.default { 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-${process.arch}-${this.pythonVersion}-${this.packageManager}-${hash}`; + const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; const restoreKey = undefined; return { primaryKey, diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 501c8fd4..65ccda28 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -319,6 +319,7 @@ steps: - run: poetry install - run: poetry run pytest ``` +>**Note:** If the `setup-python` version does not match the version specified in `pyproject.toml` and the python version in `pyproject.toml` is less than the runner's python version, `poetry install` will default to using the runner's Python version. **Using a list of file paths to cache dependencies** ```yaml From f677139bbe7f9c59b41e40162b753c062f5d49a3 Mon Sep 17 00:00:00 2001 From: aparnajyothi-y <147696841+aparnajyothi-y@users.noreply.github.com> Date: Wed, 14 Aug 2024 00:33:23 +0530 Subject: [PATCH 09/17] Bump pyinstaller from 3.6 to 5.13.1 in /__tests__/data (#923) * Update e2e-cache.yml * Update basic-validation.yml * Pyinstaller upgrade to 5.13.1 * pyinstaller-update * Update basic-validation.yml * Update e2e-cache.yml --- __tests__/cache-restore.test.ts | 38 ++- __tests__/data/poetry.lock | 501 ++++++++++---------------------- __tests__/data/pyproject.toml | 6 +- __tests__/data/requirements.txt | 2 +- 4 files changed, 180 insertions(+), 367 deletions(-) diff --git a/__tests__/cache-restore.test.ts b/__tests__/cache-restore.test.ts index d84c2296..d622607e 100644 --- a/__tests__/cache-restore.test.ts +++ b/__tests__/cache-restore.test.ts @@ -184,19 +184,31 @@ virtualenvs.path = "{cache-dir}/virtualenvs" # /Users/patrick/Library/Caches/py ); } - if (process.platform === 'linux' && packageManager === 'pip') { - expect(infoSpy).toHaveBeenCalledWith( - `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-20.04-Ubuntu-python-${pythonVersion}-${packageManager}-${fileHash}` - ); - } else if (packageManager === 'poetry') { - expect(infoSpy).toHaveBeenCalledWith( - `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-python-${pythonVersion}-${packageManager}-v2-${fileHash}` - ); - } else { - expect(infoSpy).toHaveBeenCalledWith( - `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-python-${pythonVersion}-${packageManager}-${fileHash}` - ); - } + const restoredKeys = restoreCacheSpy.mock.results.map( + result => result.value + ); + + restoredKeys.forEach(restoredKey => { + if (restoredKey) { + if (process.platform === 'linux' && packageManager === 'pip') { + expect(infoSpy).toHaveBeenCalledWith( + `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-20.04-Ubuntu-python-${pythonVersion}-${packageManager}-${fileHash}` + ); + } else if (packageManager === 'poetry') { + expect(infoSpy).toHaveBeenCalledWith( + `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-python-${pythonVersion}-${packageManager}-v2-${fileHash}` + ); + } else { + expect(infoSpy).toHaveBeenCalledWith( + `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-python-${pythonVersion}-${packageManager}-${fileHash}` + ); + } + } else { + expect(infoSpy).toHaveBeenCalledWith( + `${packageManager} cache is not found` + ); + } + }); }, 30000 ); diff --git a/__tests__/data/poetry.lock b/__tests__/data/poetry.lock index 2ad53033..4875695c 100644 --- a/__tests__/data/poetry.lock +++ b/__tests__/data/poetry.lock @@ -1,413 +1,212 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + [[package]] name = "altgraph" -version = "0.17.2" +version = "0.17.4" description = "Python graph (network) package" -category = "main" optional = false python-versions = "*" +files = [ + {file = "altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff"}, + {file = "altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406"}, +] [[package]] -name = "certifi" -version = "2020.6.20" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" 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 = "*" +python-versions = ">=3.6" +files = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] [package.dependencies] -docutils = "*" -Kivy-Garden = ">=0.1.4" -pygments = "*" +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "importlib-metadata" +version = "8.2.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, + {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, +] + +[package.dependencies] +zipp = ">=0.5" [package.extras] -tuio = ["oscpy"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[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" +name = "macholib" +version = "1.16.3" +description = "Mach-O header analysis and editing" optional = false python-versions = "*" +files = [ + {file = "macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c"}, + {file = "macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30"}, +] [package.dependencies] -requests = "*" +altgraph = ">=0.17" + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = "*" +files = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] [[package]] name = "packaging" -version = "21.0" +version = "24.1" 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 = "*" +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] [[package]] name = "pefile" -version = "2021.9.3" +version = "2023.2.7" description = "Python PE parsing module" -category = "main" optional = false python-versions = ">=3.6.0" - -[package.dependencies] -future = "*" +files = [ + {file = "pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6"}, + {file = "pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc"}, +] [[package]] -name = "pillow" -version = "7.2.0" -description = "Python Imaging Library (Fork)" -category = "main" +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" optional = false -python-versions = ">=3.5" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] [[package]] -name = "pygments" -version = "2.6.1" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" +name = "pyflakes" +version = "2.4.0" +description = "passive checker of Python programs" optional = false -python-versions = ">=3.5" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] [[package]] name = "pyinstaller" -version = "3.6" +version = "5.13.1" 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.*" +python-versions = "<3.13,>=3.7" +files = [ + {file = "pyinstaller-5.13.1-py3-none-macosx_10_13_universal2.whl", hash = "sha256:3c9cfe6d5d2f392d5d47389f6d377a8f225db460cdd01048b5a3de1d99c24ebe"}, + {file = "pyinstaller-5.13.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:29341d2e86d5ce7df993e797ee96ef679041fc85376d31c35c7b714085a21299"}, + {file = "pyinstaller-5.13.1-py3-none-manylinux2014_i686.whl", hash = "sha256:ad6e31a8f35a463c6140e4cf979859197edc9831a1039253408b0fe5eec274dc"}, + {file = "pyinstaller-5.13.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:5d801db3ceee58d01337473ea897e96e4bb21421a169dd7cf8716754617ff7fc"}, + {file = "pyinstaller-5.13.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:2519db3edec87d8c33924c2c4b7e176d8c1bbd9ba892d77efb67281925e621d6"}, + {file = "pyinstaller-5.13.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e033218c8922f0342b6095fb444ecb3bc6747dfa58cac5eac2b985350f4b681e"}, + {file = "pyinstaller-5.13.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:086e68aa1e72f6aa13b9d170a395755e2b194b8ab410caeed02d16b432410c8c"}, + {file = "pyinstaller-5.13.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:aa609aca62edd8cdcf7740677a21525e6c23b5e9a8f821ec8a80c68947771b5d"}, + {file = "pyinstaller-5.13.1-py3-none-win32.whl", hash = "sha256:b8d4000af72bf72f8185d420cd0a0aee0961f03a5c3511dc3ff08cdaef0583de"}, + {file = "pyinstaller-5.13.1-py3-none-win_amd64.whl", hash = "sha256:b70ebc10811b30bbea4cf5b81fd1477db992c2614cf215edc987cda9c5468911"}, + {file = "pyinstaller-5.13.1-py3-none-win_arm64.whl", hash = "sha256:78d1601a11475b95dceff6eaf0c9cd74d93e3f47b5ce4ad63cd76e7a369d3d04"}, + {file = "pyinstaller-5.13.1.tar.gz", hash = "sha256:a2e7a1d76a7ac26f1db849d691a374f2048b0e204233028d25d79a90ecd1fec8"}, +] [package.dependencies] altgraph = "*" -dis3 = "*" +macholib = {version = ">=1.8", markers = "sys_platform == \"darwin\""} +pefile = {version = ">=2022.5.30", markers = "sys_platform == \"win32\""} +pyinstaller-hooks-contrib = ">=2021.4" +pywin32-ctypes = {version = ">=0.2.1", markers = "sys_platform == \"win32\""} +setuptools = ">=42.0.0" + +[package.extras] +encryption = ["tinyaes (>=1.0.0)"] +hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"] [[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" +name = "pyinstaller-hooks-contrib" +version = "2024.8" +description = "Community maintained hooks for PyInstaller" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.8" +files = [ + {file = "pyinstaller_hooks_contrib-2024.8-py3-none-any.whl", hash = "sha256:0057fe9a5c398d3f580e73e58793a1d4a8315ca91c3df01efea1c14ed557825a"}, + {file = "pyinstaller_hooks_contrib-2024.8.tar.gz", hash = "sha256:29b68d878ab739e967055b56a93eb9b58e529d5b054fbab7a2f2bacf80cef3e2"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} +packaging = ">=22.0" +setuptools = ">=42.0.0" [[package]] name = "pywin32-ctypes" -version = "0.2.0" -description = "" -category = "main" +version = "0.2.2" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, +] [[package]] -name = "requests" -version = "2.24.0" -description = "Python HTTP for Humans." -category = "main" +name = "setuptools" +version = "72.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" 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" +python-versions = ">=3.8" +files = [ + {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, + {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, +] [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] -name = "urllib3" -version = "1.25.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" +name = "zipp" +version = "3.20.0" +description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=3.8" +files = [ + {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, + {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, +] [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.*" +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [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"}, -] +lock-version = "2.0" +python-versions = ">=3.8,<3.13" +content-hash = "46617f6f661c740ba597c9c9ff83ccf6b41b6a77139e38b062fec14d3a57c6d9" diff --git a/__tests__/data/pyproject.toml b/__tests__/data/pyproject.toml index ff4d8bd0..ea11cea4 100644 --- a/__tests__/data/pyproject.toml +++ b/__tests__/data/pyproject.toml @@ -5,11 +5,13 @@ description = "" authors = ["Your Name "] [tool.poetry.dependencies] -python = "^3.8" +python = ">=3.8,<3.13" flake8 = "^4.0.1" +pyinstaller = "5.13.1" + [tool.poetry.dev-dependencies] [build-system] requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/__tests__/data/requirements.txt b/__tests__/data/requirements.txt index fa40ab3c..62b581b2 100644 --- a/__tests__/data/requirements.txt +++ b/__tests__/data/requirements.txt @@ -34,7 +34,7 @@ pillow==7.2 pygments==2.6.1 -pyinstaller==3.6 +pyinstaller==5.13.1 pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2' From 29a37be0a3d3e8bf5bc1eb19cd0502922f5b312a Mon Sep 17 00:00:00 2001 From: priya-kinthali <147703874+priya-kinthali@users.noreply.github.com> Date: Fri, 6 Sep 2024 22:10:29 +0530 Subject: [PATCH 10/17] initial commit (#938) --- dist/setup/index.js | 4 +++- package-lock.json | 8 ++++---- src/utils.ts | 5 ++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/dist/setup/index.js b/dist/setup/index.js index 126f4a32..f1e3e297 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -92118,7 +92118,9 @@ function extractValue(obj, keys) { */ function getVersionInputFromTomlFile(versionFile) { core.debug(`Trying to resolve version form ${versionFile}`); - const pyprojectFile = fs_1.default.readFileSync(versionFile, 'utf8'); + let pyprojectFile = fs_1.default.readFileSync(versionFile, 'utf8'); + // Normalize the line endings in the pyprojectFile + pyprojectFile = pyprojectFile.replace(/\r\n/g, '\n'); const pyprojectConfig = toml.parse(pyprojectFile); let keys = []; if ('project' in pyprojectConfig) { diff --git a/package-lock.json b/package-lock.json index e5b2190b..14174608 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4284,12 +4284,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { diff --git a/src/utils.ts b/src/utils.ts index 3d1b3dff..f3aa1ef1 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -224,7 +224,10 @@ function extractValue(obj: any, keys: string[]): string | undefined { export function getVersionInputFromTomlFile(versionFile: string): string[] { core.debug(`Trying to resolve version form ${versionFile}`); - const pyprojectFile = fs.readFileSync(versionFile, 'utf8'); + let pyprojectFile = fs.readFileSync(versionFile, 'utf8'); + // Normalize the line endings in the pyprojectFile + pyprojectFile = pyprojectFile.replace(/\r\n/g, '\n'); + const pyprojectConfig = toml.parse(pyprojectFile); let keys = []; From 65b48c71155ac3186106d8d8de14787f5914b8d1 Mon Sep 17 00:00:00 2001 From: Joel Ambass Date: Tue, 10 Sep 2024 16:54:46 +0200 Subject: [PATCH 11/17] Create publish-immutable-actions.yml This workflow file publishes new action releases to the immutable action package of the same name as this repo. This is part of the Immutable Actions project which is not yet fully released to the public. First party actions like this one are part of our initial testing of this feature. --- .../workflows/publish-immutable-actions.yml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/publish-immutable-actions.yml diff --git a/.github/workflows/publish-immutable-actions.yml b/.github/workflows/publish-immutable-actions.yml new file mode 100644 index 00000000..1e02a3a1 --- /dev/null +++ b/.github/workflows/publish-immutable-actions.yml @@ -0,0 +1,22 @@ +name: 'Publish Immutable Action Version' + +on: + release: + types: [created] + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + packages: write + + steps: + - name: Checking out + uses: actions/checkout@v4 + - name: Publish + id: publish + uses: actions/publish-immutable-action@0.0.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} From 3226af69c08a4851edf81cffc8849d2db148b21f Mon Sep 17 00:00:00 2001 From: Joel Ambass Date: Mon, 16 Sep 2024 17:18:49 +0200 Subject: [PATCH 12/17] Upgrade IA publish --- .github/workflows/publish-immutable-actions.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish-immutable-actions.yml b/.github/workflows/publish-immutable-actions.yml index 1e02a3a1..87c02072 100644 --- a/.github/workflows/publish-immutable-actions.yml +++ b/.github/workflows/publish-immutable-actions.yml @@ -2,7 +2,7 @@ name: 'Publish Immutable Action Version' on: release: - types: [created] + types: [published] jobs: publish: @@ -17,6 +17,4 @@ jobs: uses: actions/checkout@v4 - name: Publish id: publish - uses: actions/publish-immutable-action@0.0.1 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} + uses: actions/publish-immutable-action@0.0.3 From 19dfb7b659fa9e60c2f89c33335ab5f6f1792b6e Mon Sep 17 00:00:00 2001 From: Jeff Widman Date: Fri, 4 Oct 2024 09:28:10 -0700 Subject: [PATCH 13/17] Bump default versions to latest (#905) People copy/paste these values all the time... might as well start them off on the right foot with a modern default. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 21960a0f..864fda70 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.12' - run: python my_script.py ``` @@ -31,7 +31,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: 'pypy3.9' + python-version: 'pypy3.10' - run: python my_script.py ``` @@ -41,7 +41,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: 'graalpy-22.3' + python-version: 'graalpy-24.0' - run: python my_script.py ``` @@ -76,7 +76,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.12' cache: 'pip' # caching pip dependencies - run: pip install -r requirements.txt ``` From f4c5a1183d69690d31b6304b7af403a5b56a88d6 Mon Sep 17 00:00:00 2001 From: John Wesley Walker III <81404201+jww3@users.noreply.github.com> Date: Mon, 21 Oct 2024 18:42:17 +0200 Subject: [PATCH 14/17] Revise `isGhes` logic (#963) * Revise `isGhes` logic * ran `npm run format` * add unit test * ran `npm run format` --- __tests__/utils.test.ts | 39 +++++++++++++++++++++++++++++++++++++++ dist/setup/index.js | 6 +++++- src/utils.ts | 8 +++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index c2c6bca5..eac39ab6 100644 --- a/__tests__/utils.test.ts +++ b/__tests__/utils.test.ts @@ -13,6 +13,7 @@ import { getVersionInputFromPlainFile, getVersionInputFromTomlFile, getNextPageUrl, + isGhes, IS_WINDOWS, getDownloadFileName } from '../src/utils'; @@ -195,3 +196,41 @@ describe('getDownloadFileName', () => { } }); }); + +describe('isGhes', () => { + const pristineEnv = process.env; + + beforeEach(() => { + jest.resetModules(); + process.env = {...pristineEnv}; + }); + + afterAll(() => { + process.env = pristineEnv; + }); + + it('returns false when the GITHUB_SERVER_URL environment variable is not defined', async () => { + delete process.env['GITHUB_SERVER_URL']; + expect(isGhes()).toBeFalsy(); + }); + + it('returns false when the GITHUB_SERVER_URL environment variable is set to github.com', async () => { + process.env['GITHUB_SERVER_URL'] = 'https://github.com'; + expect(isGhes()).toBeFalsy(); + }); + + it('returns false when the GITHUB_SERVER_URL environment variable is set to a GitHub Enterprise Cloud-style URL', async () => { + process.env['GITHUB_SERVER_URL'] = 'https://contoso.ghe.com'; + expect(isGhes()).toBeFalsy(); + }); + + it('returns false when the GITHUB_SERVER_URL environment variable has a .localhost suffix', async () => { + process.env['GITHUB_SERVER_URL'] = 'https://mock-github.localhost'; + expect(isGhes()).toBeFalsy(); + }); + + it('returns true when the GITHUB_SERVER_URL environment variable is set to some other URL', async () => { + process.env['GITHUB_SERVER_URL'] = 'https://src.onpremise.fabrikam.com'; + expect(isGhes()).toBeTruthy(); + }); +}); diff --git a/dist/setup/index.js b/dist/setup/index.js index f1e3e297..e56f9660 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -92017,7 +92017,11 @@ function validatePythonVersionFormatForPyPy(version) { exports.validatePythonVersionFormatForPyPy = validatePythonVersionFormatForPyPy; function isGhes() { const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com'); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; + const hostname = ghUrl.hostname.trimEnd().toUpperCase(); + const isGitHubHost = hostname === 'GITHUB.COM'; + const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM'); + const isLocalHost = hostname.endsWith('.LOCALHOST'); + return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost; } exports.isGhes = isGhes; function isCacheFeatureAvailable() { diff --git a/src/utils.ts b/src/utils.ts index f3aa1ef1..a6dab63e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -116,7 +116,13 @@ export function isGhes(): boolean { const ghUrl = new URL( process.env['GITHUB_SERVER_URL'] || 'https://github.com' ); - return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; + + const hostname = ghUrl.hostname.trimEnd().toUpperCase(); + const isGitHubHost = hostname === 'GITHUB.COM'; + const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM'); + const isLocalHost = hostname.endsWith('.LOCALHOST'); + + return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost; } export function isCacheFeatureAvailable(): boolean { From 9c76e716502b18322365741b762fee22a8cffad8 Mon Sep 17 00:00:00 2001 From: aparnajyothi-y <147696841+aparnajyothi-y@users.noreply.github.com> Date: Tue, 22 Oct 2024 02:09:11 +0530 Subject: [PATCH 15/17] Bump pillow from 7.2 to 10.2.0 in /__tests__/data (#956) * Update e2e-cache.yml * Update basic-validation.yml * Pyinstaller upgrade to 5.13.1 * pyinstaller-update * Update basic-validation.yml * Update e2e-cache.yml * fix-db-alert-164-165-166 * upgrade pillow --- __tests__/data/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/data/requirements.txt b/__tests__/data/requirements.txt index 62b581b2..265872b8 100644 --- a/__tests__/data/requirements.txt +++ b/__tests__/data/requirements.txt @@ -30,7 +30,7 @@ pdf2image==1.12.1 pefile==2021.9.3; python_full_version >= '3.6.0' -pillow==7.2 +pillow>=10.2.0 pygments==2.6.1 From 0b93645e9fea7318ecaed2b359559ac225c90a2b Mon Sep 17 00:00:00 2001 From: priya-kinthali <147703874+priya-kinthali@users.noreply.github.com> Date: Thu, 24 Oct 2024 19:08:22 +0530 Subject: [PATCH 16/17] Enhance workflows: Add macOS 13 support, upgrade publish-action, and update documentation for arm64 and latest versions (#965) * update ci workflows with latest versions and added macos-13 * updated document with latest versions --- .github/workflows/e2e-cache.yml | 20 ++-- .github/workflows/e2e-tests.yml | 88 ++++++++++------- .../workflows/release-new-action-version.yml | 2 +- .github/workflows/test-graalpy.yml | 14 +-- .github/workflows/test-pypy.yml | 18 ++-- .github/workflows/test-python.yml | 67 ++++++------- README.md | 6 +- action.yml | 2 +- docs/advanced-usage.md | 97 ++++++++++--------- 9 files changed, 170 insertions(+), 144 deletions(-) diff --git a/.github/workflows/e2e-cache.yml b/.github/workflows/e2e-cache.yml index 0c73a0b0..e30031f1 100644 --- a/.github/workflows/e2e-cache.yml +++ b/.github/workflows/e2e-cache.yml @@ -21,8 +21,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.9', 'pypy-3.9-v7.x'] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + python-version: ['3.9', 'pypy-3.9-v7.x', '3.10', 'pypy-3.10-v7.x'] steps: - uses: actions/checkout@v4 - name: Setup Python @@ -39,8 +39,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.9', 'pypy-3.9-v7.x'] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + python-version: ['3.9', 'pypy-3.9-v7.x', '3.10', 'pypy-3.10-v7.x'] steps: - uses: actions/checkout@v4 - name: Setup Python @@ -75,8 +75,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.9', 'pypy-3.9'] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + python-version: ['3.9', 'pypy-3.9-v7.x', '3.10', 'pypy-3.10-v7.x'] steps: - uses: actions/checkout@v4 - name: Install poetry @@ -97,8 +97,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.9', 'pypy-3.9-v7.x'] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + python-version: ['3.9', 'pypy-3.9-v7.x', '3.10', 'pypy-3.10-v7.x'] steps: - uses: actions/checkout@v4 - name: Setup Python @@ -116,8 +116,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.9', 'pypy-3.9-v7.x'] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + python-version: ['3.9', 'pypy-3.9-v7.x', '3.10', 'pypy-3.10-v7.x'] steps: - uses: actions/checkout@v4 - name: Setup Python diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index a14739de..3045cb00 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -12,30 +12,43 @@ on: workflow_dispatch: jobs: + test-setup-python-older: + name: Test setup-python old versions + runs-on: ${{ matrix.operating-system }} + strategy: + matrix: + operating-system: + [ubuntu-20.04, ubuntu-22.04, windows-latest, macos-latest, macos-13] + python: [3.8.10, 3.8.18] + exclude: + - operating-system: ubuntu-22.04 + python: '3.8.10' + - operating-system: macos-latest + python: '3.8.18' + - operating-system: windows-latest + python: '3.8.18' + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Run with setup-python ${{ matrix.python }} + id: setup-python + uses: ./ + with: + python-version: ${{ matrix.python }} + - name: Verify ${{ matrix.python }} + run: python __tests__/verify-python.py ${{ matrix.python }} test-setup-python: name: Test setup-python runs-on: ${{ matrix.operating-system }} strategy: matrix: - operating-system: [ubuntu-20.04, windows-latest] + operating-system: + [ubuntu-20.04, windows-latest, ubuntu-22.04, macos-latest, macos-13] steps: - name: Checkout uses: actions/checkout@v4 - - 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.8.10 - uses: ./ - with: - python-version: 3.8.10 - - name: Verify 3.8.10 - run: python __tests__/verify-python.py 3.8.10 - - name: Run with setup-python 3.9.13 uses: ./ with: @@ -57,36 +70,43 @@ jobs: - name: Verify 3.11.9 run: python __tests__/verify-python.py 3.11.9 - - name: Run with setup-python 3.12.4 + - name: Run with setup-python 3.12.7 uses: ./ with: - python-version: 3.12.4 - - name: Verify 3.12.4 - run: python __tests__/verify-python.py 3.12.4 + python-version: 3.12.7 + - name: Verify 3.12.7 + run: python __tests__/verify-python.py 3.12.7 - - name: Run with setup-python 3.10 - id: cp310 + - name: Run with setup-python 3.13.0 uses: ./ with: - python-version: '3.10' - - name: Verify 3.10 - run: python __tests__/verify-python.py 3.10 - - name: Run python-path sample 3.10 - run: pipx run --python '${{ steps.cp310.outputs.python-path }}' nox --version + python-version: 3.13.0 + - name: Verify 3.13.0 + run: python __tests__/verify-python.py 3.13.0 - - name: Run with setup-python ==3.8 + - name: Run with setup-python 3.13 + id: cp313 uses: ./ with: - python-version: '==3.8' - - name: Verify ==3.8 - run: python __tests__/verify-python.py 3.8 + python-version: '3.13' + - name: Verify 3.13 + run: python __tests__/verify-python.py 3.13 + - name: Run python-path sample 3.13 + run: pipx run --python '${{ steps.cp313.outputs.python-path }}' nox --version - - name: Run with setup-python <3.11 + - name: Run with setup-python ==3.13 uses: ./ with: - python-version: '<3.11' - - name: Verify <3.11 - run: python __tests__/verify-python.py 3.10 + python-version: '==3.13' + - name: Verify ==3.13 + run: python __tests__/verify-python.py 3.13 + + - name: Run with setup-python <3.13 + uses: ./ + with: + python-version: '<3.13' + - name: Verify <3.13 + run: python __tests__/verify-python.py 3.12 - name: Test Raw Endpoint Access run: | curl -L https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json | jq empty diff --git a/.github/workflows/release-new-action-version.yml b/.github/workflows/release-new-action-version.yml index d8171ef8..7e5de347 100644 --- a/.github/workflows/release-new-action-version.yml +++ b/.github/workflows/release-new-action-version.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Update the ${{ env.TAG_NAME }} tag - uses: actions/publish-action@v0.2.2 + uses: actions/publish-action@v0.3.0 with: source-tag: ${{ env.TAG_NAME }} slack-webhook: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.github/workflows/test-graalpy.yml b/.github/workflows/test-graalpy.yml index fe8f497e..9f01429e 100644 --- a/.github/workflows/test-graalpy.yml +++ b/.github/workflows/test-graalpy.yml @@ -18,10 +18,12 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, ubuntu-20.04, ubuntu-latest] + os: [macos-latest, ubuntu-20.04, ubuntu-latest, macos-13] graalpy: - - 'graalpy-23.0' - 'graalpy-22.3' + - 'graalpy-23.0' + - 'graalpy-23.1' + - 'graalpy-24.1' steps: - name: Checkout @@ -63,8 +65,8 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, ubuntu-20.04, ubuntu-latest] - graalpy: ['graalpy23.0', 'graalpy22.3'] + os: [macos-latest, ubuntu-20.04, ubuntu-latest, macos-13] + graalpy: ['graalpy22.3', 'graalpy23.0', 'graalpy23.1', 'graalpy24.1'] steps: - name: Checkout @@ -88,14 +90,14 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, macos-13] steps: - uses: actions/checkout@v4 - name: Setup GraalPy and check latest uses: ./ id: graalpy with: - python-version: 'graalpy-23.x' + python-version: 'graalpy-24.x' check-latest: true - name: GraalPy and Python version run: python --version diff --git a/.github/workflows/test-pypy.yml b/.github/workflows/test-pypy.yml index 355bc232..716f7501 100644 --- a/.github/workflows/test-pypy.yml +++ b/.github/workflows/test-pypy.yml @@ -20,19 +20,20 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-latest] + os: + [macos-latest, windows-latest, ubuntu-20.04, ubuntu-latest, macos-13] pypy: - 'pypy-2.7' - 'pypy-3.10' - 'pypy3.9' - - 'pypy-2.7-v7.3.14' - - 'pypy-3.10-v7.3.15' - - 'pypy-3.10-v7.3.14' + - 'pypy-2.7-v7.3.17' + - 'pypy-3.10-v7.3.17' + - 'pypy-3.10-v7.3.16' - 'pypy-3.10-v7.3.x' - 'pypy-3.10-v7.x' - 'pypy-2.7-v7.3.12rc1' - 'pypy-3.10-nightly' - - 'pypy3.10-v7.3.15' + - 'pypy3.10-v7.3.17' steps: - name: Checkout @@ -74,7 +75,8 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-latest] + os: + [macos-latest, windows-latest, ubuntu-20.04, ubuntu-latest, macos-13] pypy: ['pypy2.7', 'pypy3.9', 'pypy3.10-nightly'] steps: @@ -99,7 +101,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] steps: - uses: actions/checkout@v4 - name: Setup PyPy and check latest @@ -132,7 +134,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] steps: - uses: actions/checkout@v4 - name: Setup PyPy and check latest diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml index c8aef26c..dfb8ecde 100644 --- a/.github/workflows/test-python.yml +++ b/.github/workflows/test-python.yml @@ -20,8 +20,8 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] - python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3] + os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04, macos-13] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3, 3.13.0] exclude: - os: ubuntu-22.04 python: 3.8.10 @@ -58,8 +58,8 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] - python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3] + os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04, macos-13] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3, 3.13.0] exclude: - os: ubuntu-22.04 python: 3.8.10 @@ -99,8 +99,8 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] - python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3] + os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04, macos-13] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3, 3.13.0] exclude: - os: ubuntu-22.04 python: 3.8.10 @@ -138,8 +138,8 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] - python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, '==3.12.3'] + os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04, macos-13] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, '==3.12.3', 3.13.0] exclude: - os: ubuntu-22.04 python: 3.8.10 @@ -182,8 +182,8 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] - python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3] + os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04, macos-13] + python: [3.8.10, 3.9.13, 3.10.11, 3.11.9, 3.12.3, 3.13.0] exclude: - os: ubuntu-22.04 python: 3.8.10 @@ -221,21 +221,21 @@ jobs: run: python -c 'import math; print(math.factorial(5))' setup-pre-release-version-from-manifest: - name: Setup 3.13.0-alpha.6 ${{ matrix.os }} + name: Setup 3.14.0-alpha.1 ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] + os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04, macos-13] steps: - name: Checkout uses: actions/checkout@v4 - - name: setup-python 3.13.0-alpha.6 + - name: setup-python 3.14.0-alpha.1 id: setup-python uses: ./ with: - python-version: '3.13.0-alpha.6' + python-version: '3.14.0-alpha.1' - name: Check python-path run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' @@ -244,8 +244,8 @@ jobs: - name: Validate version run: | $pythonVersion = (python --version) - if ("Python 3.13.0a6" -ne "$pythonVersion"){ - Write-Host "The current version is $pythonVersion; expected version is 3.13.0a6" + if ("Python 3.14.0a1" -ne "$pythonVersion"){ + Write-Host "The current version is $pythonVersion; expected version is 3.14.0a1" exit 1 } $pythonVersion @@ -255,49 +255,49 @@ jobs: run: python -c 'import math; print(math.factorial(5))' setup-dev-version: - name: Setup 3.13-dev ${{ matrix.os }} + name: Setup 3.14-dev ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-latest] + os: [macos-latest, windows-latest, ubuntu-latest, macos-13] steps: - name: Checkout uses: actions/checkout@v4 - - name: setup-python 3.13-dev + - name: setup-python 3.14-dev id: setup-python uses: ./ with: - python-version: '3.13-dev' + python-version: '3.14-dev' - name: Check python-path run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' shell: bash - name: Validate version - run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.13.') }} + run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.14.') }} shell: bash - name: Run simple code run: python -c 'import math; print(math.factorial(5))' setup-prerelease-version: - name: Setup 3.13 ${{ matrix.os }} + name: Setup 3.14 ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-latest] + os: [macos-latest, windows-latest, ubuntu-latest, macos-13] steps: - name: Checkout uses: actions/checkout@v4 - - name: setup-python 3.13 + - name: setup-python 3.14 id: setup-python uses: ./ with: - python-version: '3.13' + python-version: '3.14' allow-prereleases: true - name: Check python-path @@ -305,7 +305,7 @@ jobs: shell: bash - name: Validate version - run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.13.') }} + run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.14.') }} shell: bash - name: Run simple code @@ -317,8 +317,8 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] - python: ['3.8', '3.9', '3.10', '3.11', '3.12'] + os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04, macos-13] + python: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] steps: - name: Checkout uses: actions/checkout@v4 @@ -341,8 +341,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] steps: - uses: actions/checkout@v4 - name: Setup Python and check latest @@ -365,7 +365,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + os: [ubuntu-latest, windows-latest, macos-latest, macos-13] steps: - uses: actions/checkout@v4 - name: Setup Python and check latest @@ -377,12 +377,13 @@ jobs: 3.10 3.11 3.12 + 3.13 check-latest: true - name: Validate version run: | $pythonVersion = (python --version) - if ("$pythonVersion" -NotMatch "3.12"){ - Write-Host "The current version is $pythonVersion; expected version is 3.12" + if ("$pythonVersion" -NotMatch "3.13"){ + Write-Host "The current version is $pythonVersion; expected version is 3.13" exit 1 } $pythonVersion diff --git a/README.md b/README.md index 864fda70..6ffab1fa 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.12' + python-version: '3.13' - run: python my_script.py ``` @@ -57,7 +57,7 @@ The `python-version` input supports the [Semantic Versioning Specification](http ## Supported architectures -Using `architecture` input it is possible to specify the required Python or PyPy interpreter architecture: `x86` or `x64`. If the input is not specified the architecture defaults to `x64`. +Using the `architecture` input, it is possible to specify the required Python or PyPy interpreter architecture: `x86`, `x64`, or `arm64`. If the input is not specified, the architecture defaults to the host OS architecture. ## Caching packages dependencies @@ -76,7 +76,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.12' + python-version: '3.13' cache: 'pip' # caching pip dependencies - run: pip install -r requirements.txt ``` diff --git a/action.yml b/action.yml index 5c466975..48755e9d 100644 --- a/action.yml +++ b/action.yml @@ -11,7 +11,7 @@ inputs: 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 or PyPy interpreter." + description: "The target architecture (x86, x64, arm64) of the Python or PyPy interpreter." check-latest: description: "Set this option if you want the action to check for the latest available version that satisfies the version spec." default: false diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 65ccda28..774bcefe 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -27,14 +27,14 @@ ### Specifying a Python version -If there is a specific version of Python that you need and you don't want to worry about any potential breaking changes due to patch updates (going from `3.7.5` to `3.7.6` for example), you should specify the **exact major, minor, and patch version** (such as `3.7.5`): +If there is a specific version of Python that you need and you don't want to worry about any potential breaking changes due to patch updates (going from `3.12.6` to `3.12.7` for example), you should specify the **exact major, minor, and patch version** (such as `3.12.6`): ```yaml steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.7.5' + python-version: '3.12.6' - run: python my_script.py ``` @@ -48,7 +48,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.7' + python-version: '3.13' - run: python my_script.py ``` - There will be a single patch version already installed on each runner for every minor version of Python that is supported. @@ -62,7 +62,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.12.0-alpha.1' + python-version: '3.14.0-alpha.1' - run: python my_script.py ``` @@ -73,7 +73,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.12-dev' + python-version: '3.14-dev' - run: python my_script.py ``` @@ -86,7 +86,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '>=3.9 <3.10' + python-version: '>=3.9 <3.14' - run: python my_script.py ``` @@ -97,7 +97,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.12.0-alpha - 3.12.0' + python-version: '3.13.0-alpha - 3.13.0' - run: python my_script.py ``` @@ -118,6 +118,7 @@ The version of PyPy should be specified in the format `pypy[-v

` parameter is optional and can be skipped. The latest PyPy version will be used in this case. ``` +pypy3.10 or pypy-3.10 # the latest available version of PyPy that supports Python 3.10 pypy3.9 or pypy-3.9 # the latest available version of PyPy that supports Python 3.9 pypy2.7 or pypy-2.7 # the latest available version of PyPy that supports Python 2.7 pypy3.7-v7.3.3 or pypy-3.7-v7.3.3 # Python 3.7 and PyPy 7.3.3 @@ -135,8 +136,8 @@ jobs: strategy: matrix: python-version: - - 'pypy3.7' # the latest available version of PyPy that supports Python 3.7 - - 'pypy3.7-v7.3.3' # Python 3.7 and PyPy 7.3.3 + - 'pypy3.10' # the latest available version of PyPy that supports Python 3.10 + - 'pypy3.10-v7.3.17' # Python 3.10 and PyPy 7.3.17 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 @@ -160,9 +161,9 @@ jobs: - uses: actions/setup-python@v5 with: python-version: | - 3.8 - 3.9 - 3.10 + 3.11 + 3.12 + 3.13 - run: python my_script.py ``` @@ -177,9 +178,9 @@ jobs: - uses: actions/setup-python@v5 with: python-version: | - pypy-3.7-v7.3.x - pypy3.9-nightly - pypy3.8 + pypy-3.10-v7.3.x + pypy3.10-nightly + pypy3.9 - run: python my_script.py ``` @@ -194,11 +195,11 @@ jobs: - uses: actions/setup-python@v5 with: python-version: | - 3.8 - 3.9 - pypy3.9-nightly - pypy3.8 - 3.10 + 3.11 + 3.12 + pypy3.10-nightly + pypy3.10 + 3.13 - run: python my_script.py ``` @@ -212,7 +213,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ '2.x', '3.x', 'pypy2.7', 'pypy3.8', 'pypy3.9' ] + python-version: ['3.x', 'pypy2.7', 'pypy3.8', 'pypy3.9' ] name: Python ${{ matrix.python-version }} sample steps: - uses: actions/checkout@v4 @@ -233,12 +234,12 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ['2.7', '3.7', '3.8', '3.9', '3.10', 'pypy2.7', 'pypy3.9'] + python-version: ['3.7', '3.8', '3.9', '3.10', 'pypy2.7', 'pypy3.9'] exclude: - os: macos-latest python-version: '3.8' - os: windows-latest - python-version: '3.6' + python-version: '3.8' steps: - uses: actions/checkout@v4 - name: Set up Python @@ -284,7 +285,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.7' + python-version: '3.13' check-latest: true - run: python my_script.py ``` @@ -299,7 +300,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.13' cache: 'pipenv' - name: Install pipenv run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python @@ -314,7 +315,7 @@ steps: run: pipx install poetry - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.13' cache: 'poetry' - run: poetry install - run: poetry run pytest @@ -327,7 +328,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.13' cache: 'pipenv' cache-dependency-path: | server/app/Pipfile.lock @@ -342,7 +343,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.13' cache: 'pip' cache-dependency-path: '**/requirements-dev.txt' - run: pip install -r subdirectory/requirements-dev.txt @@ -354,7 +355,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.13' cache: 'pip' cache-dependency-path: | **/setup.cfg @@ -369,7 +370,7 @@ steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.11' + python-version: '3.13' cache: 'pip' cache-dependency-path: setup.py - run: pip install -e . @@ -382,7 +383,7 @@ steps: ### `python-version` -Using **python-version** output it's possible to get the installed by action Python or PyPy version. This output is useful when the input `python-version` is given as a range (e.g. 3.8.0 - 3.10.0 ), but down in a workflow you need to operate with the exact installed version (e.g. 3.10.1). +Using **python-version** output it's possible to get the installed by action Python or PyPy version. This output is useful when the input `python-version` is given as a range (e.g. 3.8.0 - 3.12.0 ), but down in a workflow you need to operate with the exact installed version (e.g. 3.12.1). ```yaml jobs: @@ -391,10 +392,10 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 - id: cp310 + id: cp312 with: - python-version: "3.8.0 - 3.10.0" - - run: echo '${{ steps.cp310.outputs.python-version }}' + python-version: "3.8.0 - 3.12.0" + - run: echo '${{ steps.cp312.outputs.python-version }}' ``` ### `python-path` @@ -408,10 +409,10 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 - id: cp310 + id: cp313 with: - python-version: "3.10" - - run: pipx run --python '${{ steps.cp310.outputs.python-path }}' nox --version + python-version: "3.13" + - run: pipx run --python '${{ steps.cp313.outputs.python-path }}' nox --version ``` ### `cache-hit` @@ -424,11 +425,11 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 - id: cp310 + id: cp313 with: - python-version: "3.8.0" + python-version: "3.13.0" cache: "poetry" - - run: echo '${{ steps.cp310.outputs.cache-hit }}' # true if cache-hit occurred on the primary key + - run: echo '${{ steps.cp313.outputs.cache-hit }}' # true if cache-hit occurred on the primary key ``` ## Environment variables @@ -455,11 +456,11 @@ Such a requirement on side-effect could be because you don't want your composite steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 - id: cp310 + id: cp313 with: - python-version: '3.10' + python-version: '3.13' update-environment: false - - run: ${{ steps.cp310.outputs.python-path }} my_script.py + - run: ${{ steps.cp313.outputs.python-path }} my_script.py ``` ## Available versions of Python, PyPy and GraalPy ### Python @@ -469,9 +470,9 @@ Such a requirement on side-effect could be because you don't want your composite - Preinstalled versions of Python in the tool cache on GitHub-hosted runners. - For detailed information regarding the available versions of Python that are installed, see [Supported software](https://docs.github.com/en/actions/reference/specifications-for-github-hosted-runners#supported-software). - For every minor version of Python, expect only the latest patch to be preinstalled. - - If `3.8.1` is installed for example, and `3.8.2` is released, expect `3.8.1` to be removed and replaced by `3.8.2` in the tool cache. - - If the exact patch version doesn't matter to you, specifying just the major and minor versions will get you the latest preinstalled patch version. In the previous example, the version spec `3.8` will use the `3.8.2` Python version found in the cache. - - Use `-dev` instead of a patch number (e.g., `3.12-dev`) to install the latest patch version release for a given minor version, *alpha and beta releases included*. + - If `3.12.1` is installed for example, and `3.12.2` is released, expect `3.12.1` to be removed and replaced by `3.12.2` in the tool cache. + - If the exact patch version doesn't matter to you, specifying just the major and minor versions will get you the latest preinstalled patch version. In the previous example, the version spec `3.12` will use the `3.12.2` Python version found in the cache. + - Use `-dev` instead of a patch number (e.g., `3.14-dev`) to install the latest patch version release for a given minor version, *alpha and beta releases included*. - Downloadable Python versions from GitHub Releases ([actions/python-versions](https://github.com/actions/python-versions/releases)). - All available versions are listed in the [version-manifest.json](https://github.com/actions/python-versions/blob/main/versions-manifest.json) file. - If there is a specific version of Python that is not available, you can open an issue here @@ -485,7 +486,7 @@ Such a requirement on side-effect could be because you don't want your composite - Preinstalled versions of PyPy in the tool cache on GitHub-hosted runners - For detailed information regarding the available versions of PyPy that are installed, see [Supported software](https://docs.github.com/en/actions/reference/specifications-for-github-hosted-runners#supported-software). - For the latest PyPy release, all versions of Python are cached. - - Cache is updated with a 1-2 week delay. If you specify the PyPy version as `pypy3.7` or `pypy-3.7`, the cached version will be used although a newer version is available. If you need to start using the recently released version right after release, you should specify the exact PyPy version using `pypy3.7-v7.3.3` or `pypy-3.7-v7.3.3`. + - Cache is updated with a 1-2 week delay. If you specify the PyPy version as `pypy3.10` or `pypy-3.10`, the cached version will be used although a newer version is available. If you need to start using the recently released version right after release, you should specify the exact PyPy version using `pypy3.10-v7.3.17` or `pypy-3.10-v7.3.17`. - Downloadable PyPy versions from the [official PyPy site](https://downloads.python.org/pypy/). - All available versions that we can download are listed in [versions.json](https://downloads.python.org/pypy/versions.json) file. @@ -596,7 +597,7 @@ jobs: fail-fast: false matrix: os: [Ubuntu, Windows, macOS] - python_version: ["3.11", "3.12"] + python_version: ["3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 From 55aad42e4674b58b2b2fb7d8e7552402d922b4e7 Mon Sep 17 00:00:00 2001 From: aparnajyothi-y <147696841+aparnajyothi-y@users.noreply.github.com> Date: Tue, 5 Nov 2024 06:57:40 +0530 Subject: [PATCH 17/17] Update error message for no dependencies to cache (#968) --- dist/cache-save/index.js | 2 +- src/cache-save.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/cache-save/index.js b/dist/cache-save/index.js index aa4501f9..2b22f4a7 100644 --- a/dist/cache-save/index.js +++ b/dist/cache-save/index.js @@ -81165,7 +81165,7 @@ function saveCache(packageManager) { const cachePaths = JSON.parse(cachePathState); core.debug(`paths for caching are ${cachePaths.join(', ')}`); if (!isCacheDirectoryExists(cachePaths)) { - throw new Error(`Cache folder path is retrieved for ${packageManager} but doesn't exist on disk: ${cachePaths.join(', ')}`); + throw new Error(`Cache folder path is retrieved for ${packageManager} but doesn't exist on disk: ${cachePaths.join(', ')}. This likely indicates that there are no dependencies to cache. Consider removing the cache step if it is not needed.`); } const primaryKey = core.getState(cache_distributor_1.State.STATE_CACHE_PRIMARY_KEY); const matchedKey = core.getState(cache_distributor_1.State.CACHE_MATCHED_KEY); diff --git a/src/cache-save.ts b/src/cache-save.ts index fbb481c1..4aec04e4 100644 --- a/src/cache-save.ts +++ b/src/cache-save.ts @@ -41,7 +41,7 @@ async function saveCache(packageManager: string) { throw new Error( `Cache folder path is retrieved for ${packageManager} but doesn't exist on disk: ${cachePaths.join( ', ' - )}` + )}. This likely indicates that there are no dependencies to cache. Consider removing the cache step if it is not needed.` ); }