[med-svn] [Git][python-team/packages/python-ciso8601][master] 4 commits: New upstream version 2.3.3

Colin Watson (@cjwatson) gitlab at salsa.debian.org
Wed Sep 3 01:13:31 BST 2025



Colin Watson pushed to branch master at Debian Python Team / packages / python-ciso8601


Commits:
e7964437 by Colin Watson at 2025-09-03T01:06:26+01:00
New upstream version 2.3.3
- - - - -
593d3a96 by Colin Watson at 2025-09-03T01:08:34+01:00
Update upstream source from tag 'upstream/2.3.3'

Update to upstream version '2.3.3'
with Debian dir 0767cefc340e3016d12c59a57a4845111f6e67ee

- - - - -
d6916895 by Colin Watson at 2025-09-03T01:11:25+01:00
Use pybuild-plugin-pyproject

- - - - -
ec581f0e by Colin Watson at 2025-09-03T01:11:45+01:00
releasing package python-ciso8601 version 2.3.3-1

- - - - -


15 changed files:

- .circleci/config.yml
- .github/workflows/build-wheels.yml
- + .github/workflows/test_and_lint.yml
- CHANGELOG.md
- README.rst
- RELEASING.md
- benchmarking/Dockerfile
- benchmarking/tox.ini
- debian/changelog
- debian/control
- pyproject.toml
- setup.py
- tests/tests.py
- timezone.c
- tox.ini


Changes:

=====================================
.circleci/config.yml
=====================================
@@ -12,17 +12,11 @@ workflows:
           matrix:
             parameters:
               python_version:
-                ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
+                ["3.6", "3.7"]
       - test_old_pypy:
           matrix:
             parameters:
               python_version: ["2.7"]
-      - test_pypy:
-          matrix:
-            parameters:
-              python_version: ["3.7", "3.8", "3.9", "3.10"]
-      - lint-rst
-      - clang-format
 
 jobs:
   # `cimg/python` doesn't support Python 3.4,
@@ -53,7 +47,7 @@ jobs:
     docker:
       - image: pypy:<<parameters.python_version>>
 
-  test: &tests
+  test:
     parameters:
       python_version:
         type: string
@@ -79,50 +73,3 @@ jobs:
             python -m unittest
     docker:
       - image: cimg/python:<<parameters.python_version>>
-
-  test_pypy:
-    <<: *tests
-    docker:
-      - image: pypy:<<parameters.python_version>>
-
-  lint-rst:
-    working_directory: ~/code
-    steps:
-      - checkout
-      - run:
-          name: Install lint tools
-          command: |
-            python3 -m venv venv
-            . venv/bin/activate
-            pip install Pygments restructuredtext-lint
-      - run:
-          name: Lint
-          command: |
-            . venv/bin/activate
-            rst-lint --encoding=utf-8 README.rst
-    docker:
-      - image: cimg/python:3.13
-
-  clang-format:
-    working_directory: ~/code
-    steps:
-      - checkout
-      - run:
-          name: Install lint tools
-          command: |
-            sudo apt-get update -y
-            sudo apt-get install -y clang-format
-      - run:
-          name: Lint
-          command: |
-            SOURCE_FILES=`find ./ -name \*.c -type f -or -name \*.h -type f`
-            for SOURCE_FILE in $SOURCE_FILES
-            do
-              export FORMATTING_ISSUE_COUNT=`clang-format -output-replacements-xml $SOURCE_FILE | grep offset | wc -l`
-              if [ "$FORMATTING_ISSUE_COUNT" -gt "0" ]; then
-                echo "Source file $SOURCE_FILE contains formatting issues. Please use clang-format tool to resolve found issues."
-                exit 1
-              fi
-            done
-    docker:
-      - image: cimg/python:3.13


=====================================
.github/workflows/build-wheels.yml
=====================================
@@ -11,7 +11,7 @@ jobs:
   sanity_check:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout at v4
+      - uses: actions/checkout at v5
 
       - uses: actions/setup-python at v5
         name: Install Python
@@ -85,7 +85,7 @@ jobs:
         os: [ubuntu-latest, windows-latest, macos-latest]
 
     steps:
