Files
Jamie Tanna e942788539 fix(datasource/pypi): use the earliest upload_time of a version (#45313)
* test(datasource/pypi): cover which `upload_time` a version reports

As part of future changes to how we calculate the `releaseTimestamp`, it
was clear we don't have as much coverage of this logic.

To make this more explicit, we can add new test coverage.

Additionally, we can introduce a new example from a package to guide
this.

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>

* fix(datasource/pypi): use the earliest `upload_time` of a version

When calculating the `releaseTimestamp` for the PyPI datasource, we've
been looking at the first entry in the response, which isn't always
the first time this package existed.

In the case that a Wheel is uploaded after the package first was
released - for instance, to support a new version of Python, at an
existing pinned version of the package - this would lead to a
potentially incorrect calculation for the `releaseTimestamp`.

This can lead to Renovate seeing a package as newer than it is, which
can mean that i.e. `minimumReleaseAge` can show as pending for a package
that shouldn't be.

As part of upstream changes[0], this should be less frequent in the
ecosystem, but existing packages still exist with this behaviour.

To fix this, we can make sure that we filter a given Release's
to find the earliest `upload_time`.

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>

[0]: https://blog.pypi.org/posts/2026-07-22-releases-now-reject-new-files-after-14-days/

---------

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
2026-08-17 11:01:26 +00:00

199 lines
8.2 KiB
JSON

{
"info": {
"name": "numpy",
"home_page": null,
"project_urls": {
"documentation": "https://numpy.org/doc/",
"download": "https://pypi.org/project/numpy/#files",
"homepage": "https://numpy.org",
"release notes": "https://numpy.org/doc/stable/release",
"source": "https://github.com/numpy/numpy",
"tracker": "https://github.com/numpy/numpy/issues"
}
},
"releases": {
"1.5.0": [
{
"comment_text": "",
"core-metadata": false,
"digests": {
"blake2b_256": "f47eee0605be5f922a85f798bf8ff1849d4d043b08229b026e55527110384c6d",
"md5": "3a8bfdc434df782d647161c48943ee09",
"sha256": "06d2181c884c5937c7c475103dd55de4fe4842a9d91bab1ed0965dd973a4661a"
},
"downloads": -1,
"filename": "numpy-1.5.0.tar.gz",
"has_sig": false,
"md5_digest": "3a8bfdc434df782d647161c48943ee09",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 2276377,
"upload_time": "2010-09-15T14:44:53",
"upload_time_iso_8601": "2010-09-15T14:44:53.723687Z",
"url": "https://files.pythonhosted.org/packages/f4/7e/ee0605be5f922a85f798bf8ff1849d4d043b08229b026e55527110384c6d/numpy-1.5.0.tar.gz",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"core-metadata": false,
"digests": {
"blake2b_256": "bdbd20b14b780f26876796fa7d33ac4e7d59adcd462c8c08006f5aeb11e67a10",
"md5": "95fd147bb761ca8e2baf34a153586358",
"sha256": "ba4d6b5d59e0646b6b82098db087ee2f9aedeca968354492f125ebb62f091f69"
},
"downloads": -1,
"filename": "numpy-1.5.0.win32-py2.6.exe",
"has_sig": false,
"md5_digest": "95fd147bb761ca8e2baf34a153586358",
"packagetype": "bdist_wininst",
"python_version": "2.6",
"requires_python": null,
"size": 2338968,
"upload_time": "2010-08-31T18:15:09",
"upload_time_iso_8601": "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,
"yanked_reason": null
}
],
"1.5.1": [
{
"comment_text": "",
"core-metadata": {
"sha256": "e3e359893ffc9080f1fd2b8f140cefea87e033744504e87f926a637216783fbd"
},
"digests": {
"blake2b_256": "add60cee332656a0633ff062c13408734dc3c617d5d45d174c491033063668eb",
"md5": "78ccd7fc7bd4667969fa77634e1f2210",
"sha256": "2d19469a94eadd002b1596cb0ec22e4f27f4f96dd6c83391220d0e187041bd36"
},
"downloads": -1,
"filename": "numpy-1.5.1-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "78ccd7fc7bd4667969fa77634e1f2210",
"packagetype": "bdist_wheel",
"python_version": "cp27",
"requires_python": null,
"size": 10720015,
"upload_time": "2014-07-30T22:27:08",
"upload_time_iso_8601": "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,
"yanked_reason": null
},
{
"comment_text": "",
"core-metadata": false,
"digests": {
"blake2b_256": "73e188932bb0420a0fbe1547ee96d4e7332de5c1ed5a846a6c96ea422c6bf753",
"md5": "376ef150df41b5353944ab742145352d",
"sha256": "c36789ec381fec09f519249744ea36a77e5534b69446a59ee73b06cac29542eb"
},
"downloads": -1,
"filename": "numpy-1.5.1.tar.gz",
"has_sig": false,
"md5_digest": "376ef150df41b5353944ab742145352d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 2280220,
"upload_time": "2010-11-18T14:16:58",
"upload_time_iso_8601": "2010-11-18T14:16:58.801332Z",
"url": "https://files.pythonhosted.org/packages/73/e1/88932bb0420a0fbe1547ee96d4e7332de5c1ed5a846a6c96ea422c6bf753/numpy-1.5.1.tar.gz",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "Simple installer, no SSE instructions.",
"core-metadata": false,
"digests": {
"blake2b_256": "8b8ee20ca84e30db2d93d85370ba23efbe54037bb45348dd6496185e7bbb15fa",
"md5": "bfcb66706ebdece6a9680f79f2b643ca",
"sha256": "e45623a65625a22e8c59d5feacc02bdc360eed4ab9f01f3dc619dc58c56336ad"
},
"downloads": -1,
"filename": "numpy-1.5.1.win32-py2.5-nosse.exe",
"has_sig": false,
"md5_digest": "bfcb66706ebdece6a9680f79f2b643ca",
"packagetype": "bdist_wininst",
"python_version": "2.5",
"requires_python": null,
"size": 2881052,
"upload_time": "2011-01-28T15:33:59",
"upload_time_iso_8601": "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,
"yanked_reason": null
},
{
"comment_text": "Simple installer, no SSE instructions.",
"core-metadata": false,
"digests": {
"blake2b_256": "d2fe2d765a8f923db9a2254f398af2cafdd777b39611e90ac28d5fc3b8fd9cfa",
"md5": "267627e760277e5f6a74a83772a4f1d0",
"sha256": "bea35acebd89855529f52e418f2b5d5976b50982651a7e1b97d4d6b68ba83130"
},
"downloads": -1,
"filename": "numpy-1.5.1.win32-py2.6-nosse.exe",
"has_sig": false,
"md5_digest": "267627e760277e5f6a74a83772a4f1d0",
"packagetype": "bdist_wininst",
"python_version": "2.6",
"requires_python": null,
"size": 2342045,
"upload_time": "2011-01-28T15:31:25",
"upload_time_iso_8601": "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,
"yanked_reason": null
},
{
"comment_text": "Simple installer, no SSE instructions.",
"core-metadata": false,
"digests": {
"blake2b_256": "eba9af5807aeefbc05d574e103212cfc71423ac255ad326de651ed01ddf7f995",
"md5": "7d6e48b35570c3d83db4cd0a4346b6c1",
"sha256": "37d8363be1e76b855ef27eb140caccd00e250244a6a3536dce9cd06a1e56ddbb"
},
"downloads": -1,
"filename": "numpy-1.5.1.win32-py2.7-nosse.exe",
"has_sig": false,
"md5_digest": "7d6e48b35570c3d83db4cd0a4346b6c1",
"packagetype": "bdist_wininst",
"python_version": "2.7",
"requires_python": null,
"size": 2341138,
"upload_time": "2011-01-28T15:25:56",
"upload_time_iso_8601": "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,
"yanked_reason": null
},
{
"comment_text": "Simple installer, no SSE instructions.",
"core-metadata": false,
"digests": {
"blake2b_256": "3fc92aa4f6426c7b8e4a227834ecb10da666c35791510bc1ae11bf6e87398c18",
"md5": "13c5ebdd920f2c756602358135fd7196",
"sha256": "8821b7d0c926858e81d11b13336edd6e0d4569d0179c9568ae08011658912823"
},
"downloads": -1,
"filename": "numpy-1.5.1.win32-py3.1-nosse.exe",
"has_sig": false,
"md5_digest": "13c5ebdd920f2c756602358135fd7196",
"packagetype": "bdist_wininst",
"python_version": "3.1",
"requires_python": null,
"size": 2496332,
"upload_time": "2011-01-28T15:32:39",
"upload_time_iso_8601": "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,
"yanked_reason": null
}
]
}
}