Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-fastnumbers for 
openSUSE:Factory checked in at 2026-07-07 20:59:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-fastnumbers (Old)
 and      /work/SRC/openSUSE:Factory/.python-fastnumbers.new.1982 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-fastnumbers"

Tue Jul  7 20:59:59 2026 rev:15 rq:1363871 version:5.2.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-fastnumbers/python-fastnumbers.changes    
2026-04-13 23:18:20.382770414 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-fastnumbers.new.1982/python-fastnumbers.changes
  2026-07-07 21:00:23.264484160 +0200
@@ -1,0 +2,38 @@
+Sun Jul  5 13:15:57 UTC 2026 - Ben Greiner <[email protected]>
+
+- Remove no-setuptools-scm.patch, use PyPI package which ships a
+  version file instead of GitHub tarball which failed the source
+  validator.
+- Clean up specfile from EOL distro workarounds
+
+-------------------------------------------------------------------
+Sun Jun 28 15:07:11 UTC 2026 - Matej Cepl <[email protected]>
+
+- update to 5.2.0:
+  - Support for Python 3.14
+  - Fixed invalid license classifier ( @jzerfowski, issues #83
+    and #84)
+  - Explicitly set language="c++" and add -lstdc++ to solve
+    linker problem on OpenSUSE
+  - Fix bug where compilation warnings for MSVC were not turned
+    into errors for CI testing
+  - Eliminate various static analysis warnings
+  - Removed support for Python 3.8
+- Add no-setuptools-scm.patch to remove the need of using
+  setuptools_scm, which doesn't work with GitHub tarballs
+- Remove upstreamed patch:
+  - opensuse-build.patch
+
+-------------------------------------------------------------------
+Fri Jun 26 14:04:39 UTC 2026 - Matej Cepl <[email protected]>
+
+- Add opensuse-build.patch fix build failure with Python 3.14 by
+  linking libstdc++. Explicitly set 'language="c++"' and add
+  '-lstdc++' to the linker arguments in setup.py via
+  opensuse-build.patch. This ensures that the compiled extension
+  module is properly linked against the standard C++ library on
+  Python 3.14, where the compiler toolchain incorrectly defaults
+  to gcc for linking, avoiding "undefined symbol" ImportError
+  failures during %check.
+
+-------------------------------------------------------------------

Old:
----
  fastnumbers-5.1.1.tar.gz

New:
----
  fastnumbers-5.2.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-fastnumbers.spec ++++++
--- /var/tmp/diff_new_pack.12MHJZ/_old  2026-07-07 21:00:24.672532530 +0200
+++ /var/tmp/diff_new_pack.12MHJZ/_new  2026-07-07 21:00:24.672532530 +0200
@@ -16,9 +16,8 @@
 #
 
 
-%{?sle15_python_module_pythons}
 Name:           python-fastnumbers
-Version:        5.1.1
+Version:        5.2.0
 Release:        0
 Summary:        Drop-in replacement for Python's int and float
 License:        MIT
@@ -27,22 +26,17 @@
 BuildRequires:  %{python_module devel}
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module setuptools >= 64}
-BuildRequires:  %{python_module setuptools-scm >= 8.0}
-BuildRequires:  %{python_module typing-extensions}
+BuildRequires:  %{python_module setuptools_scm}
 BuildRequires:  %{python_module wheel}
 BuildRequires:  fdupes
-BuildRequires:  python-rpm-macros
-%if 0%{?suse_version} <= 1500
-BuildRequires:  gcc13
-BuildRequires:  gcc13-c++
-%else
 BuildRequires:  gcc
 BuildRequires:  gcc-c++
-%endif
+BuildRequires:  python-rpm-macros
 # SECTION test requirements
 BuildRequires:  %{python_module hypothesis}
 BuildRequires:  %{python_module numpy}
-BuildRequires:  %{python_module pytest >= 5}
+BuildRequires:  %{python_module pytest}
+BuildRequires:  %{python_module typing_extensions}
 BuildRequires:  python3-testsuite
 # /SECTION
 %python_subpackages
@@ -63,11 +57,7 @@
 %autosetup -p1 -n fastnumbers-%{version}
 
 %build
-%if 0%{?suse_version} <= 1500
-export CC=gcc-13
-export CXX=g++-13
-%endif
-export CFLAGS="%{optflags} -Wno-error=return-type"
+export CFLAGS="%{optflags}"
 %pyproject_wheel
 
 %install

++++++ fastnumbers-5.1.1.tar.gz -> fastnumbers-5.2.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/.github/workflows/code-quality.yml 
new/fastnumbers-5.2.0/.github/workflows/code-quality.yml
--- old/fastnumbers-5.1.1/.github/workflows/code-quality.yml    2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/.github/workflows/code-quality.yml    2026-06-28 
18:20:28.000000000 +0200
@@ -15,12 +15,14 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Set up Python
-        uses: actions/setup-python@v5
+        uses: actions/setup-python@v6
         with:
-          python-version: 3.8
+          python-version: 3.9
 
       - name: Install deps
         run: python -m pip install ruff clang-format
@@ -33,12 +35,14 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Set up Python
-        uses: actions/setup-python@v5
+        uses: actions/setup-python@v6
         with:
-          python-version: 3.8
+          python-version: 3.9
 
       - name: Install ruff
         run: python -m pip install ruff
@@ -51,12 +55,14 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Set up Python
-        uses: actions/setup-python@v5
+        uses: actions/setup-python@v6
         with:
-          python-version: 3.8
+          python-version: 3.9
 
       - name: Install MyPy
         run: pip install mypy hypothesis pytest numpy
@@ -71,12 +77,14 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Set up Python
-        uses: actions/setup-python@v5
+        uses: actions/setup-python@v6
         with:
-          python-version: 3.8
+          python-version: 3.9
 
       - name: Install Validators
         run: python -m pip install twine build
@@ -96,12 +104,14 @@
 
     steps:
       - name: Checkout Code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
-      - name: Set up Python 3.12
-        uses: actions/setup-python@v5
+      - name: Set up Python 3.14
+        uses: actions/setup-python@v6
         with:
-          python-version: "3.12"
+          python-version: "3.14"
 
       - name: Install Dependencies
         run: |
@@ -109,7 +119,12 @@
           python -m pip install build
 
       - name: Set Environment
+        if: matrix.os != 'windows-latest'
         run: echo FN_WARNINGS_AS_ERRORS=1 >> $GITHUB_ENV
 
+      - name: Set Environment (Windows)
+        if: matrix.os == 'windows-latest'
+        run: echo FN_WARNINGS_AS_ERRORS=1 >> $env:GITHUB_ENV
+
       - name: Compile
         run: python -m build --wheel
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/.github/workflows/deploy.yml 
new/fastnumbers-5.2.0/.github/workflows/deploy.yml
--- old/fastnumbers-5.1.1/.github/workflows/deploy.yml  2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/.github/workflows/deploy.yml  2026-06-28 
18:20:28.000000000 +0200
@@ -10,48 +10,37 @@
   build:
     name: Build Wheels and Source Distributions
     runs-on: ${{ matrix.os }}
