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
