'use strict' const semver = require('semver') const PypiBase = require('./pypi-base') const { parseClassifiers } = require('./pypi-helpers') module.exports = class PypiPythonVersions extends PypiBase { static category = 'platform-support' static route = this.buildRoute('pypi/pyversions') static examples = [ { title: 'PyPI - Python Version', pattern: ':packageName', namedParams: { packageName: 'Django' }, staticPreview: this.render({ versions: ['3.5', '3.6', '3.7'] }), }, ] 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 }) { const packageData = await this.fetch({ egg }) 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 }) } }