1
0
mirror of https://github.com/badges/shields.git synced 2025-04-18 19:44:04 +03:00
shields/services/pypi/pypi-python-versions.service.js
Leo Q e8671be7f2
support setting pypiBaseUrl by environment variables and queryParameters; affects [pypi] (#10044)
* support setting pypiBaseUrl by environment variables

* Add support for pypiBaseUrl configuration

* Update Pypi services to include pypiBaseUrl parameter

* change package name example to a more well-known package

* Update custom-environment-variables.yml

* Update Pypi services to include pypiBaseUrl parameter

* fix openapi mismatch

* Update doc/server-secrets.md

---------

Co-authored-by: chris48s <chris48s@users.noreply.github.com>
2024-04-21 16:33:42 +00:00

67 lines
1.7 KiB
JavaScript

import semver from 'semver'
import PypiBase, { pypiGeneralParams } from './pypi-base.js'
import { parseClassifiers } from './pypi-helpers.js'
export default class PypiPythonVersions extends PypiBase {
static category = 'platform-support'
static route = this.buildRoute('pypi/pyversions')
static openApi = {
'/pypi/pyversions/{packageName}': {
get: {
summary: 'PyPI - Python Version',
parameters: pypiGeneralParams,
},
},
}
static defaultBadgeData = { label: 'python' }
static render({ versions }) {
const versionSet = new Set(versions)
// We only show v2 if eg. v2.4 does not appear.
// See https://github.com/badges/shields/pull/489 for more.
;['2', '3'].forEach(majorVersion => {
if (Array.from(versions).some(v => v.startsWith(`${majorVersion}.`))) {
versionSet.delete(majorVersion)
}
})
if (versionSet.size) {
return {
message: Array.from(versionSet)
.sort((v1, v2) =>
semver.compare(semver.coerce(v1), semver.coerce(v2)),
)
.join(' | '),
color: 'blue',
}
} else {
return {
message: 'missing',
color: 'red',
}
}
}
async handle({ egg }, { pypiBaseUrl }) {
const packageData = await this.fetch({ egg, pypiBaseUrl })
const versions = parseClassifiers(
packageData,
/^Programming Language :: Python :: ([\d.]+)$/,
)
// If no versions are found yet, check "X :: Only" as a fallback.
if (versions.length === 0) {
versions.push(
...parseClassifiers(
packageData,
/^Programming Language :: Python :: (\d+) :: Only$/,
),
)
}
return this.constructor.render({ versions })
}
}