import { InvalidResponse, pathParams } from '../index.js' import PypiBase, { pypiBaseUrlParam } from './pypi-base.js' import { sortPypiVersions, parseClassifiers } from './pypi-helpers.js' const frameworkNameMap = { 'aws-cdk': { name: 'AWS CDK', classifier: 'AWS CDK', }, django: { name: 'Django', classifier: 'Django', }, 'django-cms': { name: 'Django CMS', classifier: 'Django CMS', }, jupyterlab: { name: 'JupyterLab', classifier: 'Jupyter :: JupyterLab', }, odoo: { name: 'Odoo', classifier: 'Odoo', }, plone: { name: 'Plone', classifier: 'Plone', }, wagtail: { name: 'Wagtail', classifier: 'Wagtail', }, zope: { name: 'Zope', classifier: 'Zope', }, } const description = ` This service currently support the following Frameworks:
${Object.values(frameworkNameMap).map(obj => ` ${obj.name}`)} ` export default class PypiFrameworkVersion extends PypiBase { static category = 'platform-support' static route = { base: 'pypi/frameworkversions', pattern: `:frameworkName(${Object.keys(frameworkNameMap).join( '|', )})/:packageName+`, } static openApi = { '/pypi/frameworkversions/{frameworkName}/{packageName}': { get: { summary: 'PyPI - Versions from Framework Classifiers', description, parameters: pathParams( { name: 'frameworkName', example: 'plone', schema: { type: 'string', enum: Object.keys(frameworkNameMap) }, }, { name: 'packageName', example: 'plone.volto' }, ).concat(pypiBaseUrlParam), }, }, } static defaultBadgeData = { label: 'versions' } static render({ name, versions }) { name = name ? name.toLowerCase() : '' const label = `${name} versions` return { label, message: sortPypiVersions(versions).join(' | '), color: 'blue', } } async handle({ frameworkName, packageName }, { pypiBaseUrl }) { const classifier = frameworkNameMap[frameworkName] ? frameworkNameMap[frameworkName].classifier : frameworkName const name = frameworkNameMap[frameworkName] ? frameworkNameMap[frameworkName].name : frameworkName const regex = new RegExp(`^Framework :: ${classifier} :: ([\\d.]+)$`) const packageData = await this.fetch({ egg: packageName, pypiBaseUrl }) const versions = parseClassifiers(packageData, regex) if (versions.length === 0) { throw new InvalidResponse({ prettyMessage: `${name} versions are missing for ${packageName}`, }) } return this.constructor.render({ name, versions }) } }