-      - uses: actions/checkout at v4
+      - uses: actions/checkout at v5
 
       - name: Set up QEMU # Needed to build aarch64 wheels
         if: runner.os == 'Linux'
@@ -93,10 +93,11 @@ jobs:
         with:
           platforms: all
 
-      - uses: closeio/cibuildwheel at v2.20.0
+      - uses: closeio/cibuildwheel at v3.1.4
 
       - uses: actions/upload-artifact at v4
         with:
+          name: ${{ matrix.os }}-wheels
           path: ./wheelhouse/*.whl
 
   build_sdist:
@@ -104,7 +105,7 @@ jobs:
     needs: [sanity_check]
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout at v4
+      - uses: actions/checkout at v5
 
       - uses: actions/setup-python at v5
         name: Install Python
@@ -119,4 +120,5 @@ jobs:
 
       - uses: actions/upload-artifact at v4
         with:
+          name: sdist
           path: dist/*.tar.gz


=====================================
.github/workflows/test_and_lint.yml
=====================================
@@ -0,0 +1,84 @@
+name: Test and Lint
+
+on:
+  push:
+  pull_request:
+    branches: [ main ]
+
+jobs:
+
+  test:
+    runs-on: ubuntu-24.04
+    strategy:
+      fail-fast: true
+      matrix:
+        python-version:
+          - '3.8'
+          - '3.9'
+          - '3.10'
+          - '3.11'
+          - '3.12'
+          - '3.13'
+          - '3.14.0-rc.2'
+          - 'pypy-3.7'
+          - 'pypy-3.8'
+          - 'pypy-3.9'
+          - 'pypy-3.10'
+          - 'pypy-3.11'
+    steps:
+      - uses: actions/checkout at v4
+      - uses: actions/setup-python at v5
+        with:
+          python-version: ${{ matrix.python-version }}
+      - name: Install ciso8601
+        run: |
+          python -m venv venv
+          . venv/bin/activate
+          pip install --upgrade build
+          python -m build -s
+          pip install dist/ciso8601-*.tar.gz
+      - name: Install testing dependencies
+        run: |
+          . venv/bin/activate
+          pip install pytz
+      - name: Test
+        run: |
+          . venv/bin/activate
+          python -m unittest
+
+  lint-rst:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout at v4
+      - uses: actions/setup-python at v4
+        with:
+          python-version: '3.13'
+      - name: Install lint tools
+        run: |
+          python3 -m venv venv
+          . venv/bin/activate
+          pip install Pygments restructuredtext-lint
+      - name: Lint
+        run: |
+          . venv/bin/activate
+          rst-lint --encoding=utf-8 README.rst
+
+  clang-format:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout at v4
+      - name: Install lint tools
+        run: |
+          sudo apt-get update -y
+          sudo apt-get install -y clang-format
+      - name: Lint
+        run: |
+          SOURCE_FILES=`find ./ -name \*.c -type f -or -name \*.h -type f`
+          for SOURCE_FILE in $SOURCE_FILES
+          do
+            export FORMATTING_ISSUE_COUNT=`clang-format -output-replacements-xml $SOURCE_FILE | grep offset | wc -l`
+            if [ "$FORMATTING_ISSUE_COUNT" -gt "0" ]; then
+              echo "Source file $SOURCE_FILE contains formatting issues. Please use clang-format tool to resolve found issues."
+              exit 1
+            fi
+          done


=====================================
CHANGELOG.md
=====================================
@@ -2,6 +2,7 @@
 
 - [Unreleased](#unreleased)
 - [2.x.x](#2xx)
+  - [Version 2.3.3](#version-233)
   - [Version 2.3.2](#version-232)
   - [Version 2.3.1](#version-231)
   - [Version 2.3.0](#version-230)
@@ -27,6 +28,13 @@
 
 # 2.x.x
 
+## Version 2.3.3
+
+* Added Python 3.14 support
+* Added PyPy 3.11 support
+* Fixed memory leak in `FixedOffset_fromutc` (#172).
+* Migrated some CI testing to GHA
+
 ## Version 2.3.2
 
 * Add support for aarch64 wheels. Thank you @bbayles!


=====================================
README.rst
=====================================
@@ -14,7 +14,7 @@ ciso8601
 ``ciso8601`` converts `ISO 8601`_ or `RFC 3339`_ date time strings into Python datetime objects.
 
 Since it's written as a C module, it is much faster than other Python libraries.
-Tested with cPython 2.7, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13.
+Tested with cPython 2.7, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14.
 
 .. _ISO 8601: https://en.wikipedia.org/wiki/ISO_8601
 .. _RFC 3339: https://tools.ietf.org/html/rfc3339
@@ -81,45 +81,45 @@ Parsing a timestamp with no time zone information (e.g., ``2014-01-09T21:48:00``
 
 .. table::
 
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |             Module             |Python 3.13|Python 3.12|Python 3.11|Python 3.10|Relative slowdown (versus ciso8601, latest Python)|…|Python 3.9|Python 3.8|
-    +================================+===========+===========+===========+===========+==================================================+=+==========+==========+
-    |ciso8601                        |64.8 nsec  |62.8 nsec  |60.1 nsec  |91.7 nsec  |N/A                                               |…|86 nsec   |92.9 nsec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |backports.datetime_fromisoformat|N/A        |N/A        |N/A        |73.6 nsec  |0.8x                                              |…|70 nsec   |75.9 nsec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |datetime (builtin)              |147 nsec   |138 nsec   |123 nsec   |N/A        |2.3x                                              |…|N/A       |N/A       |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |pendulum                        |171 nsec   |181 nsec   |175 nsec   |214 nsec   |2.6x                                              |…|179 nsec  |180 nsec  |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |udatetime                       |542 nsec   |563 nsec   |525 nsec   |555 nsec   |8.4x                                              |…|551 nsec  |553 nsec  |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |str2date                        |3.29 usec  |3.53 usec  |3.52 usec  |3.85 usec  |50.8x                                             |…|3.72 usec |3.9 usec  |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |iso8601utils                    |N/A        |N/A        |N/A        |N/A        |56.9x                                             |…|4.89 usec |4.89 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |iso8601                         |5.1 usec   |5.4 usec   |5.18 usec  |5.38 usec  |78.8x                                             |…|5.36 usec |5.55 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |isodate                         |5.76 usec  |5.85 usec  |5.21 usec  |5.91 usec  |89.0x                                             |…|5.97 usec |6.07 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |PySO8601                        |10 usec    |11.5 usec  |7.99 usec  |10.9 usec  |155.0x                                            |…|9.83 usec |9.81 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |aniso8601                       |12.1 usec  |12.5 usec  |11.1 usec  |15.1 usec  |186.9x                                            |…|15.4 usec |15.6 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |zulu                            |12.3 usec  |13.6 usec  |12.6 usec  |14.2 usec  |189.4x                                            |…|14.5 usec |14.2 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |maya                            |35.9 usec  |N/A        |40.6 usec  |46.7 usec  |554.3x                                            |…|45.4 usec |46.3 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |python-dateutil                 |36.2 usec  |36.9 usec  |36.1 usec  |44 usec    |558.5x                                            |…|46.4 usec |45.2 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |arrow                           |42.9 usec  |43.8 usec  |41.2 usec  |48.8 usec  |662.7x                                            |…|50.7 usec |50.1 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |metomi-isodatetime              |828 usec   |822 usec   |791 usec   |1.09 msec  |12781.0x                                          |…|1.1 msec  |1.11 msec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |moment                          |1.28 msec  |1.32 msec  |1.29 msec  |1.36 msec  |19696.9x                                          |…|1.37 msec |1.34 msec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-
-ciso8601 takes 64.8 nsec, which is **2.3x faster than datetime (builtin)**, the next fastest Python 3.13 parser in this comparison.
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |             Module             |Python 3.14|Python 3.13|Python 3.12|Python 3.11|Relative slowdown (versus ciso8601, latest Python)|…|Python 3.10|Python 3.9|Python 3.8|
+    +================================+===========+===========+===========+===========+==================================================+=+===========+==========+==========+
+    |ciso8601                        |26.4 nsec  |23.4 nsec  |24.5 nsec  |25.4 nsec  |N/A                                               |…|35.9 nsec  |35.6 nsec |37 nsec   |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |backports.datetime_fromisoformat|N/A        |N/A        |N/A        |N/A        |0.8x                                              |…|30.3 nsec  |30.7 nsec |32 nsec   |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |datetime (builtin)              |51.5 nsec  |48 nsec    |54.8 nsec  |53.9 nsec  |2.0x                                              |…|N/A        |N/A       |N/A       |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |udatetime                       |269 nsec   |277 nsec   |277 nsec   |280 nsec   |10.2x                                             |…|280 nsec   |279 nsec  |280 nsec  |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |str2date                        |1.4 usec   |1.42 usec  |1.59 usec  |1.59 usec  |52.9x                                             |…|1.62 usec  |1.64 usec |1.76 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |pendulum                        |1.74 usec  |65.2 nsec  |64.8 nsec  |64.7 nsec  |65.8x                                             |…|64.6 nsec  |66.4 nsec |86.4 nsec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |iso8601                         |2.13 usec  |2.2 usec   |2.35 usec  |2.1 usec   |80.6x                                             |…|2.3 usec   |2.31 usec |2.47 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |iso8601utils                    |N/A        |N/A        |N/A        |N/A        |61.5x                                             |…|N/A        |2.19 usec |2.51 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |isodate                         |2.36 usec  |2.52 usec  |2.78 usec  |2.18 usec  |89.3x                                             |…|2.41 usec  |2.4 usec  |2.49 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |PySO8601                        |3.55 usec  |3.79 usec  |3.79 usec  |3.11 usec  |134.6x                                            |…|3.94 usec  |3.64 usec |6.79 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |aniso8601                       |4.32 usec  |4.74 usec  |4.95 usec  |4.37 usec  |163.9x                                            |…|5.53 usec  |5.19 usec |5.72 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |zulu                            |4.71 usec  |4.63 usec  |5.12 usec  |4.54 usec  |178.7x                                            |…|5.17 usec  |4.93 usec |5.17 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |python-dateutil                 |10.3 usec  |11.4 usec  |12.6 usec  |11.9 usec  |390.4x                                            |…|14.9 usec  |15.3 usec |15.8 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |arrow                           |13.3 usec  |13.4 usec  |14.7 usec  |13.5 usec  |503.5x                                            |…|16.7 usec  |16.2 usec |17.4 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |maya                            |13.7 usec  |10.9 usec  |14.7 usec  |12.7 usec  |520.0x                                            |…|15.7 usec  |14.5 usec |16 usec   |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |metomi-isodatetime              |335 usec   |345 usec   |353 usec   |359 usec   |12687.0x                                          |…|480 usec   |468 usec  |508 usec  |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |moment                          |487 usec   |502 usec   |525 usec   |503 usec   |18471.2x                                          |…|563 usec   |559 usec  |576 usec  |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+
+ciso8601 takes 26.4 nsec, which is **2.0x faster than datetime (builtin)**, the next fastest Python 3.14 parser in this comparison.
 
 .. </include:benchmark_with_no_time_zone.rst>
 
@@ -129,65 +129,65 @@ Parsing a timestamp with time zone information (e.g., ``2014-01-09T21:48:00-05:3
 
 .. table::
 
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |             Module             |Python 3.13|Python 3.12|Python 3.11|Python 3.10|Relative slowdown (versus ciso8601, latest Python)|…|Python 3.9|Python 3.8|
-    +================================+===========+===========+===========+===========+==================================================+=+==========+==========+
-    |ciso8601                        |73.9 nsec  |71 nsec    |65.6 nsec  |97.5 nsec  |N/A                                               |…|92.9 nsec |96.6 nsec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |backports.datetime_fromisoformat|N/A        |N/A        |N/A        |99.2 nsec  |1.0x                                              |…|93 nsec   |99.4 nsec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |datetime (builtin)              |205 nsec   |198 nsec   |178 nsec   |N/A        |2.8x                                              |…|N/A       |N/A       |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |pendulum                        |251 nsec   |259 nsec   |251 nsec   |262 nsec   |3.4x                                              |…|264 nsec  |264 nsec  |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |udatetime                       |684 nsec   |700 nsec   |646 nsec   |684 nsec   |9.3x                                              |…|688 nsec  |676 nsec  |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |str2date                        |5.95 usec  |4.34 usec  |4.11 usec  |4.58 usec  |80.5x                                             |…|4.6 usec  |4.82 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |iso8601                         |7.68 usec  |8.56 usec  |7.62 usec  |7.99 usec  |103.9x                                            |…|7.83 usec |8.16 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |isodate                         |7.77 usec  |8.53 usec  |7.54 usec  |7.88 usec  |105.0x                                            |…|8.12 usec |8.4 usec  |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |iso8601utils                    |N/A        |N/A        |N/A        |N/A        |152.2x                                            |…|14.1 usec |14.6 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |zulu                            |17.8 usec  |16.9 usec  |15.7 usec  |17.3 usec  |241.3x                                            |…|17.3 usec |17.6 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |aniso8601                       |18 usec    |18.7 usec  |16.4 usec  |21.5 usec  |243.1x                                            |…|22.5 usec |22.8 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |PySO8601                        |18.3 usec  |16.6 usec  |14.3 usec  |15.8 usec  |247.5x                                            |…|16.2 usec |16.4 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |maya                            |46.2 usec  |N/A        |41 usec    |47.5 usec  |625.0x                                            |…|45.2 usec |47 usec   |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |python-dateutil                 |47.1 usec  |48.2 usec  |47.1 usec  |57.3 usec  |636.5x                                            |…|60.4 usec |58.9 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |arrow                           |57.7 usec  |53.8 usec  |50.8 usec  |60.2 usec  |780.2x                                            |…|59.4 usec |60.1 usec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |metomi-isodatetime              |876 usec   |823 usec   |795 usec   |1.09 msec  |11846.4x                                          |…|1.09 msec |1.13 msec |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-    |moment                          |❌         |❌         |❌         |❌         |2070678.8x                                        |…|❌        |❌        |
-    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+----------+----------+
-
-ciso8601 takes 73.9 nsec, which is **2.8x faster than datetime (builtin)**, the next fastest Python 3.13 parser in this comparison.
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |             Module             |Python 3.14|Python 3.13|Python 3.12|Python 3.11|Relative slowdown (versus ciso8601, latest Python)|…|Python 3.10|Python 3.9|Python 3.8|
+    +================================+===========+===========+===========+===========+==================================================+=+===========+==========+==========+
+    |ciso8601                        |30.7 nsec  |27.8 nsec  |27.9 nsec  |29.3 nsec  |N/A                                               |…|39 nsec    |39.4 nsec |40.2 nsec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |backports.datetime_fromisoformat|N/A        |N/A        |N/A        |N/A        |1.2x                                              |…|46.6 nsec  |48.4 nsec |49.1 nsec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |datetime (builtin)              |81.6 nsec  |72.7 nsec  |77.8 nsec  |68.8 nsec  |2.7x                                              |…|N/A        |N/A       |N/A       |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |udatetime                       |344 nsec   |321 nsec   |334 nsec   |332 nsec   |11.2x                                             |…|331 nsec   |332 nsec  |336 nsec  |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |str2date                        |1.67 usec  |1.73 usec  |1.94 usec  |1.77 usec  |54.2x                                             |…|1.96 usec  |1.94 usec |2.08 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |pendulum                        |2.48 usec  |104 nsec   |104 nsec   |104 nsec   |80.7x                                             |…|106 nsec   |105 nsec  |130 nsec  |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |iso8601                         |3.04 usec  |3.24 usec  |3.42 usec  |3.06 usec  |98.7x                                             |…|3.17 usec  |3.18 usec |3.52 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |isodate                         |3.14 usec  |3.16 usec  |3.39 usec  |2.88 usec  |102.3x                                            |…|3.1 usec   |3.12 usec |3.26 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |iso8601utils                    |N/A        |N/A        |N/A        |N/A        |126.4x                                            |…|N/A        |4.98 usec |5.3 usec  |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |PySO8601                        |5.11 usec  |5.23 usec  |5.67 usec  |4.75 usec  |166.3x                                            |…|5.31 usec  |5.23 usec |5.72 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |zulu                            |5.47 usec  |5.66 usec  |6.08 usec  |5.26 usec  |177.9x                                            |…|5.85 usec  |5.83 usec |5.96 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |aniso8601                       |5.96 usec  |6.42 usec  |7.19 usec  |6.18 usec  |194.0x                                            |…|7.56 usec  |7.26 usec |7.91 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |python-dateutil                 |13.2 usec  |14.6 usec  |15.6 usec  |15.9 usec  |428.8x                                            |…|19.7 usec  |20 usec   |20.6 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |arrow                           |15.6 usec  |16.3 usec  |19.5 usec  |16.1 usec  |507.7x                                            |…|20 usec    |19.3 usec |19.9 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |maya                            |15.8 usec  |12 usec    |14.4 usec  |12.4 usec  |512.7x                                            |…|15 usec    |14.7 usec |15.1 usec |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |metomi-isodatetime              |329 usec   |346 usec   |342 usec   |335 usec   |10692.8x                                          |…|475 usec   |482 usec  |487 usec  |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+    |moment                          |❌         |❌         |❌         |❌         |2112732.4x                                        |…|❌         |❌        |❌        |
+    +--------------------------------+-----------+-----------+-----------+-----------+--------------------------------------------------+-+-----------+----------+----------+
+
+ciso8601 takes 30.7 nsec, which is **2.7x faster than datetime (builtin)**, the next fastest Python 3.14 parser in this comparison.
 
 .. </include:benchmark_with_time_zone.rst>
 
 .. <include:benchmark_module_versions.rst>
 
-Tested on Linux 6.11.5-orbstack-00280-g96d99c92a42b using the following modules:
+Tested on Linux 6.14.10-orbstack-00291-g1b252bd3edea using the following modules:
 
 .. code:: python
 
-  aniso8601==9.0.1
+  aniso8601==10.0.1
   arrow==1.3.0
-  backports.datetime_fromisoformat==2.0.2
-  ciso8601==2.3.1
+  backports.datetime_fromisoformat==2.0.3
+  ciso8601==2.3.2
   iso8601==2.1.0
   iso8601utils==0.1.2
   isodate==0.7.2
   maya==0.6.1
   metomi-isodatetime==1!3.1.0
   moment==0.12.1
-  pendulum==3.0.0
+  pendulum==3.1.0 (on Python 3.9, 3.10, 3.11, 3.12, 3.13, 3.14), pendulum==3.0.0 (on Python 3.8)
   PySO8601==0.2.0
   python-dateutil==2.9.0.post0
   str2date==0.905


=====================================
RELEASING.md
=====================================
@@ -19,4 +19,14 @@ The document will describe the process of releasing a new version of `ciso8601`
 4. In the `Describe this release` field copy-paste the `CHANGELOG.md` notes for this release.
 5. Click `Publish Release`
 
-This will trigger a [GitHub Action](.github/workflows/build-wheels.yml) that listens for new tags that follow our format, builds the wheels for the release, and publishes them to PyPI.
\ No newline at end of file
+There is a [GitHub Action](.github/workflows/build-wheels.yml) that must be dispatched manually, which builds the wheels for the release. The artifacts can then be downloaded locally then [uploaded to pypi](https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/#upload-your-distributions).
+
+The `dist/` folder should look roughly like:
+```
+$ ls dist
+ciso8601-2.3.2-cp310-cp310-macosx_11_0_arm64.whl
+ciso8601-2.3.2-cp310-cp310-macosx_11_0_universal2.whl
+...
+ciso8601-2.3.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ciso8601-2.3.2.tar.gz
+```


=====================================
benchmarking/Dockerfile
=====================================
@@ -22,7 +22,8 @@ RUN apt install -y python3.7 python3.7-dev python3.7-venv && \
     apt install -y python3.10 python3.10-dev python3.10-venv && \
     apt install -y python3.11 python3.11-dev python3.11-venv && \
     apt install -y python3.12 python3.12-dev python3.12-venv && \
-    apt install -y python3.13 python3.13-dev python3.13-venv
+    apt install -y python3.13 python3.13-dev python3.13-venv && \
+    apt install -y python3.14 python3.14-dev python3.14-venv
 
 # Make Python 3.13 the default `python`
 RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.13 10


=====================================
benchmarking/tox.ini
=====================================
@@ -1,7 +1,7 @@
 [tox]
 requires =
     tox>=4
-envlist = py313,py312,py311,py310,py39,py38
+envlist = py314,py313,py312,py311,py310,py39,py38
 setupdir=..
 
 [testenv]


=====================================
debian/changelog
=====================================
@@ -1,3 +1,11 @@
+python-ciso8601 (2.3.3-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+  * Use pybuild-plugin-pyproject.
+
+ -- Colin Watson <cjwatson at debian.org>  Wed, 03 Sep 2025 01:11:26 +0100
+
 python-ciso8601 (2.3.2-1) unstable; urgency=medium
 
   * Team upload.


=====================================
debian/control
=====================================
@@ -7,6 +7,7 @@ Priority: optional
 Build-Depends:
  debhelper-compat (= 13),
  dh-sequence-python3,
+ pybuild-plugin-pyproject,
  python3-all-dev,
  python3-setuptools,
  python3-tz <!nocheck>,


=====================================
pyproject.toml
=====================================
@@ -16,10 +16,14 @@ build = [
     "cp310-*",
     "cp311-*",
     "cp312-*",
+    "cp313-*",
+    "cp314-*",
     "pp38-*",
     "pp39-*",
     "pp310-*",
+    "pp311-*",
 ]
+enable = ["pypy", "pypy-eol"]
 
 [tool.cibuildwheel.linux]
 archs = ["x86_64", "aarch64"]
@@ -31,4 +35,4 @@ skip = ["pp*"]
 
 [tool.cibuildwheel.windows]
 archs = ["AMD64"]
-skip = ["pp*-win*", "*-win3"]
+skip = ["pp*-win*", "*-win32"]


=====================================
setup.py
=====================================
@@ -31,7 +31,7 @@ if os.environ.get("STRICT_WARNINGS", "0") == "1":
         os.environ["_CL_"] = ""
     os.environ["_CL_"] += " /WX"
 
-VERSION = "2.3.2"
+VERSION = "2.3.3"
 CISO8601_CACHING_ENABLED = int(os.environ.get('CISO8601_CACHING_ENABLED', '1') == '1')
 
 setup(
@@ -75,6 +75,7 @@ setup(
         "Programming Language :: Python :: 3.11",
         "Programming Language :: Python :: 3.12",
         "Programming Language :: Python :: 3.13",
+        "Programming Language :: Python :: 3.14",
         "Topic :: Software Development :: Libraries :: Python Modules",
     ],
 )


=====================================
tests/tests.py
=====================================
@@ -240,7 +240,36 @@ class InvalidTimestampTestCase(unittest.TestCase):
         )
 
     def test_invalid_day_for_month(self):
-        if platform.python_implementation() == 'PyPy' and sys.version_info.major >= 3:
+        if platform.python_implementation() == 'CPython' and sys.version_info >= (3, 14):
+            for non_leap_year in (1700, 1800, 1900, 2014):
+                self.assertRaisesRegex(
+                    ValueError,
+                    "day 29 must be in range 1..28 for month 2 in year {0}".format(non_leap_year),
+                    parse_datetime,
+                    "{}-02-29".format(non_leap_year),
+                )
+
+            self.assertRaisesRegex(
+                ValueError,
+                r"day 32 must be in range 1..31 for month 1 in year 2014",
+                parse_datetime,
+                "2014-01-32",
+            )
+
+            self.assertRaisesRegex(
+                ValueError,
+                r"day 31 must be in range 1..30 for month 6 in year 2014",
+                parse_datetime,
+                "2014-06-31",
+            )
+
+            self.assertRaisesRegex(
+                ValueError,
+                r"day 0 must be in range 1..30 for month 6 in year 2014",
+                parse_datetime,
+                "2014-06-00",
+            )
+        elif platform.python_implementation() == 'PyPy' and sys.version_info.major >= 3:
             for non_leap_year in (1700, 1800, 1900, 2014):
                 self.assertRaisesRegex(
                     ValueError,
@@ -577,7 +606,14 @@ class GithubIssueRegressionTestCase(unittest.TestCase):
         )
 
     def test_issue_22(self):
-        if platform.python_implementation() == 'PyPy' and sys.version_info.major >= 3:
+        if platform.python_implementation() == 'CPython' and sys.version_info >= (3, 14):
+            self.assertRaisesRegex(
+                ValueError,
+                r"day 31 must be in range 1..30 for month 11 in year 2016",
+                parse_datetime,
+                "2016-11-31T12:34:34.521059",
+            )
+        elif platform.python_implementation() == 'PyPy' and sys.version_info.major >= 3:
             self.assertRaisesRegex(
                 ValueError,
                 r"('day must be in 1..30', 31)",
@@ -601,7 +637,14 @@ class GithubIssueRegressionTestCase(unittest.TestCase):
         )
 
     def test_issue_42(self):
-        if platform.python_implementation() == 'PyPy' and sys.version_info.major >= 3:
+        if platform.python_implementation() == 'CPython' and sys.version_info >= (3, 14):
+            self.assertRaisesRegex(
+                ValueError,
+                r"day 0 must be in range 1..28 for month 2 in year 2014",
+                parse_datetime,
+                "20140200",
+            )
+        elif platform.python_implementation() == 'PyPy' and sys.version_info.major >= 3:
             self.assertRaisesRegex(
                 ValueError,
                 r"('day must be in 1..28', 0)",


=====================================
timezone.c
=====================================
@@ -81,22 +81,28 @@ FixedOffset_dst(FixedOffset *self, PyObject *dt)
 }
 
 static PyObject *
-FixedOffset_fromutc(FixedOffset *self, PyDateTime_DateTime *dt)
+FixedOffset_fromutc(FixedOffset *self, PyObject *dt_obj)
 {
-    if (!PyDateTime_Check(dt)) {
+    if (!PyDateTime_Check(dt_obj)) {
         PyErr_SetString(PyExc_TypeError,
                         "fromutc: argument must be a datetime");
         return NULL;
     }
+
+    PyDateTime_DateTime *dt = (PyDateTime_DateTime *)dt_obj;
+
     if (!dt->hastzinfo || dt->tzinfo != (PyObject *)self) {
-        PyErr_SetString(PyExc_ValueError,
-                        "fromutc: dt.tzinfo "
-                        "is not self");
+        PyErr_SetString(PyExc_ValueError, "fromutc: dt.tzinfo is not self");
         return NULL;
     }
 
-    return PyNumber_Add((PyObject *)dt,
-                        FixedOffset_utcoffset(self, (PyObject *)self));
+    PyObject *delta = FixedOffset_utcoffset(self, dt_obj);
+    if (!delta)
+        return NULL;
+
+    PyObject *res = PyNumber_Add(dt_obj, delta);
+    Py_DECREF(delta);
+    return res;
 }
 
 static PyObject *


=====================================
tox.ini
=====================================
@@ -1,7 +1,7 @@
 [tox]
 requires =
     tox>=4
-envlist = {py313,py312,py311,py310,py39,py38}-caching_{enabled,disabled}
+envlist = {py314,py313,py312,py311,py310,py39,py38}-caching_{enabled,disabled}
 
 [testenv]
 package = sdist



View it on GitLab: https://salsa.debian.org/python-team/packages/python-ciso8601/-/compare/719fa5c7954cdc62e130fcda8a2e4a447158b797...ec581f0e568ea727daf0aeb87f25d6004292bef6

-- 
View it on GitLab: https://salsa.debian.org/python-team/packages/python-ciso8601/-/compare/719fa5c7954cdc62e130fcda8a2e4a447158b797...ec581f0e568ea727daf0aeb87f25d6004292bef6
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20250903/20fdbb1a/attachment-0001.htm>


More information about the debian-med-commit mailing list