Skip to content

Commit

Permalink
Add [PythonVersionFromToml] shield (#9516)
Browse files Browse the repository at this point in the history
* Add PythonVersionFromToml

Added new shield per issue #9410
The shield display required python versions for packages based on pyproject.toml

* Add tests for PythonVersionFromToml

* Improve docs for tests regex

* Improve title and description

Rename and updated description to bring into focus that only PEP 621 complaint pyproject.toml files are supported.

Solves review #9516 (comment)

* replace complex regex with @renovate/pep440

solves review #9516 (comment)
  • Loading branch information
jNullj authored Sep 10, 2023
1 parent 015b5b0 commit e8b4467
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 0 deletions.
65 changes: 65 additions & 0 deletions services/python/python-version-from-toml.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import Joi from 'joi'
import BaseTomlService from '../../core/base-service/base-toml.js'
import { optionalUrl } from '../validators.js'

const queryParamSchema = Joi.object({
tomlFilePath: optionalUrl.required(),
}).required()

const schema = Joi.object({
project: Joi.object({
'requires-python': Joi.string().required(),
}).required(),
}).required()

const documentation = `Shows the required python version for a package based on the values in the requires-python field in PEP 621 compliant pyproject.toml \n
a URL of the toml is required, please note that when linking to files in github or similar sites, provide URL to raw file, for example:
Use https://raw.githubusercontent.com/numpy/numpy/main/pyproject.toml \n
And not https://github.com/numpy/numpy/blob/main/pyproject.toml
`

class PythonVersionFromToml extends BaseTomlService {
static category = 'platform-support'

static route = {
base: '',
pattern: 'python/required-version-toml',
queryParamSchema,
}

static examples = [
{
title: 'Python Version from PEP 621 TOML',
namedParams: {},
queryParams: {
tomlFilePath:
'https://raw.githubusercontent.com/numpy/numpy/main/pyproject.toml',
},
staticPreview: this.render({ requiresPythonString: '>=3.9' }),
documentation,
},
]

static defaultBadgeData = { label: 'python' }

static render({ requiresPythonString }) {
// we only show requries-python as is
// for more info read the following issues:
// https://github.com/badges/shields/issues/9410
// https://github.com/badges/shields/issues/5551
return {
message: requiresPythonString,
color: 'blue',
}
}

async handle(namedParams, { tomlFilePath }) {
const tomlData = await this._requestToml({ url: tomlFilePath, schema })
const requiresPythonString = tomlData.project['requires-python']

return this.constructor.render({ requiresPythonString })
}
}

export { PythonVersionFromToml }
27 changes: 27 additions & 0 deletions services/python/python-version-from-toml.tester.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import Joi from 'joi'
import pep440 from '@renovate/pep440'
import { createServiceTester } from '../tester.js'
export const t = await createServiceTester()

const validatePep440 = (value, helpers) => {
if (!pep440.validRange(value)) {
return helpers.error('any.invalid')
}
return value
}

const isCommaSeparatedPythonVersions = Joi.string().custom(validatePep440)

t.create('python versions (valid)')
.get(
'/python/required-version-toml.json?tomlFilePath=https://raw.githubusercontent.com/numpy/numpy/main/pyproject.toml',
)
.expectBadge({ label: 'python', message: isCommaSeparatedPythonVersions })

t.create(
'python versions - valid toml with missing python-requires field (invalid)',
)
.get(
'/python/required-version-toml.json?tomlFilePath=https://raw.githubusercontent.com/django/django/main/pyproject.toml',
)
.expectBadge({ label: 'python', message: 'invalid response data' })

0 comments on commit e8b4467

Please sign in to comment.