<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Malformed upload-time (2-digit fractional seconds) breaks pip ≥ 25.3 on Python 3.10]]></title><description><![CDATA[<p dir="auto">Following on from the recent PEP 700 work in <a href="https://issues.inedo.com/issue/PG-3272" class="inedo-link inedo-link-pg" rel="nofollow">PG-3272</a> / <a href="https://issues.inedo.com/issue/PG-3288" class="inedo-link inedo-link-pg" rel="nofollow">PG-3288</a> — we've hit a related but distinct issue with upload-time on ProGet 2026.1 (build 14).<br />
The field is now present (good), but the fractional seconds are sometimes serialised to 2 digits, e.g. <code>2026-04-15T10:23:45.12Z. PEP 700</code><br />
says the fractional part "may contain up to 6 digits of precision", so this is arguably spec-compliant, but it breaks every Python 3.10 client running pip ≥ 25.3.</p>
<p dir="auto">The reason: pip 25.3+ reads <code>upload-time</code> on every resolve (for the <code>--uploaded-prior-to feature</code>) and parses it with <code>datetime.fromisoformat</code>. The pre-3.11 implementation of <code>fromisoformat</code> only accepts 0, 3, or 6 fractional digits — 2 digits raises <code>ValueError</code>. Python 3.11+ has the rewritten parser that handles arbitrary precision, so it doesn't reproduce there. PyPI itself always emits 6-digit microseconds, which is why this hasn't surfaced before.<br />
The fix on ProGet's side should be a one-liner: pad/format fractional seconds to either 0, 3, or 6 digits (6 to match PyPI is probably safest).</p>
<p dir="auto"><strong>Repro</strong><br />
Against a ProGet 2026 PyPI feed, with a package whose <code>upload-time</code> happens to truncate to 2 digits (we're seeing it on <code>setup-rebalance</code>):</p>
<pre><code>uv venv repro --python 3.10            # gets default pip 23.0.1
repro\Scripts\python -m pip install --dry-run --no-deps ^
  --index-url https://&lt;proget-host&gt;/pypi/Python/simple ^
  --trusted-host &lt;proget-host&gt; setup-rebalance
# works (pip 23 doesn't read upload-time)

repro\Scripts\python -m pip install --upgrade pip   # -&gt; pip 26.1.1
repro\Scripts\python -m pip install --dry-run --no-deps ^
  --index-url https://&lt;proget-host&gt;/pypi/Python/simple ^
  --trusted-host &lt;proget-host&gt; setup-rebalance
# fails on ValueError from datetime.fromisoformat
</code></pre>
<p dir="auto">Confirming directly in Python 3.10:</p>
<pre><code>&gt;&gt;&gt; from datetime import datetime
&gt;&gt;&gt; datetime.fromisoformat('2026-04-15T10:23:45.123456')  # OK
&gt;&gt;&gt; datetime.fromisoformat('2026-04-15T10:23:45.123')     # OK
&gt;&gt;&gt; datetime.fromisoformat('2026-04-15T10:23:45.12')      # ValueError
</code></pre>
<p dir="auto"><strong>Impact</strong><br />
Anything running Python 3.10 with pip auto-upgraded (which is a common pattern — <code>python -m pip install --upgrade pip</code> is in lots of bootstrap scripts in the wild). Once pip ≥ 25.3 is installed, the env is bricked against any ProGet PyPI feed serving 2-digit fractional <code>upload-time</code> values.</p>
<p dir="auto">Could you confirm whether this is in scope for a maintenance release? Happy to provide the raw JSON response from our feed if useful — just let me know where to send it.</p>
<p dir="auto">Cheers</p>
]]></description><link>https://forums.inedo.com/topic/5764/malformed-upload-time-2-digit-fractional-seconds-breaks-pip-25-3-on-python-3-10</link><generator>RSS for Node</generator><lastBuildDate>Fri, 29 May 2026 17:54:31 GMT</lastBuildDate><atom:link href="https://forums.inedo.com/topic/5764.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 May 2026 13:08:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Malformed upload-time (2-digit fractional seconds) breaks pip ≥ 25.3 on Python 3.10 on Fri, 29 May 2026 13:10:20 GMT]]></title><description><![CDATA[<p dir="auto">Following on from the recent PEP 700 work in <a href="https://issues.inedo.com/issue/PG-3272" class="inedo-link inedo-link-pg" rel="nofollow">PG-3272</a> / <a href="https://issues.inedo.com/issue/PG-3288" class="inedo-link inedo-link-pg" rel="nofollow">PG-3288</a> — we've hit a related but distinct issue with upload-time on ProGet 2026.1 (build 14).<br />
The field is now present (good), but the fractional seconds are sometimes serialised to 2 digits, e.g. <code>2026-04-15T10:23:45.12Z. PEP 700</code><br />
says the fractional part "may contain up to 6 digits of precision", so this is arguably spec-compliant, but it breaks every Python 3.10 client running pip ≥ 25.3.</p>
<p dir="auto">The reason: pip 25.3+ reads <code>upload-time</code> on every resolve (for the <code>--uploaded-prior-to feature</code>) and parses it with <code>datetime.fromisoformat</code>. The pre-3.11 implementation of <code>fromisoformat</code> only accepts 0, 3, or 6 fractional digits — 2 digits raises <code>ValueError</code>. Python 3.11+ has the rewritten parser that handles arbitrary precision, so it doesn't reproduce there. PyPI itself always emits 6-digit microseconds, which is why this hasn't surfaced before.<br />
The fix on ProGet's side should be a one-liner: pad/format fractional seconds to either 0, 3, or 6 digits (6 to match PyPI is probably safest).</p>
<p dir="auto"><strong>Repro</strong><br />
Against a ProGet 2026 PyPI feed, with a package whose <code>upload-time</code> happens to truncate to 2 digits (we're seeing it on <code>setup-rebalance</code>):</p>
<pre><code>uv venv repro --python 3.10            # gets default pip 23.0.1
repro\Scripts\python -m pip install --dry-run --no-deps ^
  --index-url https://&lt;proget-host&gt;/pypi/Python/simple ^
  --trusted-host &lt;proget-host&gt; setup-rebalance
# works (pip 23 doesn't read upload-time)

repro\Scripts\python -m pip install --upgrade pip   # -&gt; pip 26.1.1
repro\Scripts\python -m pip install --dry-run --no-deps ^
  --index-url https://&lt;proget-host&gt;/pypi/Python/simple ^
  --trusted-host &lt;proget-host&gt; setup-rebalance
# fails on ValueError from datetime.fromisoformat
</code></pre>
<p dir="auto">Confirming directly in Python 3.10:</p>
<pre><code>&gt;&gt;&gt; from datetime import datetime
&gt;&gt;&gt; datetime.fromisoformat('2026-04-15T10:23:45.123456')  # OK
&gt;&gt;&gt; datetime.fromisoformat('2026-04-15T10:23:45.123')     # OK
&gt;&gt;&gt; datetime.fromisoformat('2026-04-15T10:23:45.12')      # ValueError
</code></pre>
<p dir="auto"><strong>Impact</strong><br />
Anything running Python 3.10 with pip auto-upgraded (which is a common pattern — <code>python -m pip install --upgrade pip</code> is in lots of bootstrap scripts in the wild). Once pip ≥ 25.3 is installed, the env is bricked against any ProGet PyPI feed serving 2-digit fractional <code>upload-time</code> values.</p>
<p dir="auto">Could you confirm whether this is in scope for a maintenance release? Happy to provide the raw JSON response from our feed if useful — just let me know where to send it.</p>
<p dir="auto">Cheers</p>
]]></description><link>https://forums.inedo.com/post/19734</link><guid isPermaLink="true">https://forums.inedo.com/post/19734</guid><dc:creator><![CDATA[appplat_4310]]></dc:creator><pubDate>Fri, 29 May 2026 13:10:20 GMT</pubDate></item><item><title><![CDATA[Reply to Malformed upload-time (2-digit fractional seconds) breaks pip ≥ 25.3 on Python 3.10 on Fri, 29 May 2026 14:35:18 GMT]]></title><description><![CDATA[<p dir="auto">Hi <a class="plugin-mentions-user plugin-mentions-a" href="https://forums.inedo.com/uid/2270">@appplat_4310</a>,</p>
<p dir="auto">It shouldn't be a problem to get this in today's release (2026.2). I've logged it as <a href="https://issues.inedo.com/issue/PG-3295" class="inedo-link inedo-link-pg" rel="nofollow">PG-3295</a>.</p>
<p dir="auto">-Greg</p>
]]></description><link>https://forums.inedo.com/post/19735</link><guid isPermaLink="true">https://forums.inedo.com/post/19735</guid><dc:creator><![CDATA[gdivis]]></dc:creator><pubDate>Fri, 29 May 2026 14:35:18 GMT</pubDate></item></channel></rss>