renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
209 lines • 7.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.api = exports.supportedRangeStrategies = exports.supportsRanges = exports.urls = exports.displayName = exports.id = void 0;
exports.isValid = isValid;
const semver_utils_1 = require("semver-utils");
const logger_1 = require("../../../logger");
const npm_1 = require("../npm");
const pep440_1 = require("../pep440");
const patterns_1 = require("./patterns");
const transform_1 = require("./transform");
exports.id = 'poetry';
exports.displayName = 'Poetry';
exports.urls = [
'https://python-poetry.org/docs/dependency-specification/',
'https://python-poetry.org/docs/faq#why-does-poetry-not-adhere-to-semantic-versioning',
'https://python-poetry.org/docs/faq#why-does-poetry-enforce-pep-440-versions',
];
exports.supportsRanges = true;
exports.supportedRangeStrategies = [
'bump',
'widen',
'pin',
'replace',
];
function equals(a, b) {
const semverA = (0, transform_1.poetry2semver)(a);
const semverB = (0, transform_1.poetry2semver)(b);
return !!(semverA && semverB && npm_1.api.equals(semverA, semverB));
}
function getMajor(version) {
const semverVersion = (0, transform_1.poetry2semver)(version);
return semverVersion ? npm_1.api.getMajor(semverVersion) : null;
}
function getMinor(version) {
const semverVersion = (0, transform_1.poetry2semver)(version);
return semverVersion ? npm_1.api.getMinor(semverVersion) : null;
}
function getPatch(version) {
const semverVersion = (0, transform_1.poetry2semver)(version);
return semverVersion ? npm_1.api.getPatch(semverVersion) : null;
}
function isVersion(input) {
return patterns_1.VERSION_PATTERN.test(input);
}
function isGreaterThan(a, b) {
return !!(a && b && pep440_1.api.isGreaterThan(a, b));
}
function isLessThanRange(version, range) {
const semverVersion = (0, transform_1.poetry2semver)(version);
return !!(isVersion(version) &&
semverVersion &&
npm_1.api.isLessThanRange?.(semverVersion, (0, transform_1.poetry2npm)(range)));
}
function isValid(input) {
if (!input) {
return false;
}
try {
return npm_1.api.isValid((0, transform_1.poetry2npm)(input, true));
}
catch {
logger_1.logger.once.debug({ version: input }, 'Poetry version or range is not supported by current implementation');
return false;
}
}
function isStable(version) {
const semverVersion = (0, transform_1.poetry2semver)(version);
return !!(semverVersion && npm_1.api.isStable(semverVersion));
}
function matches(version, range) {
const semverVersion = (0, transform_1.poetry2semver)(version);
return !!(isVersion(version) &&
semverVersion &&
npm_1.api.matches(semverVersion, (0, transform_1.poetry2npm)(range)));
}
function getSatisfyingVersion(versions, range) {
const semverVersions = [];
versions.forEach((version) => {
const semverVersion = (0, transform_1.poetry2semver)(version);
if (semverVersion) {
semverVersions.push(semverVersion);
}
});
const npmRange = (0, transform_1.poetry2npm)(range);
const satisfyingVersion = npm_1.api.getSatisfyingVersion(semverVersions, npmRange);
return satisfyingVersion ? (0, transform_1.semver2poetry)(satisfyingVersion) : null;
}
function minSatisfyingVersion(versions, range) {
const semverVersions = [];
versions.forEach((version) => {
const semverVersion = (0, transform_1.poetry2semver)(version);
if (semverVersion) {
semverVersions.push(semverVersion);
}
});
const npmRange = (0, transform_1.poetry2npm)(range);
const satisfyingVersion = npm_1.api.minSatisfyingVersion(semverVersions, npmRange);
return satisfyingVersion ? (0, transform_1.semver2poetry)(satisfyingVersion) : null;
}
function isSingleVersion(constraint) {
return ((constraint.trim().startsWith('=') &&
isVersion(constraint.trim().substring(1).trim())) ||
isVersion(constraint.trim()));
}
function handleShort(operator, currentValue, newVersion) {
const toVersionMajor = getMajor(newVersion);
const toVersionMinor = getMinor(newVersion);
const split = currentValue.split('.');
if (toVersionMajor !== null && split.length === 1) {
// [^,~]4
return `${operator}${toVersionMajor}`;
}
if (toVersionMajor !== null &&
toVersionMinor !== null &&
split.length === 2) {
// [^,~]4.1
return `${operator}${toVersionMajor}.${toVersionMinor}`;
}
return null;
}
function getNewValue({ currentValue, rangeStrategy, currentVersion, newVersion, }) {
if (rangeStrategy === 'pin') {
return newVersion;
}
if (rangeStrategy === 'replace') {
const npmCurrentValue = (0, transform_1.poetry2npm)(currentValue);
try {
const massagedNewVersion = (0, transform_1.poetry2semver)(newVersion);
if (massagedNewVersion &&
isVersion(massagedNewVersion) &&
npm_1.api.matches(massagedNewVersion, npmCurrentValue)) {
return currentValue;
}
}
catch (err) /* istanbul ignore next */ {
logger_1.logger.info({ err }, 'Poetry versioning: Error caught checking if newVersion satisfies currentValue');
}
const parsedRange = (0, semver_utils_1.parseRange)(npmCurrentValue);
const element = parsedRange[parsedRange.length - 1];
if (parsedRange.length === 1 && element.operator) {
if (element.operator === '^') {
const version = handleShort('^', npmCurrentValue, newVersion);
if (version) {
return (0, transform_1.npm2poetry)(version);
}
}
if (element.operator === '~') {
const version = handleShort('~', npmCurrentValue, newVersion);
if (version) {
return (0, transform_1.npm2poetry)(version);
}
}
}
}
// Explicitly check whether this is a fully-qualified version
if ((patterns_1.VERSION_PATTERN.exec(newVersion)?.groups?.release ?? '').split('.')
.length !== 3) {
logger_1.logger.debug('Cannot massage python version to npm - returning currentValue');
return currentValue;
}
try {
const currentSemverVersion = currentVersion && (0, transform_1.poetry2semver)(currentVersion);
const newSemverVersion = (0, transform_1.poetry2semver)(newVersion);
if (currentSemverVersion && newSemverVersion) {
const newSemver = npm_1.api.getNewValue({
currentValue: (0, transform_1.poetry2npm)(currentValue),
rangeStrategy,
currentVersion: currentSemverVersion,
newVersion: newSemverVersion,
});
const newPoetry = newSemver && (0, transform_1.npm2poetry)(newSemver);
if (newPoetry) {
return newPoetry;
}
}
}
catch (err) /* istanbul ignore next */ {
logger_1.logger.debug({ currentValue, rangeStrategy, currentVersion, newVersion, err }, 'Could not generate new value using npm.getNewValue()');
}
// istanbul ignore next
return currentValue;
}
function sortVersions(a, b) {
return pep440_1.api.sortVersions(a, b);
}
function subset(subRange, superRange) {
return npm_1.api.subset((0, transform_1.poetry2npm)(subRange), (0, transform_1.poetry2npm)(superRange));
}
exports.api = {
equals,
getMajor,
getMinor,
getPatch,
getNewValue,
getSatisfyingVersion,
isCompatible: isVersion,
isGreaterThan,
isLessThanRange,
isSingleVersion,
isStable,
isValid,
isVersion,
matches,
minSatisfyingVersion,
sortVersions,
subset,
};
exports.default = exports.api;
//# sourceMappingURL=index.js.map