-    env:
-      CIBW_ARCHS_MACOS: "x86_64 universal2 arm64"
     strategy:
       matrix:
-        os: [ubuntu-latest, windows-latest, macos-latest]
-        arch: [auto]
-        include:
-        - os: ubuntu-latest
-          arch: aarch64
+        os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm, 
macos-15-intel, macos-latest]
 
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Set up Python
-        uses: actions/setup-python@v5
-
-      - uses: docker/setup-qemu-action@v2
-        if: ${{ matrix.arch == 'aarch64' }}
-        name: Set up QEMU
+        uses: actions/setup-python@v6
 
       - name: Install Dependencies
         run: |
           python -m pip install --upgrade pip
-          python -m pip install cibuildwheel==2.22.0
+          python -m pip install cibuildwheel==4.1.0
+
+      - name: Build Wheel
+        run: python -m cibuildwheel --output-dir dist
 
       - name: Build Source Distribution
-        if: matrix.os == 'ubuntu-latest' && matrix.arch != 'aarch64'
+        if: matrix.os == 'ubuntu-latest'
         run: |
           python -m pip install build
           python -m build --sdist
 
-      - name: Build Wheel
-        run: python -m cibuildwheel --output-dir dist
-        env:
-          CIBW_BUILD: "cp3*"
-          CIBW_ARCHS_LINUX: ${{matrix.arch}}
-
       - name: Save artifacts
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
-          name: distributions
+          name: distributions-${{ matrix.os }}
           path: dist/
           retention-days: 2
 
@@ -62,17 +51,19 @@
 
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Download artifacts
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v8
         with:
-          name: distributions
           path: dist/
+          merge-multiple: true
 
       - name: Publish to PyPI
         uses: pypa/gh-action-pypi-publish@release/v1
         with:
           user: __token__
           password: ${{ secrets.pypi_token_password }}
-          # skip_existing: true
+          skip_existing: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/.github/workflows/tests.yml 
new/fastnumbers-5.2.0/.github/workflows/tests.yml
--- old/fastnumbers-5.1.1/.github/workflows/tests.yml   2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/.github/workflows/tests.yml   2026-06-28 
18:20:28.000000000 +0200
@@ -15,16 +15,20 @@
     runs-on: ${{ matrix.os }}
     strategy:
       matrix:
-        python-version: [3.8, 3.9, "3.10", "3.11", "3.12", "3.13"]
+        python-version: [3.9, "3.10", "3.11", "3.12", "3.13", "3.14"]
         # Note, clang is used on macos, even though it says gcc
-        os: [ubuntu-latest, windows-latest, macos-latest]
+        # At the time of this writing windows-11.arm does not have all python 
version installed
+        # so we will skip it for now. ARM should be covered by ubuntu and 
macos.
+        os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, macos-15-intel, 
macos-latest]
 
     steps:
       - name: Checkout Code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v5
+        uses: actions/setup-python@v6
         with:
           python-version: ${{ matrix.python-version }}
 
@@ -61,7 +65,7 @@
 
       - name: Upload to CodeCov
         if: matrix.os == 'ubuntu-latest'
-        uses: codecov/codecov-action@v4
+        uses: codecov/codecov-action@v7
         with:
           token: ${{ secrets.CODECOV_TOKEN }}
           verbose: true
@@ -71,14 +75,16 @@
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        python-version: [3.8, 3.9, "3.10", "3.11", "3.12", "3.13"]
+        python-version: [3.9, "3.10", "3.11", "3.12", "3.13", "3.14"]
 
     steps:
       - name: Checkout Code
-        uses: actions/checkout@v4
+        uses: actions/checkout@v7
+        with:
+          persist-credentials: false
 
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v5
+        uses: actions/setup-python@v6
         with:
           python-version: ${{ matrix.python-version }}
 
@@ -89,35 +95,3 @@
 
       - name: Ensure Run Without Error
         run: python -c "import fastnumbers; 
print(fastnumbers.try_float('8.6'))"
-
-  tests_aarch64:
-    name: Tests on aarch64
-    strategy:
-      matrix:
-        pyver: [cp38-cp38, cp39-cp39, cp310-cp310, cp311-cp311, cp312-cp312, 
cp313-cp313]
-    runs-on: ubuntu-latest
-    env:
-      py: /opt/python/${{ matrix.pyver }}/bin/python
-      img: quay.io/pypa/manylinux2014_aarch64
-
-    steps:
-      - name: Checkout Code
-        uses: actions/checkout@v4
-
-      - name: Set up QEMU
-        id: qemu
-        uses: docker/setup-qemu-action@v2
-
-      - name: Run tests on aarch64
-        run: |
-          docker run --rm -v ${{ github.workspace }}:/ws:rw --workdir=/ws \
-          ${{ env.img }} \
-          bash -exc '${{ env.py }} -m venv .env && \
-          source .env/bin/activate && \
-          echo -e "\e[1;34m Install Dependencies \e[0m" && \
-          python -m pip install --upgrade pip && \
-          python -m pip install pytest pytest-faulthandler hypothesis 
typing_extensions numpy && \
-          echo -e "\e[1;34m Run Tests \e[0m" && \
-          python -m pip install --editable . && \
-          pytest --hypothesis-profile=fast && \
-          deactivate'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/CHANGELOG.md 
new/fastnumbers-5.2.0/CHANGELOG.md
--- old/fastnumbers-5.1.1/CHANGELOG.md  2024-12-15 07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/CHANGELOG.md  2026-06-28 18:20:28.000000000 +0200
@@ -1,6 +1,30 @@
 Unreleased
 ---
 
