Inedo Community Forums Forums
    • Recent
    • Tags
    • Popular
    • Login

    Welcome to the Inedo Forums! Check out the Forums Guide for help getting started.

    If you are experiencing any issues with the forum software, please visit the Contact Form on our website and let us know!

    PEP 700 conformance for PyPI feeds

    Scheduled Pinned Locked Moved Support
    13 Posts 6 Posters 101 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • dean-houstonD Offline
      dean-houston inedo-engineer @0xFFFFFFFF
      last edited by

      Hi @0xFFFFFFFF,

      Thanks for the detailed write-up and explanation.

      It looks trivial to add size and upload-time. Adding versions is probably simple, assuming it's just an array of distinct version numbers (we already have all the "packages" in context).

      It's probably fine, but just to be safe we will do this in ProGet 2026, given some of the subtle behavioral changes you mentioned ("tools like uv to make use of heuristics to speed up downloads"). For someone with an overloaded server, that might "put it over the edge".

      ProGet 2026 may be ready by the end of the month, so it's not so far away.

      -- Dean

      1 Reply Last reply Reply Quote 1
      • 0 Offline
        0xFFFFFFFF
        last edited by

        Hi Dean,

        Thank you very much for the reply!

        This landing in ProGet 2026 would be awesome! But of course I understand you want to be certain that those changes would not cause issues for the users, so I think having to wait a little more would be no problem for me.

        1 Reply Last reply Reply Quote 0
        • A Offline
          Ashley
          last edited by Ashley

          Hi @dean-houston,

          Can I confirm that this was fixed in the ProGet 2026 26.0.0 release last week?
          PG-3272 ⭐ Major Release ProGet 2026 ⭐

          We are experiencing issues with UV attempting to resolve packages that are too new when configured with the "exclude-newer" property, presumably because it's looking for the upload-time and not published in the response.

          For info, we are currently seeing non-PEP 700 compliance on version 2025.27

          Thanks,
          Ashley

          stevedennisS 1 Reply Last reply Reply Quote 0
          • stevedennisS Offline
            stevedennis inedo-engineer @Ashley
            last edited by

            Hi @Ashley ,

            It should have been; I just double-checked and see a commit for "Add full PEP 700 conformance for PyPI feeds" that appears to add the fields discussed here and some more.

            Thanks,
            Steve

            1 Reply Last reply Reply Quote 0
            • A Offline
              Ashley
              last edited by

              This post is deleted!
              1 Reply Last reply Reply Quote 0
              • A Offline
                Ashley
                last edited by Ashley

                Hi @stevedennis

                I upgraded our dev server to 2026.1 and we are still having issues with the upload-time property. It appears that ProGet will only add the upload-time property when the package has been pulled to ProGet, i.e. not present for remotes.

                2026.1 (Build 14):
                Request:

                $rawBytes = (Invoke-WebRequest http://proget-server/pypi/pypi-public/simple/ty -Headers @{ "Accept" = "application/vnd.pypi.simple.v1+json" }).content
                [System.Text.Encoding]::UTF8.GetString($rawBytes) | Out-File "c:\test.json"
                

                Response:

                {
                  "meta": { "api-version": "1.1" },
                  "name": "ty",
                  "versions": [
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.22",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                    "0.0.23",
                  ... //Excluded for brevity
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39",
                    "0.0.39"
                  ],
                  "files": [
                    {
                      "filename": "ty-0.0.22.tar.gz",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.22/ty-0.0.22.tar.gz",
                      "requires-python": ">=3.8",
                      "size": 5333861,
                      "upload-time": "2026-05-25T08:36:56.833Z",
                      "hashes": {
                        "md5": "4771ed89add13f88713a6db3875afc5c",
                        "sha1": "1ea16ea77d71ced631d577066855c9ca2bc8d498",
                        "sha256": "391fc4d3a543950341b750d7f4aa94866a73e7cdbf3e9e4e4e8cfc8b7bef4f10",
                        "sha512": "4e1b256aae7d7ae6f5349cd865e03d13c00f6e64183a8c06e6d22438aef6f771aa84da80bd27c280cb3b378c6887c77e559b25ea6366823dfd2629808af1364c"
                      }
                    },
                    {
                      "filename": "ty-0.0.22-py3-none-linux_armv6l.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.22/ty-0.0.22-py3-none-linux_armv6l.whl",
                      "requires-python": ">=3.8",
                      "size": 10328232,
                      "upload-time": "2026-05-25T08:36:26.603Z",
                      "core-metadata": {
                        "sha256": "91b9b58596f18ff672976d7f04dcab28e9b5ada579303470779c7e2a3be0d131"
                      },
                      "hashes": {
                        "md5": "bcfc8be7ece186f373fa0f1c43d4ba31",
                        "sha1": "04bb25267d898b6cb4b2586e14639f85820b2fe9",
                        "sha256": "03d37220d81016cb9d2a9c9ec11704d84f2df838f1dbf1296d91ea7fba57f8b5",
                        "sha512": "b79e054a90040dc6624f5556dd7444f50a3ad3ffd2d7b64f758a5a69b376e92dc246428599df78d9995c86207bb697eddbf2386898a1f61c50cbee8e71384de8"
                      }
                    },
                ... //Excluded for brevity
                    {
                      "filename": "ty-0.0.23.tar.gz",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.23/ty-0.0.23.tar.gz",
                      "requires-python": ">=3.8",
                      "size": 5341461,
                      "upload-time": "2026-03-13T12:34:23Z",
                      "hashes": {
                        "md5": "c220bcee84ca26a01a2479388d4ad7af",
                        "sha1": "75dd14d7fcbd3f56313886a1b46c23481930bc76",
                        "sha256": "5fb05db58f202af366f80ef70f806e48f5237807fe424ec787c9f289e3f3a4ef",
                        "sha512": "1dcd3d9a55d0734db1b1335f89db36b3b70d0c77112ad667dc24d556c5e122b6d8b0fced5fc19b99a292bbd98ab0ec0a92aebfe50047e37d627ad3442b2b2ef1"
                      }
                    },
                    {
                      "filename": "ty-0.0.23-py3-none-linux_armv6l.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.23/ty-0.0.23-py3-none-linux_armv6l.whl",
                      "requires-python": ">=3.8",
                      "size": 10329096,
                      "upload-time": "2026-03-13T12:34:09Z",
                      "core-metadata": {
                        "sha256": "6367da298c587b4db7c8709f079114d1dbbc9f748735deefb4179e295b7a1bb2"
                      },
                      "hashes": {
                        "md5": "62bc86fe02c8109ab3a619b2b5196fa2",
                        "sha1": "dedbdef7ad32e50890f667cd2e8ae2a64ef28625",
                        "sha256": "e810eef1a5f1cfc0731a58af8d2f334906a96835829767aed00026f1334a8dd7",
                        "sha512": "b615aaa871792d14c9ad725ed54c9749976da032eaf19e278787094308ab9ca7438c4d3e4ae46132b783d43a8e6fcf4643b0b9b9cf4450e181edb126e13493ec"
                      }
                    },
                ... //Excluded for brevity
                    {
                      "filename": "ty-0.0.39-py3-none-linux_armv6l.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-linux_armv6l.whl",
                      "requires-python": ">=3.8",
                      "size": 11360431,
                      "hashes": {
                        "sha256": "c1bb7ac70f1f7d70cc6655fd96558039e4562b10f489fa49c7ebfd5fcee73ad1"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-macosx_10_12_x86_64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-macosx_10_12_x86_64.whl",
                      "requires-python": ">=3.8",
                      "size": 11096281,
                      "hashes": {
                        "sha256": "3435b64c1e59c14c9aa39c20cc018823937cd38d55db853e74d95b8f420569b0"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-macosx_11_0_arm64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-macosx_11_0_arm64.whl",
                      "requires-python": ">=3.8",
                      "size": 10529674,
                      "hashes": {
                        "sha256": "5f136377ce46c73677701a9e1ad730bf72f699bcec046e422eb79d0886cac3ab"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
                      "requires-python": ">=3.8",
                      "size": 11055561,
                      "hashes": {
                        "sha256": "36b65fb0cc17f03e851d40e210d420be94ab8bc52d041328ad1e45f616036a61"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
                      "requires-python": ">=3.8",
                      "size": 11127185,
                      "hashes": {
                        "sha256": "4967967bfadf3860ff84c3fccdbaec8edf8aa20d0d727521084733d853de6657"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
                      "requires-python": ">=3.8",
                      "size": 11608459,
                      "hashes": {
                        "sha256": "9e10ecb1297099ddf9a1f054f8bd921d1863ce85fb819a3c96ed27865a1ba6ed"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
                      "requires-python": ">=3.8",
                      "size": 12177101,
                      "hashes": {
                        "sha256": "9b19cca70e465d71b0510656343883d62372bbe74b7845cae7c0e701d6d5264b"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl",
                      "requires-python": ">=3.8",
                      "size": 11827815,
                      "hashes": {
                        "sha256": "56c6704b01b9b3d80ff26b2918423b742516d1e469bef830e9254dcedc9185bf"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
                      "requires-python": ">=3.8",
                      "size": 11694429,
                      "hashes": {
                        "sha256": "40b7840ff46764b6a6757f4ade1cd0530fc3e8a0b435ca93e7602360e4cb90b6"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-manylinux_2_31_riscv64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-manylinux_2_31_riscv64.whl",
                      "requires-python": ">=3.8",
                      "size": 11869846,
                      "hashes": {
                        "sha256": "1c62a3a87ce26b50819f0dbf03bd95f23f19eeb87bbc7aa732ec64277c77f1aa"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-musllinux_1_2_aarch64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-musllinux_1_2_aarch64.whl",
                      "requires-python": ">=3.8",
                      "size": 11029763,
                      "hashes": {
                        "sha256": "f8c34bc81a9c3516e49904e9d8330aac385377cca98390193ea02b903a40fcf0"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-musllinux_1_2_armv7l.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-musllinux_1_2_armv7l.whl",
                      "requires-python": ">=3.8",
                      "size": 11146761,
                      "hashes": {
                        "sha256": "66f5ab11586a64e79cb692ad685ee5469325c31b5f30bd3554f52f36dbe28cc4"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-musllinux_1_2_i686.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-musllinux_1_2_i686.whl",
                      "requires-python": ">=3.8",
                      "size": 11281843,
                      "hashes": {
                        "sha256": "e8d89732bcbbcb091f439e556dfc4932f198b118b47d5b85212c60662099670e"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-musllinux_1_2_x86_64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-musllinux_1_2_x86_64.whl",
                      "requires-python": ">=3.8",
                      "size": 11792477,
                      "hashes": {
                        "sha256": "eceb6c91dcd05a231119f82abdd9aa337513de23ca6ac990bc44f88791dc1799"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-win32.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-win32.whl",
                      "requires-python": ">=3.8",
                      "size": 10615377,
                      "hashes": {
                        "sha256": "891c3262314dbc80bf3e872634d23dd216306945daa9a9fcc206ce5ed21ac4c9"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-win_amd64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-win_amd64.whl",
                      "requires-python": ">=3.8",
                      "size": 11710711,
                      "hashes": {
                        "sha256": "ba7f2d54452535419e90f6f03ff39282999e87b43c21c00559f6d7ad711a36d5"
                      }
                    },
                    {
                      "filename": "ty-0.0.39-py3-none-win_arm64.whl",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39-py3-none-win_arm64.whl",
                      "requires-python": ">=3.8",
                      "size": 11081409,
                      "hashes": {
                        "sha256": "eb4cf0fefbbfedf9a352597bb2431ebdcb7eb3a595c0f825f228e897a0ec285d"
                      }
                    },
                    {
                      "filename": "ty-0.0.39.tar.gz",
                      "url": "http://proget-server/pypi/pypi-public/download/ty/0.0.39/ty-0.0.39.tar.gz",
                      "requires-python": ">=3.8",
                      "size": 5702365,
                      "hashes": {
                        "sha256": "f750277e76a01ecd86185960eca73823c26a53c51103568d56d4d904575159fd"
                      }
                    }
                  ]
                }
                
                

                Note: Only versions 0.0.22 and 0.0.23 have the upload-time property, this is because I manually pulled these version to ProGet.

                upload-time should always be present prior to pulls so that client package managers like uv with exclude-newer = "7 days" can avoid pulling new packages that will be blocked by ProGet due to non-compliance rules.

                atrippA 1 Reply Last reply Reply Quote 0
                • atrippA Offline
                  atripp inedo-engineer @Ashley
                  last edited by

                  Hi @Ashley ,

                  Looking over the code that makes sense; the warehouse API is not used for the /simple/ty request, only the /simple/ty/0.0.0 type of request.

                  We'll get this addressed via PG-3288 in the upcoming maintenance release

                  Cheers,
                  Alana

                  1 Reply Last reply Reply Quote 0
                  • A Offline
                    Ashley
                    last edited by

                    Hi Alana,

                    Thanks for investigating! Is the maintenance release this Friday or the week after?

                    1 Reply Last reply Reply Quote 0
                    • atrippA Offline
                      atripp inedo-engineer
                      last edited by

                      Hi @Ashley ,

                      We're planning this Friday... though it may not make it. Hopefully!

                      It's a bit more involved, since it involves calling the separate API instead of the simple API.

                      Cheers,
                      Alana

                      1 Reply Last reply Reply Quote 0
                      • gdivisG Offline
                        gdivis inedo-engineer
                        last edited by

                        Hi @Ashley,

                        It turns out that we just weren't reading upload-time from the upstream json when using the simple API, so this was pretty trivial to fix and we'll certainly be able to include it in tomorrow's release. Here's the abbreviated result of a quick local test I did after making the fix (also after fixing the issue with the duplicated versions):

                        {
                          "meta": {
                            "api-version": "1.1"
                          },
                          "name": "psycopg",
                          "versions": [
                            "3.0b1",
                            "3.0",
                            "3.0.1",
                            "3.0.2",
                            "3.0.3",
                            "3.0.4",
                            "3.0.5",
                            "3.0.6",
                            "3.0.7",
                            "3.0.8",
                            "3.0.9",
                            "3.0.10",
                            "3.0.11",
                            "3.0.12",
                            "3.0.13",
                            "3.0.14",
                            "3.0.15",
                            "3.0.16",
                            "3.0.17",
                            "3.0.18",
                            "3.1",
                            "3.1.1",
                            "3.1.2",
                            "3.1.3",
                            "3.1.4",
                            "3.1.5",
                            "3.1.6",
                            "3.1.7",
                            "3.1.8",
                            "3.1.9",
                            "3.1.10",
                            "3.1.11",
                            "3.1.12",
                            "3.1.13",
                            "3.1.14",
                            "3.1.15",
                            "3.1.16",
                            "3.1.17",
                            "3.1.18",
                            "3.1.19",
                            "3.1.20",
                            "3.2.0",
                            "3.2.1",
                            "3.2.2",
                            "3.2.3",
                            "3.2.4",
                            "3.2.5",
                            "3.2.6",
                            "3.2.7",
                            "3.2.8",
                            "3.2.9",
                            "3.2.10",
                            "3.2.11",
                            "3.2.12",
                            "3.2.13",
                            "3.3.0",
                            "3.3.1",
                            "3.3.2",
                            "3.3.3",
                            "3.3.4"
                          ],
                          "files": [
                            {
                              "filename": "psycopg-3.0b1-py3-none-any.whl",
                              "url": "http://localhost:5000/pypi/snake/download/psycopg/3.0b1/psycopg-3.0b1-py3-none-any.whl",
                              "requires-python": ">=3.6",
                              "size": 131830,
                              "upload-time": "2021-09-03T21:34:46.638478Z",
                              "hashes": {
                                "sha256": "fd510caaaa90aec11781c0581a8a03f847e35925db6de293404db87d625a44e8"
                              }
                            },
                            {
                              "filename": "psycopg-3.0b1.tar.gz",
                              "url": "http://localhost:5000/pypi/snake/download/psycopg/3.0b1/psycopg-3.0b1.tar.gz",
                              "requires-python": ">=3.6",
                              "size": 108312,
                              "upload-time": "2021-08-30T04:25:06.027667Z",
                              "hashes": {
                                "sha256": "90188a415f2132eabccfa58ae41330d3bfc1c5c410add4d6194e783521478189"
                              }
                            },
                            {
                              "filename": "psycopg-3.0-py3-none-any.whl",
                              "url": "http://localhost:5000/pypi/snake/download/psycopg/3.0/psycopg-3.0-py3-none-any.whl",
                              "requires-python": ">=3.6",
                              "size": 140812,
                              "upload-time": "2021-10-12T16:20:12.084578Z",
                              "hashes": {
                                "sha256": "65b9fb8838dae61040ad3e0cfc184d4ffd17f740ef4c0353d76050a6eb061a9c"
                              }
                            }
                            //...SNIP
                          ]
                        }
                        
                        1 Reply Last reply Reply Quote 0
                        • A Offline
                          Ashley
                          last edited by

                          Hi,

                          We just upgraded to 2026.2 and it looks good, thanks for getting the update out so quick!

                          1 Reply Last reply Reply Quote 1
                          • atrippA Offline
                            atripp inedo-engineer
                            last edited by

                            @Ashley thanks for letting us know!

                            1 Reply Last reply Reply Quote 0

                            Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                            Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                            With your input, this post could be even better 💗

                            Register Login
                            • 1 / 1
                            • First post
                              Last post
                            Inedo Website Home • Support Home • Code of Conduct • Forums Guide • Documentation