mirror of
https://github.com/renovatebot/renovate.git
synced 2026-11-01 10:09:50 +00:00
2606ae2bd3
* feat(pypi): add support for JSON-based Simple API (PEP 691)
* Fix some stuff
* Clean some things up
* Fix coverage
* Simplify JSON parse
* Remove useless tests
* Align terminology
* Incorporate some changes from PR #44182
Co-authored-by: Andreas Hippler <andreas.hippler@goto.com>
* Use isNonEmptyString to filter requires_python
* Address review feedback
* Warn once actually
* fixup! review comments
Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>
* fixup! fixup! review comments
Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
* fixup! review comments
As the list of status codes we retry on was based on an unverified
claim that Artifactory, Nexus and devpi answer a rejected `Accept`
header with `400`/`403`/`415`, we should only retry on `406`, which is
what RFC 9110 specifies for a request whose `Accept` cannot be
satisfied.
Our `Accept` header ends with `text/html; q=0.01`, so any conforming
registry can satisfy it, `415` refers to the request body's
`Content-Type` rather than `Accept`, and retrying on `403` doubles the
requests for a registry we're not authenticated against.
The unwrapping of `ExternalHostError` is unaffected, as that's needed
for the `abortOnError` case regardless of which status codes we retry.
Co-Authored-By: Claude Opus 5 <claude-code@jamietanna.co.uk>
* fixup! review comments
As the note about `upload-time` sat in the paragraph about the Simple
API, it read as if `minimumReleaseAge` needs a registry which supports
the JSON-based Simple API (PEP 691).
That's only true of the Simple API. The JSON API has always exposed
`upload_time`, and as the default registry of `https://pypi.org/pypi/`
doesn't end in `/simple/`, that's the lookup most users get, so
`minimumReleaseAge` already works for them.
We can split the two apart, so that the guarantee for each API is
stated separately.
Co-Authored-By: Claude Opus 5 <claude-code@jamietanna.co.uk>
* reword
* fixup! review comments
As the JSON-based Simple API's release timestamps were only covered by
hand-written responses, we didn't have the equivalent of the real world
coverage added for the JSON API in
e942788539.
We can add a `numpy` fixture from PyPI's JSON-based Simple API, trimmed
to 1.5.0 and 1.5.1, so we assert against a response a registry has
actually served. 1.5.1 is the interesting case, as it was released in
2010 but gained a wheel in 2014 which PyPI lists first.
This also covers the `upload-time` format the Simple API uses, of
`2010-11-18T14:16:58.801332Z`, rather than the JSON API's
`2010-11-18T14:16:58`, so that we know `asTimestamp` normalises both.
Unlike the JSON API, there's no previous behaviour to characterise
first, as before these changes the Simple API exposed no timestamps at
all.
Co-Authored-By: Claude Opus 5 <claude-code@jamietanna.co.uk>
* fixup! fixup! review comments
* fixups
* fixups
Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
* fixup! comments
Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>
---------
Co-authored-by: Andreas Hippler <andreas.hippler@goto.com>
Co-authored-by: Jamie Tanna <jamie.tanna@mend.io>
Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>
Co-authored-by: Claude Opus 5 <claude-code@jamietanna.co.uk>
130 lines
4.7 KiB
JSON
130 lines
4.7 KiB
JSON
{
|
|
"files": [
|
|
{
|
|
"core-metadata": false,
|
|
"data-dist-info-metadata": false,
|
|
"filename": "numpy-1.5.0.tar.gz",
|
|
"hashes": {
|
|
"sha256": "06d2181c884c5937c7c475103dd55de4fe4842a9d91bab1ed0965dd973a4661a"
|
|
},
|
|
"provenance": null,
|
|
"requires-python": null,
|
|
"size": 2276377,
|
|
"upload-time": "2010-09-15T14:44:53.723687Z",
|
|
"url": "https://files.pythonhosted.org/packages/f4/7e/ee0605be5f922a85f798bf8ff1849d4d043b08229b026e55527110384c6d/numpy-1.5.0.tar.gz",
|
|
"yanked": false
|
|
},
|
|
{
|
|
"core-metadata": false,
|
|
"data-dist-info-metadata": false,
|
|
"filename": "numpy-1.5.0.win32-py2.6.exe",
|
|
"hashes": {
|
|
"sha256": "ba4d6b5d59e0646b6b82098db087ee2f9aedeca968354492f125ebb62f091f69"
|
|
},
|
|
"provenance": null,
|
|
"requires-python": null,
|
|
"size": 2338968,
|
|
"upload-time": "2010-08-31T18:15:09.478131Z",
|
|
"url": "https://files.pythonhosted.org/packages/bd/bd/20b14b780f26876796fa7d33ac4e7d59adcd462c8c08006f5aeb11e67a10/numpy-1.5.0.win32-py2.6.exe",
|
|
"yanked": false
|
|
},
|
|
{
|
|
"core-metadata": {
|
|
"sha256": "e3e359893ffc9080f1fd2b8f140cefea87e033744504e87f926a637216783fbd"
|
|
},
|
|
"data-dist-info-metadata": {
|
|
"sha256": "e3e359893ffc9080f1fd2b8f140cefea87e033744504e87f926a637216783fbd"
|
|
},
|
|
"filename": "numpy-1.5.1-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.whl",
|
|
"hashes": {
|
|
"sha256": "2d19469a94eadd002b1596cb0ec22e4f27f4f96dd6c83391220d0e187041bd36"
|
|
},
|
|
"provenance": null,
|
|
"requires-python": null,
|
|
"size": 10720015,
|
|
"upload-time": "2014-07-30T22:27:08.796621Z",
|
|
"url": "https://files.pythonhosted.org/packages/ad/d6/0cee332656a0633ff062c13408734dc3c617d5d45d174c491033063668eb/numpy-1.5.1-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.whl",
|
|
"yanked": false
|
|
},
|
|
{
|
|
"core-metadata": false,
|
|
"data-dist-info-metadata": false,
|
|
"filename": "numpy-1.5.1.tar.gz",
|
|
"hashes": {
|
|
"sha256": "c36789ec381fec09f519249744ea36a77e5534b69446a59ee73b06cac29542eb"
|
|
},
|
|
"provenance": null,
|
|
"requires-python": null,
|
|
"size": 2280220,
|
|
"upload-time": "2010-11-18T14:16:58.801332Z",
|
|
"url": "https://files.pythonhosted.org/packages/73/e1/88932bb0420a0fbe1547ee96d4e7332de5c1ed5a846a6c96ea422c6bf753/numpy-1.5.1.tar.gz",
|
|
"yanked": false
|
|
},
|
|
{
|
|
"core-metadata": false,
|
|
"data-dist-info-metadata": false,
|
|
"filename": "numpy-1.5.1.win32-py2.5-nosse.exe",
|
|
"hashes": {
|
|
"sha256": "e45623a65625a22e8c59d5feacc02bdc360eed4ab9f01f3dc619dc58c56336ad"
|
|
},
|
|
"provenance": null,
|
|
"requires-python": null,
|
|
"size": 2881052,
|
|
"upload-time": "2011-01-28T15:33:59.749000Z",
|
|
"url": "https://files.pythonhosted.org/packages/8b/8e/e20ca84e30db2d93d85370ba23efbe54037bb45348dd6496185e7bbb15fa/numpy-1.5.1.win32-py2.5-nosse.exe",
|
|
"yanked": false
|
|
},
|
|
{
|
|
"core-metadata": false,
|
|
"data-dist-info-metadata": false,
|
|
"filename": "numpy-1.5.1.win32-py2.6-nosse.exe",
|
|
"hashes": {
|
|
"sha256": "bea35acebd89855529f52e418f2b5d5976b50982651a7e1b97d4d6b68ba83130"
|
|
},
|
|
"provenance": null,
|
|
"requires-python": null,
|
|
"size": 2342045,
|
|
"upload-time": "2011-01-28T15:31:25.757819Z",
|
|
"url": "https://files.pythonhosted.org/packages/d2/fe/2d765a8f923db9a2254f398af2cafdd777b39611e90ac28d5fc3b8fd9cfa/numpy-1.5.1.win32-py2.6-nosse.exe",
|
|
"yanked": false
|
|
},
|
|
{
|
|
"core-metadata": false,
|
|
"data-dist-info-metadata": false,
|
|
"filename": "numpy-1.5.1.win32-py2.7-nosse.exe",
|
|
"hashes": {
|
|
"sha256": "37d8363be1e76b855ef27eb140caccd00e250244a6a3536dce9cd06a1e56ddbb"
|
|
},
|
|
"provenance": null,
|
|
"requires-python": null,
|
|
"size": 2341138,
|
|
"upload-time": "2011-01-28T15:25:56.453527Z",
|
|
"url": "https://files.pythonhosted.org/packages/eb/a9/af5807aeefbc05d574e103212cfc71423ac255ad326de651ed01ddf7f995/numpy-1.5.1.win32-py2.7-nosse.exe",
|
|
"yanked": false
|
|
},
|
|
{
|
|
"core-metadata": false,
|
|
"data-dist-info-metadata": false,
|
|
"filename": "numpy-1.5.1.win32-py3.1-nosse.exe",
|
|
"hashes": {
|
|
"sha256": "8821b7d0c926858e81d11b13336edd6e0d4569d0179c9568ae08011658912823"
|
|
},
|
|
"provenance": null,
|
|
"requires-python": null,
|
|
"size": 2496332,
|
|
"upload-time": "2011-01-28T15:32:39.341520Z",
|
|
"url": "https://files.pythonhosted.org/packages/3f/c9/2aa4f6426c7b8e4a227834ecb10da666c35791510bc1ae11bf6e87398c18/numpy-1.5.1.win32-py3.1-nosse.exe",
|
|
"yanked": false
|
|
}
|
|
],
|
|
"meta": {
|
|
"_last-serial": 39847699,
|
|
"api-version": "1.4"
|
|
},
|
|
"name": "numpy",
|
|
"versions": [
|
|
"1.5.0",
|
|
"1.5.1"
|
|
]
|
|
}
|