+[5.2.0] - 2026-06-27
+---
+
+### Added
+
+- Support for Python 3.14
+
+### Fixed
+
+- Fixed invalid license classifier (
+  [@jzerfowski](https://github.com/jzerfowski), issues
+  [#83](https://github.com/SethMMorton/fastnumbers/issues/83) and
+  [#84](https://github.com/SethMMorton/fastnumbers/pull/84))
+- Explicitly set `language="c++"` and add `-lstdc++` to solve linker
+  problem on OpenSUSE ([@mcepl](https://github.com/mcepl), issue
+  [#85](https://github.com/SethMMorton/fastnumbers/pull/85))
+- Fix bug where compilation warnings for MSVC were not turned into
+  errors for CI testing
+- Eliminate various static analysis warnings
+
+### Removed
+
+- Support for Python 3.8
+
 [5.1.1] - 2024-12-14
 ---
 
@@ -463,6 +487,7 @@
   - Initial release of `fastnumbers`
 
 <!---Comparison links-->
+[5.2.0]: https://github.com/SethMMorton/fastnumbers/compare/5.1.1...5.2.0
 [5.1.1]: https://github.com/SethMMorton/fastnumbers/compare/5.1.0...5.1.1
 [5.1.0]: https://github.com/SethMMorton/fastnumbers/compare/5.0.1...5.1.0
 [5.0.1]: https://github.com/SethMMorton/fastnumbers/compare/5.0.0...5.0.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/PKG-INFO 
new/fastnumbers-5.2.0/PKG-INFO
--- old/fastnumbers-5.1.1/PKG-INFO      2024-12-15 07:48:13.218529700 +0100
+++ new/fastnumbers-5.2.0/PKG-INFO      2026-06-28 18:26:13.936428800 +0200
@@ -1,9 +1,9 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: fastnumbers
-Version: 5.1.1
+Version: 5.2.0
 Summary: Super-fast and clean conversions to numbers.
 Author-email: "Seth M. Morton" <[email protected]>
-License: MIT
+License-Expression: MIT
 Project-URL: Homepage, https://github.com/SethMMorton/fastnumbers
 Project-URL: Documentation, https://fastnumbers.readthedocs.io/
 Project-URL: Issues, https://github.com/SethMMorton/fastnumbers/issues
@@ -16,26 +16,26 @@
 Classifier: Intended Audience :: System Administrators
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Operating System :: OS Independent
-Classifier: License :: OSI Approved :: MIT License
 Classifier: Natural Language :: English
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
 Classifier: Topic :: Scientific/Engineering :: Information Analysis
 Classifier: Topic :: Utilities
 Classifier: Topic :: Text Processing
 Classifier: Topic :: Text Processing :: Filters
-Requires-Python: >=3.8
+Requires-Python: >=3.9
 Description-Content-Type: text/x-rst
 License-File: LICENSE
 Provides-Extra: fast
 Requires-Dist: fastnumbers>=2.0.0; extra == "fast"
 Provides-Extra: icu
 Requires-Dist: PyICU>=1.0.0; extra == "icu"
+Dynamic: license-file
 
 fastnumbers
 ===========
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/docs/requirements.txt 
new/fastnumbers-5.2.0/docs/requirements.txt
--- old/fastnumbers-5.1.1/docs/requirements.txt 2024-12-15 07:48:07.000000000 
+0100
+++ new/fastnumbers-5.2.0/docs/requirements.txt 2026-06-28 18:20:28.000000000 
+0200
@@ -12,29 +12,29 @@
     # via
     #   sphinx
     #   sphinx-rtd-theme
-idna==3.10
+idna==3.15
     # via requests
 imagesize==1.4.1
     # via sphinx
-jinja2==3.1.4
+jinja2==3.1.6
     # via sphinx
 markupsafe==3.0.1
     # via jinja2
 packaging==24.1
     # via sphinx
-pygments==2.18.0
+pygments==2.20.0
     # via sphinx
-requests==2.32.3
+requests==2.33.0
     # via sphinx
 snowballstemmer==2.2.0
     # via sphinx
 sphinx==8.1.1
     # via
-    #   -r docs/requirements.in
+    #   -r requirements.in
     #   sphinx-rtd-theme
     #   sphinxcontrib-jquery
 sphinx-rtd-theme==3.0.1
-    # via -r docs/requirements.in
+    # via -r requirements.in
 sphinxcontrib-applehelp==2.0.0
     # via sphinx
 sphinxcontrib-devhelp==2.0.0
@@ -49,7 +49,5 @@
     # via sphinx
 sphinxcontrib-serializinghtml==2.0.0
     # via sphinx
-tomli==2.0.2
-    # via sphinx
-urllib3==2.2.3
+urllib3==2.7.0
     # via requests
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/include/fastnumbers/extractor.hpp 
new/fastnumbers-5.2.0/include/fastnumbers/extractor.hpp
--- old/fastnumbers-5.1.1/include/fastnumbers/extractor.hpp     2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/include/fastnumbers/extractor.hpp     2026-06-28 
18:20:28.000000000 +0200
@@ -19,6 +19,6 @@
  *                specified by the user.
  * \return std::variant of CharacterParser, UnicodeParser, or NumericParser
  */
-AnyParser
-extract_parser(PyObject* obj, Buffer& buffer, const UserOptions& options) 
noexcept(false
-);
+AnyParser extract_parser(
+    PyObject* obj, Buffer& buffer, const UserOptions& options
+) noexcept(false);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastnumbers-5.1.1/include/fastnumbers/implementation.hpp 
new/fastnumbers-5.2.0/include/fastnumbers/implementation.hpp
--- old/fastnumbers-5.1.1/include/fastnumbers/implementation.hpp        
2024-12-15 07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/include/fastnumbers/implementation.hpp        
2026-06-28 18:20:28.000000000 +0200
@@ -205,16 +205,18 @@
      * \param selector The python object to validate
      * \throws fastnumbers_exception if not one of the four valid values
      */
-    void validate_allow_disallow_str_only_num_only(const PyObject* selector) 
const
-        noexcept(false);
+    void validate_allow_disallow_str_only_num_only(
+        const PyObject* selector
+    ) const noexcept(false);
 
     /**
      * \brief Validate the selector is not a "yes, no, num, str" value
      * \param selector The python object to validate
      * \throws fastnumbers_exception if one of the four valid values
      */
-    void validate_not_allow_disallow_str_only_num_only(const PyObject* 
selector) const
-        noexcept(false);
+    void validate_not_allow_disallow_str_only_num_only(
+        const PyObject* selector
+    ) const noexcept(false);
 
     /**
      * \brief Validate the selector is not "DISALLOWED"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastnumbers-5.1.1/include/fastnumbers/parser/base.hpp 
new/fastnumbers-5.2.0/include/fastnumbers/parser/base.hpp
--- old/fastnumbers-5.1.1/include/fastnumbers/parser/base.hpp   2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/include/fastnumbers/parser/base.hpp   2026-06-28 
18:20:28.000000000 +0200
@@ -84,10 +84,9 @@
      * \param force_int Force the output to integer (takes precidence)
      * \param coerce Return as integer if the float is int-like
      */
-    virtual RawPayload<PyObject*>
-    as_pyfloat(const bool force_int = false, const bool coerce = false) const
-        noexcept(false)
-        = 0;
+    virtual RawPayload<PyObject*> as_pyfloat(
+        const bool force_int = false, const bool coerce = false
+    ) const noexcept(false) = 0;
 
     /// Check the type of the number.
     virtual NumberFlags get_number_type() const noexcept { return 
m_number_type; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastnumbers-5.1.1/include/fastnumbers/parser/character.hpp 
new/fastnumbers-5.2.0/include/fastnumbers/parser/character.hpp
--- old/fastnumbers-5.1.1/include/fastnumbers/parser/character.hpp      
2024-12-15 07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/include/fastnumbers/parser/character.hpp      
2026-06-28 18:20:28.000000000 +0200
@@ -45,9 +45,9 @@
      * \param force_int Force the output to integer (takes precidence)
      * \param coerce Return as integer if the float is int-like
      */
-    RawPayload<PyObject*>
-    as_pyfloat(const bool force_int = false, const bool coerce = false) const
-        noexcept(false) override;
+    RawPayload<PyObject*> as_pyfloat(
+        const bool force_int = false, const bool coerce = false
+    ) const noexcept(false) override;
 
     /// Check the type of the number.
     NumberFlags get_number_type() const noexcept override;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastnumbers-5.1.1/include/fastnumbers/parser/numeric.hpp 
new/fastnumbers-5.2.0/include/fastnumbers/parser/numeric.hpp
--- old/fastnumbers-5.1.1/include/fastnumbers/parser/numeric.hpp        
2024-12-15 07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/include/fastnumbers/parser/numeric.hpp        
2026-06-28 18:20:28.000000000 +0200
@@ -59,9 +59,9 @@
      * \param force_int Force the output to integer (takes precidence)
      * \param coerce Return as integer if the float is int-like
      */
-    RawPayload<PyObject*>
-    as_pyfloat(const bool force_int = false, const bool coerce = false) const
-        noexcept(false) override
+    RawPayload<PyObject*> as_pyfloat(
+        const bool force_int = false, const bool coerce = false
+    ) const noexcept(false) override
     {
         if (get_number_type() == 
static_cast<NumberFlags>(NumberType::INVALID)) {
             return ErrorType::TYPE_ERROR;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastnumbers-5.1.1/include/fastnumbers/parser/unicode.hpp 
new/fastnumbers-5.2.0/include/fastnumbers/parser/unicode.hpp
--- old/fastnumbers-5.1.1/include/fastnumbers/parser/unicode.hpp        
2024-12-15 07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/include/fastnumbers/parser/unicode.hpp        
2026-06-28 18:20:28.000000000 +0200
@@ -54,9 +54,9 @@
      * \param force_int Force the output to integer (takes precidence)
      * \param coerce Return as integer if the float is int-like
      */
-    RawPayload<PyObject*>
-    as_pyfloat(const bool force_int = false, const bool coerce = false) const
-        noexcept(false) override
+    RawPayload<PyObject*> as_pyfloat(
+        const bool force_int = false, const bool coerce = false
+    ) const noexcept(false) override
     {
         const NumberFlags ntype = get_number_type();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/profiling/profile.py 
new/fastnumbers-5.2.0/profiling/profile.py
--- old/fastnumbers-5.1.1/profiling/profile.py  2024-12-15 07:48:07.000000000 
+0100
+++ new/fastnumbers-5.2.0/profiling/profile.py  2026-06-28 18:20:28.000000000 
+0200
@@ -248,7 +248,7 @@
         return x
     else:
         b = int(a)
-        return b if a == b else b
+        return b if a == b else a
 
 
 def forceint_re(
@@ -274,29 +274,28 @@
             return x
 
 
-if sys.version_info >= (3, 9):
-
-    def forceint_denoise(
-        x, _decimal=decimal.Decimal, ceil=math.ceil, log10=math.log10, 
ulp=math.ulp
-    ):
-        """Noiselessly convert a float to an integer."""
+def forceint_denoise(
+    x, _decimal=decimal.Decimal, ceil=math.ceil, log10=math.log10, ulp=math.ulp
+):
+    """Noiselessly convert a float to an integer."""
+    try:
+        # Integer method
+        int_val = int(x)
+        if x == int_val:
+            return int_val
+        double_digits = ceil(log10(ulp(abs(x))))
+        return round(int_val, -int(double_digits))
+    except (TypeError, ValueError):
+        # String method
         try:
-            # Integer method
-            int_val = int(x)
-            if x == int_val:
-                return int_val
-            double_digits = ceil(log10(ulp(abs(x))))
-            return round(int_val, -int(double_digits))
-        except (TypeError, ValueError):
-            # String method
-            try:
-                return int(_decimal(x))
-            except decimal.InvalidOperation as e:
-                raise TypeError from e
-
-    def forceint_denoise_fn(x, try_forceint=fastnumbers.try_forceint):
-        """Noiselessly convert a float to an integer using fastnumbers."""
-        return try_forceint(x, denoise=True)
+            return int(_decimal(x))
+        except decimal.InvalidOperation as e:
+            raise TypeError from e
+
+
+def forceint_denoise_fn(x, try_forceint=fastnumbers.try_forceint):
+    """Noiselessly convert a float to an integer using fastnumbers."""
+    return try_forceint(x, denoise=True)
 
 
 def check_int_re(x, int_match=re.compile(r"[-+]?\d+$").match):
@@ -452,18 +451,16 @@
 )
 timer.time_functions()
 
-if sys.version_info >= (3, 9):
-    timer = Timer(
-        "Timing comparison of forced `int` functions with error handling "
-        "and denoising"
-    )
-    timer.add_function(
-        "forceint_denoise", "Python", "from __main__ import forceint_denoise"
-    )
-    timer.add_function(
-        "forceint_denoise_fn", "fastnumbers", "from __main__ import 
forceint_denoise_fn"
-    )
-    timer.time_functions()
+timer = Timer(
+    "Timing comparison of forced `int` functions with error handling and 
denoising"
+)
+timer.add_function(
+    "forceint_denoise", "Python", "from __main__ import forceint_denoise"
+)
+timer.add_function(
+    "forceint_denoise_fn", "fastnumbers", "from __main__ import 
forceint_denoise_fn"
+)
+timer.time_functions()
 
 timer = Timer("Timing comparison to check if value can be converted to `int`")
 timer.add_function("check_int_try", "try/except", "from __main__ import 
check_int_try")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/pyproject.toml 
new/fastnumbers-5.2.0/pyproject.toml
--- old/fastnumbers-5.1.1/pyproject.toml        2024-12-15 07:48:07.000000000 
+0100
+++ new/fastnumbers-5.2.0/pyproject.toml        2026-06-28 18:20:28.000000000 
+0200
@@ -8,10 +8,10 @@
     {name = "Seth M. Morton", email = "[email protected]"},
 ]
 dynamic = ["version"]
-requires-python = ">=3.8"
+requires-python = ">=3.9"
 description = "Super-fast and clean conversions to numbers."
 readme = "README.rst"
-license = {text = "MIT"}
+license = "MIT"
 keywords = ["conversion", "numeric", "performance"]
 classifiers = [
        "Development Status :: 5 - Production/Stable",
@@ -21,15 +21,14 @@
        "Intended Audience :: System Administrators",
        "Intended Audience :: Financial and Insurance Industry",
        "Operating System :: OS Independent",
-       "License :: OSI Approved :: MIT License",
        "Natural Language :: English",
        "Programming Language :: Python :: 3",
-       "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3.11",
        "Programming Language :: Python :: 3.12",
        "Programming Language :: Python :: 3.13",
+       "Programming Language :: Python :: 3.14",
        "Topic :: Scientific/Engineering :: Information Analysis",
        "Topic :: Utilities",
        "Topic :: Text Processing",
@@ -51,13 +50,12 @@
 
 [tool.mypy]
 mypy_path = "mypy_stubs"
-plugins = "numpy.typing.mypy_plugin"
 
 [tool.pytest.ini_options]
 addopts = "--tb=short"
 
 [tool.ruff]
-target-version = "py38"
+target-version = "py39"
 extend-exclude = ["build", "dist", "docs", "_version.py"]
 
 [tool.ruff.format]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/setup.py 
new/fastnumbers-5.2.0/setup.py
--- old/fastnumbers-5.1.1/setup.py      2024-12-15 07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/setup.py      2026-06-28 18:20:28.000000000 +0200
@@ -9,7 +9,7 @@
 from setuptools import Extension, setup
 
 # Compilation arguments are platform-dependent
-link_args = ["-lm"]
+link_args = ["-lm", "-lstdc++"]
 if sys.platform == "win32":
     compile_args = [
         "/std:c++17",
@@ -48,6 +48,7 @@
         include_dirs=[str(pathlib.Path("include").resolve())],
         extra_compile_args=compile_args,
         extra_link_args=link_args,
+        language="c++",
     )
 ]
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/src/cpp/c_str_parsing.cpp 
new/fastnumbers-5.2.0/src/cpp/c_str_parsing.cpp
--- old/fastnumbers-5.1.1/src/cpp/c_str_parsing.cpp     2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/src/cpp/c_str_parsing.cpp     2026-06-28 
18:20:28.000000000 +0200
@@ -196,8 +196,10 @@
             }
         }
         // No underscore in the base selector, e.g. 0_b0 is invalid.
-        else if ((len - i) > 2 && str[i] == '0' && str[i + 1] == '_'
-                 && is_base_prefix(str[i + 2])) {
+        else if (
+            (len - i) > 2 && str[i] == '0' && str[i + 1] == '_'
+            && is_base_prefix(str[i + 2])
+        ) {
             i += 3;
         }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/src/cpp/implementation.cpp 
new/fastnumbers-5.2.0/src/cpp/implementation.cpp
--- old/fastnumbers-5.1.1/src/cpp/implementation.cpp    2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/src/cpp/implementation.cpp    2026-06-28 
18:20:28.000000000 +0200
@@ -138,8 +138,8 @@
     );
 }
 
-Implementation::Types Implementation::resolve_types(const NumberFlags& flags
-) const noexcept
+Implementation::Types
+Implementation::resolve_types(const NumberFlags& flags) const noexcept
 {
     // Build up the logic with individual "Boolean chunks"
     const bool from_str = bool(flags & (NumberType::FromStr | 
NumberType::FromUni));
@@ -161,7 +161,8 @@
                        && flags & NumberType::IntLike };
 }
 
-void Implementation::validate_allow_disallow_str_only_num_only(const PyObject* 
selector
+void Implementation::validate_allow_disallow_str_only_num_only(
+    const PyObject* selector
 ) const noexcept(false)
 {
     const bool ok = selector == Selectors::ALLOWED || selector == 
Selectors::DISALLOWED
@@ -190,14 +191,16 @@
     }
 }
 
-void Implementation::validate_not_disallow(const PyObject* selector) const
-    noexcept(false)
+void Implementation::validate_not_disallow(const PyObject* selector) const 
noexcept(
+    false
+)
 {
     const bool bad = selector == Selectors::DISALLOWED
         || selector == Selectors::STRING_ONLY || selector == 
Selectors::NUMBER_ONLY;
     if (bad) {
-        throw fastnumbers_exception("'inf' and 'nan' cannot be 
fastnumbers.DISALLOWED, "
-                                    "fastnumbers.STRING_ONLY, or 
fastnumbers.NUMBER_ONLY"
+        throw fastnumbers_exception(
+            "'inf' and 'nan' cannot be fastnumbers.DISALLOWED, "
+            "fastnumbers.STRING_ONLY, or fastnumbers.NUMBER_ONLY"
         );
     }
 }
@@ -434,8 +437,8 @@
  * \param selector The python object to validate
  * \throws fastnumbers_exception if one of the four valid values
  */
-static inline void
-validate_not_allow_disallow_str_only_num_only_input(const PyObject* selector
+static inline void validate_not_allow_disallow_str_only_num_only_input(
+    const PyObject* selector
 ) noexcept(false)
 {
     const bool bad = selector == Selectors::ALLOWED || selector == 
Selectors::DISALLOWED
@@ -455,8 +458,8 @@
  * \param selector The python object to validate
  * \throws fastnumbers_exception if one of the four valid values
  */
-static inline void validate_not_disallow_str_only_num_only_input(const 
PyObject* selector
-) noexcept(false)
+static inline void
+validate_not_disallow_str_only_num_only_input(const PyObject* selector) 
noexcept(false)
 {
     const bool bad = selector == Selectors::DISALLOWED
         || selector == Selectors::NUMBER_ONLY || selector == 
Selectors::STRING_ONLY
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/src/cpp/parser.cpp 
new/fastnumbers-5.2.0/src/cpp/parser.cpp
--- old/fastnumbers-5.1.1/src/cpp/parser.cpp    2024-12-15 07:48:07.000000000 
+0100
+++ new/fastnumbers-5.2.0/src/cpp/parser.cpp    2026-06-28 18:20:28.000000000 
+0200
@@ -372,9 +372,9 @@
     return PyLong_FromString(m_start_orig, nullptr, options().get_base());
 }
 
-RawPayload<PyObject*>
-CharacterParser::as_pyfloat(const bool force_int, const bool coerce) const
-    noexcept(false)
+RawPayload<PyObject*> CharacterParser::as_pyfloat(
+    const bool force_int, const bool coerce
+) const noexcept(false)
 {
     // If denoise is requested, use this algorithm *instead* of converting to 
a double
     if (options().do_denoise() && (force_int || coerce)) {
@@ -384,9 +384,9 @@
         } else if (checker.is_invalid() && has_valid_underscores()) {
             Buffer buffer(m_start, m_str_len);
             buffer.remove_valid_underscores(options().get_base() != 10);
-            StringChecker checker(buffer.start(), buffer.end(), 
options().get_base());
-            if (checker.is_intlike_float()) {
-                return Parser::float_as_int_without_noise(checker, 
is_negative());
+            StringChecker checker_(buffer.start(), buffer.end(), 
options().get_base());
+            if (checker_.is_intlike_float()) {
+                return Parser::float_as_int_without_noise(checker_, 
is_negative());
             }
         }
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/src/fastnumbers/__init__.py 
new/fastnumbers-5.2.0/src/fastnumbers/__init__.py
--- old/fastnumbers-5.1.1/src/fastnumbers/__init__.py   2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/src/fastnumbers/__init__.py   2026-06-28 
18:20:28.000000000 +0200
@@ -64,7 +64,8 @@
 # Hide all type checking code at runtime behind this gate
 if TYPE_CHECKING:
     import array
-    from typing import Any, Callable, Iterable, NewType, TypeVar, overload
+    from collections.abc import Iterable
+    from typing import Any, Callable, NewType, TypeVar, overload
 
     IntT = TypeVar("IntT", np.int_)
     FloatT = TypeVar("FloatT", np.float64)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/src/fastnumbers/_version.py 
new/fastnumbers-5.2.0/src/fastnumbers/_version.py
--- old/fastnumbers-5.1.1/src/fastnumbers/_version.py   2024-12-15 
07:48:13.000000000 +0100
+++ new/fastnumbers-5.2.0/src/fastnumbers/_version.py   2026-06-28 
18:26:13.000000000 +0200
@@ -1,16 +1,24 @@
-# file generated by setuptools_scm
+# file generated by vcs-versioning
 # don't change, don't track in version control
-TYPE_CHECKING = False
-if TYPE_CHECKING:
-    from typing import Tuple, Union
-    VERSION_TUPLE = Tuple[Union[int, str], ...]
-else:
-    VERSION_TUPLE = object
+from __future__ import annotations
+
+__all__ = [
+    "__version__",
+    "__version_tuple__",
+    "version",
+    "version_tuple",
+    "__commit_id__",
+    "commit_id",
+]
 
 version: str
 __version__: str
-__version_tuple__: VERSION_TUPLE
-version_tuple: VERSION_TUPLE
+__version_tuple__: tuple[int | str, ...]
+version_tuple: tuple[int | str, ...]
+commit_id: str | None
+__commit_id__: str | None
+
+__version__ = version = '5.2.0'
+__version_tuple__ = version_tuple = (5, 2, 0)
 
-__version__ = version = '5.1.1'
-__version_tuple__ = version_tuple = (5, 1, 1)
+__commit_id__ = commit_id = 'g5032b586f'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/src/fastnumbers/fastnumbers.pyi 
new/fastnumbers-5.2.0/src/fastnumbers/fastnumbers.pyi
--- old/fastnumbers-5.1.1/src/fastnumbers/fastnumbers.pyi       2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/src/fastnumbers/fastnumbers.pyi       2026-06-28 
18:20:28.000000000 +0200
@@ -1,12 +1,10 @@
 from builtins import float as pyfloat
 from builtins import int as pyint
+from collections.abc import Iterable, Iterator, Sequence
 from typing import (
     Any,
     Callable,
-    Iterable,
-    Iterator,
     Literal,
-    Sequence,
     TypeVar,
     overload,
 )
@@ -27,13 +25,21 @@
     def __float__(self) -> pyfloat: ...
 
 InputType: TypeAlias = (
-    pyint | pyfloat | ItWillFloat | HasIndex | HasInt | str | bytes | bytearray
+    pyint
+    | pyfloat
+    | ItWillFloat
+    | HasIndex
+    | HasInt
+    | str
+    | bytes
+    | bytearray
+    | memoryview[pyint]
 )
 AnyInputType = TypeVar("AnyInputType")
 QueryInputType = TypeVar("QueryInputType")
 
 NumInputType = TypeVar("NumInputType", pyint, pyfloat, ItWillFloat, HasIndex, 
HasInt)
-StrInputType = TypeVar("StrInputType", str, bytes, bytearray)
+StrInputType = TypeVar("StrInputType", str, bytes, bytearray | 
memoryview[pyint])
 IntBaseType = TypeVar("IntBaseType", pyint, HasIndex)
 
 ConsiderType: TypeAlias = STRING_ONLY_T | NUMBER_ONLY_T | None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/src/fastnumbers.egg-info/PKG-INFO 
new/fastnumbers-5.2.0/src/fastnumbers.egg-info/PKG-INFO
--- old/fastnumbers-5.1.1/src/fastnumbers.egg-info/PKG-INFO     2024-12-15 
07:48:13.000000000 +0100
+++ new/fastnumbers-5.2.0/src/fastnumbers.egg-info/PKG-INFO     2026-06-28 
18:26:13.000000000 +0200
@@ -1,9 +1,9 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: fastnumbers
-Version: 5.1.1
+Version: 5.2.0
 Summary: Super-fast and clean conversions to numbers.
 Author-email: "Seth M. Morton" <[email protected]>
-License: MIT
+License-Expression: MIT
 Project-URL: Homepage, https://github.com/SethMMorton/fastnumbers
 Project-URL: Documentation, https://fastnumbers.readthedocs.io/
 Project-URL: Issues, https://github.com/SethMMorton/fastnumbers/issues
@@ -16,26 +16,26 @@
 Classifier: Intended Audience :: System Administrators
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Operating System :: OS Independent
-Classifier: License :: OSI Approved :: MIT License
 Classifier: Natural Language :: English
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
 Classifier: Topic :: Scientific/Engineering :: Information Analysis
 Classifier: Topic :: Utilities
 Classifier: Topic :: Text Processing
 Classifier: Topic :: Text Processing :: Filters
-Requires-Python: >=3.8
+Requires-Python: >=3.9
 Description-Content-Type: text/x-rst
 License-File: LICENSE
 Provides-Extra: fast
 Requires-Dist: fastnumbers>=2.0.0; extra == "fast"
 Provides-Extra: icu
 Requires-Dist: PyICU>=1.0.0; extra == "icu"
+Dynamic: license-file
 
 fastnumbers
 ===========
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastnumbers-5.1.1/src/fastnumbers.egg-info/SOURCES.txt 
new/fastnumbers-5.2.0/src/fastnumbers.egg-info/SOURCES.txt
--- old/fastnumbers-5.1.1/src/fastnumbers.egg-info/SOURCES.txt  2024-12-15 
07:48:13.000000000 +0100
+++ new/fastnumbers-5.2.0/src/fastnumbers.egg-info/SOURCES.txt  2026-06-28 
18:26:13.000000000 +0200
@@ -79,6 +79,8 @@
 src/fastnumbers.egg-info/SOURCES.txt
 src/fastnumbers.egg-info/dependency_links.txt
 src/fastnumbers.egg-info/requires.txt
+src/fastnumbers.egg-info/scm_file_list.json
+src/fastnumbers.egg-info/scm_version.json
 src/fastnumbers.egg-info/top_level.txt
 tests/builtin_grammar.py
 tests/builtin_support.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastnumbers-5.1.1/src/fastnumbers.egg-info/scm_file_list.json 
new/fastnumbers-5.2.0/src/fastnumbers.egg-info/scm_file_list.json
--- old/fastnumbers-5.1.1/src/fastnumbers.egg-info/scm_file_list.json   
1970-01-01 01:00:00.000000000 +0100
+++ new/fastnumbers-5.2.0/src/fastnumbers.egg-info/scm_file_list.json   
2026-06-28 18:26:13.000000000 +0200
@@ -0,0 +1,88 @@
+{
+  "files": [
+    "RELEASING.md",
+    "setup.cfg",
+    "tox.ini",
+    "LICENSE",
+    "setup.py",
+    "pyproject.toml",
+    "CHANGELOG.md",
+    "CONTRIBUTING.md",
+    "README.rst",
+    "codecov.yml",
+    ".gitignore",
+    ".readthedocs.yaml",
+    "CODE_OF_CONDUCT.md",
+    "docs/requirements.txt",
+    "docs/requirements.in",
+    "docs/source/timing.rst",
+    "docs/source/index.rst",
+    "docs/source/changelog.rst",
+    "docs/source/api.rst",
+    "docs/source/conf.py",
+    "src/cpp/fastnumbers.cpp",
+    "src/cpp/extractor.cpp",
+    "src/cpp/implementation.cpp",
+    "src/cpp/argparse.cpp",
+    "src/cpp/parser.cpp",
+    "src/cpp/c_str_parsing.cpp",
+    "src/fastnumbers/py.typed",
+    "src/fastnumbers/__init__.py",
+    "src/fastnumbers/fastnumbers.pyi",
+    "mypy_stubs/setuptools_scm.pyi",
+    "profiling/README.md",
+    "profiling/results-3.9.md",
+    "profiling/profile.py",
+    "profiling/results-3.8.md",
+    "profiling/results-3.10.md",
+    "profiling/results-3.12.md",
+    "profiling/results-3.7.md",
+    "profiling/results-3.11.md",
+    "include/fastnumbers/extractor.hpp",
+    "include/fastnumbers/ctype_extractor.hpp",
+    "include/fastnumbers/implementation.hpp",
+    "include/fastnumbers/iteration.hpp",
+    "include/fastnumbers/helpers.hpp",
+    "include/fastnumbers/docstrings.hpp",
+    "include/fastnumbers/payload.hpp",
+    "include/fastnumbers/buffer.hpp",
+    "include/fastnumbers/c_str_parsing.hpp",
+    "include/fastnumbers/parser.hpp",
+    "include/fastnumbers/resolver.hpp",
+    "include/fastnumbers/argparse.hpp",
+    "include/fastnumbers/exception.hpp",
+    "include/fastnumbers/evaluator.hpp",
+    "include/fastnumbers/selectors.hpp",
+    "include/fastnumbers/user_options.hpp",
+    "include/fastnumbers/introspection.hpp",
+    "include/fastnumbers/compatibility.hpp",
+    "include/fastnumbers/third_party/fast_float.h",
+    "include/fastnumbers/third_party/EnumClass.h",
+    "include/fastnumbers/third_party/ipow.hpp",
+    "include/fastnumbers/parser/base.hpp",
+    "include/fastnumbers/parser/numeric.hpp",
+    "include/fastnumbers/parser/character.hpp",
+    "include/fastnumbers/parser/unicode.hpp",
+    "dev/README.md",
+    "dev/clang-format.cfg",
+    "dev/test-runner.py",
+    "dev/formatting.py",
+    "dev/clean.py",
+    "dev/patch-doctest.py",
+    "dev/bump.py",
+    "tests/test_array.py",
+    "tests/test_fastnumbers_examples.py",
+    "tests/test_builtin_float.py",
+    "tests/test_builtin_int.py",
+    "tests/conftest.py",
+    "tests/builtin_support.py",
+    "tests/builtin_grammar.py",
+    "tests/test_fastnumbers.py",
+    ".github/ISSUE_TEMPLATE/question.md",
+    ".github/ISSUE_TEMPLATE/bug_report.md",
+    ".github/ISSUE_TEMPLATE/feature_request.md",
+    ".github/workflows/code-quality.yml",
+    ".github/workflows/tests.yml",
+    ".github/workflows/deploy.yml"
+  ]
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastnumbers-5.1.1/src/fastnumbers.egg-info/scm_version.json 
new/fastnumbers-5.2.0/src/fastnumbers.egg-info/scm_version.json
--- old/fastnumbers-5.1.1/src/fastnumbers.egg-info/scm_version.json     
1970-01-01 01:00:00.000000000 +0100
+++ new/fastnumbers-5.2.0/src/fastnumbers.egg-info/scm_version.json     
2026-06-28 18:26:13.000000000 +0200
@@ -0,0 +1,8 @@
+{
+  "tag": "5.2.0",
+  "distance": 0,
+  "node": "g5032b586faafde12dd9a8766be6f923be83131c3",
+  "dirty": false,
+  "branch": "HEAD",
+  "node_date": "2026-06-28"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/tests/builtin_support.py 
new/fastnumbers-5.2.0/tests/builtin_support.py
--- old/fastnumbers-5.1.1/tests/builtin_support.py      2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/tests/builtin_support.py      2026-06-28 
18:20:28.000000000 +0200
@@ -21,7 +21,7 @@
     def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
         def inner(*args: Any, **kwds: Any) -> Any:
             try:
-                import locale
+                import locale  # noqa: PLC0415
 
                 category = getattr(locale, catstr)
                 orig_locale = locale.setlocale(category)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/tests/test_array.py 
new/fastnumbers-5.2.0/tests/test_array.py
--- old/fastnumbers-5.1.1/tests/test_array.py   2024-12-15 07:48:07.000000000 
+0100
+++ new/fastnumbers-5.2.0/tests/test_array.py   2026-06-28 18:20:28.000000000 
+0200
@@ -2,7 +2,7 @@
 
 import array
 import ctypes
-from typing import Any, Callable, Iterator, NoReturn
+from typing import TYPE_CHECKING, Any, Callable, NoReturn, TypedDict
 
 import numpy as np
 import pytest
@@ -15,10 +15,12 @@
     lists,
     text,
 )
-from typing_extensions import TypedDict
 
 import fastnumbers
 
+if TYPE_CHECKING:
+    from collections.abc import Iterator
+
 # Map supported data types to the Python array internal format designator
 formats = {
     "signed char": "b",
@@ -334,7 +336,7 @@
         result = array.array(formats[data_type], [0])
         expected = "bad operand type for abs()"
         with pytest.raises(TypeError, match=expected):
-            fastnumbers.try_array(given, result, on_fail=lambda x: abs(x))
+            fastnumbers.try_array(given, result, on_fail=abs)
 
     @pytest.mark.parametrize("data_type", int_data_types)
     def test_replacements_trigger_new_values_for_int(self, data_type: str) -> 
None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/tests/test_builtin_float.py 
new/fastnumbers-5.2.0/tests/test_builtin_float.py
--- old/fastnumbers-5.1.1/tests/test_builtin_float.py   2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/tests/test_builtin_float.py   2026-06-28 
18:20:28.000000000 +0200
@@ -103,7 +103,9 @@
         class CustomByteArray(bytearray):
             pass
 
-        factories: list[Callable[[bytes], bytes | bytearray | str]] = [
+        factories: list[
+            Callable[[bytes], bytes | bytearray | str | 
memoryview[builtins.int]]
+        ] = [
             bytes,
             bytearray,
             lambda b: CustomStr(b.decode()),
@@ -112,7 +114,7 @@
             memoryview,
         ]
         try:
-            from array import array
+            from array import array  # noqa: PLC0415
         except ImportError:
             pass
         else:
@@ -173,7 +175,7 @@
         # set locale to something that doesn't use '.' for the decimal point
         # float must not accept the locale specific decimal point but
         # it still has to accept the normal python syntax
-        import locale
+        import locale  # noqa: PLC0415
 
         if locale.localeconv()["decimal_point"] != ",":
             self.skipTest('decimal_point is not ","')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/tests/test_builtin_int.py 
new/fastnumbers-5.2.0/tests/test_builtin_int.py
--- old/fastnumbers-5.1.1/tests/test_builtin_int.py     2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/tests/test_builtin_int.py     2026-06-28 
18:20:28.000000000 +0200
@@ -317,7 +317,9 @@
         class CustomByteArray(bytearray):
             pass
 
-        factories: list[Callable[[bytes], bytes | bytearray | str]] = [
+        factories: list[
+            Callable[[bytes], bytes | bytearray | str | 
memoryview[builtins.int]]
+        ] = [
             bytes,
             bytearray,
             lambda b: CustomStr(b.decode()),
@@ -326,7 +328,7 @@
             memoryview,
         ]
         try:
-            from array import array
+            from array import array  # noqa: PLC0415
         except ImportError:
             pass
         else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/tests/test_fastnumbers.py 
new/fastnumbers-5.2.0/tests/test_fastnumbers.py
--- old/fastnumbers-5.1.1/tests/test_fastnumbers.py     2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/tests/test_fastnumbers.py     2026-06-28 
18:20:28.000000000 +0200
@@ -8,11 +8,11 @@
 from functools import partial
 from itertools import combinations
 from typing import (
+    TYPE_CHECKING,
     Any,
     Callable,
-    Iterable,
-    Iterator,
     NoReturn,
+    Protocol,
     Union,
     cast,
 )
@@ -32,10 +32,12 @@
     text,
     tuples,
 )
-from typing_extensions import Protocol
 
 import fastnumbers
 
+if TYPE_CHECKING:
+    from collections.abc import Iterable, Iterator
+
 parametrize = pytest.mark.parametrize
 
 
@@ -320,7 +322,7 @@
 
 
 def capture_result(  # type: ignore [no-untyped-def]
-    func: ConversionFuncs | IdentificationFuncs, *args, **kwargs
+    func: Any, *args, **kwargs
 ) -> Any:
     """Execute a function, and either return the result or the exception 
message"""
     try:
@@ -518,7 +520,7 @@
     def test_selectors_have_no_type(self, x: object) -> None:
         assert type(x) is object
 
-    @parametrize("a, b", combinations(selectors, 2))
+    @parametrize("a, b", list(combinations(selectors, 2)))
     def test_selectors_are_mutually_exclusive(self, a: object, b: object) -> 
None:
         assert a is not b
 
@@ -725,8 +727,8 @@
             ),
         ]
     for old3, new3 in check_pairs[:2]:
-        old = cast(Union[IsReal, IsFloat], old3)
-        new = cast(Union[CheckReal, CheckFloat], new3)
+        old = cast("IsReal | IsFloat", old3)
+        new = cast("CheckReal | CheckFloat", new3)
         old_to_new_checking_pairing += [
             (partial(old, allow_inf=True), partial(new, 
inf=fastnumbers.ALLOWED)),
             (partial(old, allow_inf=False), partial(new, 
inf=fastnumbers.NUMBER_ONLY)),
@@ -942,7 +944,7 @@
     ]
 
     @given(integers())
-    @example(int(10 * 300))
+    @example(10 * 300)
     @parametrize("func", get_funcs(funcs), ids=funcs)
     def test_given_int_returns_int(
         self, func: TryReal | TryInt | TryForceInt, x: int
@@ -2001,7 +2003,7 @@
             msg = "Fëanor"
             raise ValueError(msg)
 
-        with pytest.raises(ValueError, match="Fëanor"):  # noqa: PT012
+        with pytest.raises(ValueError, match="Fëanor"):
             for _ in func(broken()):
                 pass
 
@@ -2018,8 +2020,8 @@
         "iterable_gen",
         [
             list,
-            lambda: (),
-            lambda: set(),
+            tuple,
+            set,
             lambda: iter([]),
             lambda: (x for x in []),  # type: ignore [var-annotated]
         ],
@@ -2044,8 +2046,8 @@
         "iterable_gen",
         [
             list,
-            lambda: (),
-            lambda: set(),
+            tuple,
+            set,
             lambda: iter([]),
             lambda: (x for x in []),  # type: ignore [var-annotated]
         ],
@@ -2092,7 +2094,7 @@
     def test_invalid_types_behave_as_expected(
         self, func: ConversionFuncs, style: Callable[[Any], Any]
     ) -> None:
-        with pytest.raises(TypeError, match="not 'tuple'"):  # noqa: PT012
+        with pytest.raises(TypeError, match="not 'tuple'"):
             for _ in func(style([("Fëanor",)])):
                 pass
         expected = [5]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/tests/test_fastnumbers_examples.py 
new/fastnumbers-5.2.0/tests/test_fastnumbers_examples.py
--- old/fastnumbers-5.1.1/tests/test_fastnumbers_examples.py    2024-12-15 
07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/tests/test_fastnumbers_examples.py    2026-06-28 
18:20:28.000000000 +0200
@@ -75,8 +75,8 @@
     assert fastnumbers.try_real("-iNFinity") == float("-inf")
     assert fastnumbers.try_real("-iNFinity", inf=7608) == 7608
     # 15. NaN
-    assert math.isnan(cast(float, fastnumbers.try_real("nan")))
-    assert math.isnan(cast(float, fastnumbers.try_real("-NaN")))
+    assert math.isnan(cast("float", fastnumbers.try_real("nan")))
+    assert math.isnan(cast("float", fastnumbers.try_real("-NaN")))
     assert fastnumbers.try_real("-NaN", nan=0) == 0
     # 16. Sign/'e'/'.' only
     assert fastnumbers.try_real("+") == "+"
@@ -148,8 +148,8 @@
     assert fastnumbers.try_float("-iNFinity") == float("-inf")
     assert fastnumbers.try_float("-iNFinity", inf=523.0) == 523.0
     # 15. NaN
-    assert math.isnan(cast(float, fastnumbers.try_float("nAn")))
-    assert math.isnan(cast(float, fastnumbers.try_float("-NaN")))
+    assert math.isnan(cast("float", fastnumbers.try_float("nAn")))
+    assert math.isnan(cast("float", fastnumbers.try_float("-NaN")))
     assert fastnumbers.try_float("-NaN", nan=0.0) == 0.0
     # 16. Sign/'e'/'.' only
     assert fastnumbers.try_float("+") == "+"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastnumbers-5.1.1/tox.ini 
new/fastnumbers-5.2.0/tox.ini
--- old/fastnumbers-5.1.1/tox.ini       2024-12-15 07:48:07.000000000 +0100
+++ new/fastnumbers-5.2.0/tox.ini       2026-06-28 18:20:28.000000000 +0200
@@ -4,7 +4,7 @@
 # and then run "tox" from this directory.
 
 [tox]
-envlist = lint, mypy, py38, py39, py310, py311, py312, py313
+envlist = lint, mypy, py39, py310, py311, py312, py313, py314
 # Other valid environments are:
 #   format
 #   lint
@@ -12,7 +12,7 @@
 #   docs
 #   bump
 #   clean
-#   py{38,39,310,311,312,313}-prof  (to update the profiling data}
+#   py{39,310,311,312,313, 314}-prof  (to update the profiling data}
 
 # Don't error out if a user hasn't installed all python versions.
 skip_missing_interpreters =
@@ -89,9 +89,6 @@
 commands = {envpython} dev/bump.py {posargs:}
 
 # For running profiling.
-[testenv:py38-prof]
-commands = {envpython} profiling/profile.py profiling/results-3.8.md
-
 [testenv:py39-prof]
 commands = {envpython} profiling/profile.py profiling/results-3.9.md
 
@@ -106,3 +103,6 @@
 
 [testenv:py313-prof]
 commands = {envpython} profiling/profile.py profiling/results-3.13.md
+
+[testenv:py314-prof]
+commands = {envpython} profiling/profile.py profiling/results-3.14.md

Reply via email to