Warning: Permanently added '2620:52:6:1161:dead:beef:cafe:c14a' (ED25519) to the list of known hosts. You can reproduce this build on your computer by running: sudo dnf install copr-rpmbuild /usr/bin/copr-rpmbuild --verbose --drop-resultdir --task-url https://copr.fedorainfracloud.org/backend/get-build-task/10269544-fedora-44-ppc64le --chroot fedora-44-ppc64le Version: 1.6 PID: 7832 Logging PID: 7834 Task: {'allow_user_ssh': False, 'appstream': False, 'background': False, 'build_id': 10269544, 'buildroot_pkgs': [], 'chroot': 'fedora-44-ppc64le', 'enable_net': False, 'fedora_review': False, 'git_hash': 'a9fbc79c3f398f53e37309defa2a416159c706bb', 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/topazus/t1/python-git-changelog', 'isolation': 'default', 'memory_reqs': 2048, 'package_name': 'python-git-changelog', 'package_version': '2.9.3-1', 'project_dirname': 't1', 'project_name': 't1', 'project_owner': 'topazus', 'repo_priority': None, 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/topazus/t1/fedora-44-ppc64le/', 'id': 'copr_base', 'name': 'Copr repository', 'priority': None}], 'sandbox': 'topazus/t1--topazus', 'source_json': {}, 'source_type': None, 'ssh_public_keys': None, 'storage': 0, 'submitter': 'topazus', 'tags': [], 'task_id': '10269544-fedora-44-ppc64le', 'timeout': 18000, 'uses_devel_repo': False, 'with_opts': [], 'without_opts': []} Running: git clone https://copr-dist-git.fedorainfracloud.org/git/topazus/t1/python-git-changelog /var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog --depth 500 --no-single-branch --recursive cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/topazus/t1/python-git-changelog', '/var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog', '--depth', '500', '--no-single-branch', '--recursive'] cwd: . rc: 0 stdout: stderr: Cloning into '/var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog'... Running: git checkout a9fbc79c3f398f53e37309defa2a416159c706bb -- cmd: ['git', 'checkout', 'a9fbc79c3f398f53e37309defa2a416159c706bb', '--'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog rc: 0 stdout: stderr: Note: switching to 'a9fbc79c3f398f53e37309defa2a416159c706bb'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at a9fbc79 automatic import of python-git-changelog Running: dist-git-client sources cmd: ['dist-git-client', 'sources'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog rc: 0 stdout: stderr: INFO: Reading stdout from command: git rev-parse --abbrev-ref HEAD INFO: Reading stdout from command: git rev-parse HEAD INFO: Reading sources specification file: sources INFO: Downloading git-changelog-2.9.3.tar.gz INFO: Reading stdout from command: curl --help all INFO: Calling: curl -H Pragma: -H 'Accept-Encoding: identity' -o git-changelog-2.9.3.tar.gz --location --connect-timeout 60 --retry 3 --retry-delay 10 --remote-time --show-error --fail --retry-all-errors https://copr-dist-git.fedorainfracloud.org/repo/pkgs/topazus/t1/python-git-changelog/git-changelog-2.9.3.tar.gz/md5/21cf62fa168e467fd07b0e6e57f6531d/git-changelog-2.9.3.tar.gz tail: /var/lib/copr-rpmbuild/main.log: file truncated Dload Upload Total Spent Left Speed 100 89029 100 89029 0 0 1030k 0 --:--:-- --:--:-- --:--:-- 1035k INFO: Reading stdout from command: md5sum git-changelog-2.9.3.tar.gz Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog/python-git-changelog.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1774705104.621530 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 6.7 starting (python version = 3.14.2, NVR = mock-6.7-1.fc43), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog/python-git-changelog.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1774705104.621530 -r /var/lib/copr-rpmbuild/results/configs/child.cfg Start(bootstrap): init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish(bootstrap): init plugins Start: init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish: init plugins INFO: Signal handler active Start: run INFO: Start(/var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog/python-git-changelog.spec) Config(fedora-44-ppc64le) Start: clean chroot Finish: clean chroot Mock Version: 6.7 INFO: Mock Version: 6.7 Start(bootstrap): chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-44-ppc64le-bootstrap-1774705104.621530/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start(bootstrap): cleaning package manager metadata Finish(bootstrap): cleaning package manager metadata INFO: Guessed host environment type: unknown INFO: Using container image: registry.fedoraproject.org/fedora:44 INFO: Pulling image: registry.fedoraproject.org/fedora:44 INFO: Tagging container image as mock-bootstrap-85e5b5a4-c107-4b48-a528-e5d33d5a6b93 INFO: Checking that 167ef3ebba21aa3408357a24f7564de7ed05e8b7c0b5a585bcbe50d20db74128 image matches host's architecture INFO: Copy content of container 167ef3ebba21aa3408357a24f7564de7ed05e8b7c0b5a585bcbe50d20db74128 to /var/lib/mock/fedora-44-ppc64le-bootstrap-1774705104.621530/root INFO: mounting 167ef3ebba21aa3408357a24f7564de7ed05e8b7c0b5a585bcbe50d20db74128 with podman image mount INFO: image 167ef3ebba21aa3408357a24f7564de7ed05e8b7c0b5a585bcbe50d20db74128 as /var/lib/containers/storage/overlay/ddf9032d00275a4ad40ae7414b3b708d4790febcb46bd19c9dd3b4375d6b1076/merged INFO: umounting image 167ef3ebba21aa3408357a24f7564de7ed05e8b7c0b5a585bcbe50d20db74128 (/var/lib/containers/storage/overlay/ddf9032d00275a4ad40ae7414b3b708d4790febcb46bd19c9dd3b4375d6b1076/merged) with podman image umount INFO: Removing image mock-bootstrap-85e5b5a4-c107-4b48-a528-e5d33d5a6b93 INFO: Package manager dnf5 detected and used (fallback) INFO: Not updating bootstrap chroot, bootstrap_image_ready=True Start(bootstrap): creating root cache Finish(bootstrap): creating root cache Finish(bootstrap): chroot init Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-44-ppc64le-1774705104.621530/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Package manager dnf5 detected and used (direct choice) INFO: Buildroot is handled by package management downloaded with a bootstrap image: rpm-6.0.1-2.fc44.ppc64le rpm-sequoia-1.10.1-1.fc44.ppc64le dnf5-5.4.0.0-3.fc44.ppc64le dnf5-plugins-5.4.0.0-3.fc44.ppc64le Start: installing minimal buildroot with dnf5 Updating and loading repositories: updates 100% | 20.5 KiB/s | 11.5 KiB | 00m01s Copr repository 100% | 71.5 KiB/s | 124.3 KiB | 00m02s fedora 100% | 11.1 MiB/s | 34.0 MiB | 00m03s Repositories loaded. Package Arch Version Repository Size Installing group/module packages: bash ppc64le 0:5.3.9-3.fc44 fedora 8.9 MiB bzip2 ppc64le 0:1.0.8-23.fc44 fedora 170.8 KiB coreutils ppc64le 0:9.10-3.fc44 fedora 9.4 MiB cpio ppc64le 0:2.15-9.fc44 fedora 1.2 MiB diffutils ppc64le 0:3.12-5.fc44 fedora 1.7 MiB fedora-release-common noarch 0:44-0.15 fedora 20.6 KiB findutils ppc64le 1:4.10.0-7.fc44 fedora 2.0 MiB gawk ppc64le 0:5.3.2-3.fc44 fedora 2.8 MiB glibc-minimal-langpack ppc64le 0:2.43-2.fc44 fedora 0.0 B grep ppc64le 0:3.12-3.fc44 fedora 1.0 MiB gzip ppc64le 0:1.14-2.fc44 fedora 437.3 KiB info ppc64le 0:7.2-9.fc44 fedora 485.2 KiB patch ppc64le 0:2.8-4.fc44 fedora 262.3 KiB redhat-rpm-config noarch 0:343-19.fc44 fedora 183.6 KiB rpm-build ppc64le 0:6.0.1-2.fc44 fedora 662.4 KiB sed ppc64le 0:4.9-7.fc44 fedora 937.0 KiB shadow-utils ppc64le 2:4.19.0-6.fc44 fedora 4.9 MiB tar ppc64le 2:1.35-8.fc44 fedora 3.1 MiB unzip ppc64le 0:6.0-69.fc44 fedora 533.4 KiB util-linux ppc64le 0:2.41.3-12.fc44 fedora 6.9 MiB which ppc64le 0:2.23-4.fc44 fedora 123.2 KiB xz ppc64le 1:5.8.2-2.fc44 fedora 1.4 MiB Installing dependencies: R-srpm-macros noarch 0:1.3.5-1.fc44 fedora 3.5 KiB add-determinism ppc64le 0:0.7.2-4.fc44 fedora 2.3 MiB alternatives ppc64le 0:1.33-5.fc44 fedora 89.9 KiB ansible-srpm-macros noarch 0:1-20.1.fc44 fedora 35.7 KiB audit-libs ppc64le 0:4.1.3-1.fc44 fedora 550.2 KiB binutils ppc64le 0:2.46-1.fc44 fedora 32.6 MiB build-reproducibility-srpm-macros noarch 0:0.7.2-4.fc44 fedora 1.2 KiB bzip2-libs ppc64le 0:1.0.8-23.fc44 fedora 136.4 KiB ca-certificates noarch 0:2025.2.80_v9.0.304-6.fc44 fedora 2.7 MiB cmake-srpm-macros noarch 0:4.3.0-1.fc44 fedora 524.0 B coreutils-common ppc64le 0:9.10-3.fc44 fedora 10.7 MiB crypto-policies noarch 0:20251128-3.git19878fe.fc44 fedora 132.6 KiB curl ppc64le 0:8.18.0-4.fc44 fedora 528.0 KiB cyrus-sasl-lib ppc64le 0:2.1.28-35.fc44 fedora 2.9 MiB debugedit ppc64le 0:5.2-6.fc44 fedora 382.0 KiB dwz ppc64le 0:0.16-3.fc44 fedora 386.5 KiB ed ppc64le 0:1.22.5-2.fc44 fedora 221.6 KiB efi-srpm-macros noarch 0:6-6.fc44 fedora 40.2 KiB elfutils ppc64le 0:0.194-5.fc44 fedora 3.4 MiB elfutils-debuginfod-client ppc64le 0:0.194-5.fc44 fedora 143.3 KiB elfutils-default-yama-scope noarch 0:0.194-5.fc44 fedora 1.8 KiB elfutils-libelf ppc64le 0:0.194-5.fc44 fedora 1.2 MiB elfutils-libs ppc64le 0:0.194-5.fc44 fedora 874.3 KiB fedora-gpg-keys noarch 0:44-0.3 fedora 133.4 KiB fedora-release noarch 0:44-0.15 fedora 0.0 B fedora-release-identity-basic noarch 0:44-0.15 fedora 656.0 B fedora-repos noarch 0:44-0.3 fedora 4.9 KiB file ppc64le 0:5.46-9.fc44 fedora 140.0 KiB file-libs ppc64le 0:5.46-9.fc44 fedora 11.9 MiB filesystem ppc64le 0:3.18-52.fc44 fedora 112.0 B filesystem-srpm-macros noarch 0:3.18-52.fc44 fedora 38.2 KiB fonts-srpm-macros noarch 1:5.0.0-2.fc44 fedora 55.8 KiB forge-srpm-macros noarch 0:0.4.0-4.fc44 fedora 38.9 KiB fpc-srpm-macros noarch 0:1.3-16.fc44 fedora 144.0 B gap-srpm-macros noarch 0:2-2.fc44 fedora 2.1 KiB gdb-minimal ppc64le 0:17.1-4.fc44 fedora 16.3 MiB gdbm-libs ppc64le 1:1.23-11.fc44 fedora 233.3 KiB ghc-srpm-macros noarch 0:1.10-1.fc44 fedora 792.0 B glibc ppc64le 0:2.43-2.fc44 fedora 11.7 MiB glibc-common ppc64le 0:2.43-2.fc44 fedora 1.5 MiB glibc-gconv-extra ppc64le 0:2.43-2.fc44 fedora 18.5 MiB gmp ppc64le 1:6.3.0-5.fc44 fedora 786.1 KiB gnat-srpm-macros noarch 0:7-2.fc44 fedora 1.0 KiB gnulib-l10n noarch 0:20241231-2.fc44 fedora 655.0 KiB gnupg2 ppc64le 0:2.4.9-5.fc44 fedora 6.8 MiB gnupg2-dirmngr ppc64le 0:2.4.9-5.fc44 fedora 837.8 KiB gnupg2-gpg-agent ppc64le 0:2.4.9-5.fc44 fedora 974.1 KiB gnupg2-gpgconf ppc64le 0:2.4.9-5.fc44 fedora 321.5 KiB gnupg2-keyboxd ppc64le 0:2.4.9-5.fc44 fedora 233.1 KiB gnupg2-verify ppc64le 0:2.4.9-5.fc44 fedora 428.1 KiB gnutls ppc64le 0:3.8.12-1.fc44 fedora 4.0 MiB go-srpm-macros noarch 0:3.8.0-2.fc44 fedora 61.9 KiB gpgverify noarch 0:2.2-4.fc44 fedora 8.7 KiB ima-evm-utils-libs ppc64le 0:1.6.2-8.fc44 fedora 92.5 KiB jansson ppc64le 0:2.14-4.fc44 fedora 156.9 KiB java-srpm-macros noarch 0:1-8.fc44 fedora 870.0 B json-c ppc64le 0:0.18-8.fc44 fedora 138.5 KiB kernel-srpm-macros noarch 0:1.0-28.fc44 fedora 1.9 KiB keyutils-libs ppc64le 0:1.6.3-7.fc44 fedora 97.9 KiB krb5-libs ppc64le 0:1.22.2-2.fc44 fedora 3.0 MiB libacl ppc64le 0:2.3.2-6.fc44 fedora 67.5 KiB libarchive ppc64le 0:3.8.4-2.fc44 fedora 1.3 MiB libassuan ppc64le 0:2.5.7-5.fc44 fedora 215.8 KiB libattr ppc64le 0:2.5.2-8.fc44 fedora 68.0 KiB libblkid ppc64le 0:2.41.3-12.fc44 fedora 354.4 KiB libbrotli ppc64le 0:1.2.0-3.fc44 fedora 1.0 MiB libcap ppc64le 0:2.77-2.fc44 fedora 506.7 KiB libcap-ng ppc64le 0:0.9.1-1.fc44 fedora 160.1 KiB libcbor ppc64le 0:0.13.0-2.fc44 fedora 139.5 KiB libcom_err ppc64le 0:1.47.3-4.fc44 fedora 110.9 KiB libcurl ppc64le 0:8.18.0-4.fc44 fedora 1.2 MiB libeconf ppc64le 0:0.7.9-3.fc44 fedora 80.7 KiB libevent ppc64le 0:2.1.12-17.fc44 fedora 1.3 MiB libfdisk ppc64le 0:2.41.3-12.fc44 fedora 482.9 KiB libffi ppc64le 0:3.5.2-2.fc44 fedora 347.5 KiB libfido2 ppc64le 0:1.16.0-5.fc44 fedora 342.5 KiB libfsverity ppc64le 0:1.6-4.fc44 fedora 68.0 KiB libgcc ppc64le 0:16.0.1-0.10.fc44 fedora 286.4 KiB libgcrypt ppc64le 0:1.12.1-1.fc44 fedora 1.6 MiB libgomp ppc64le 0:16.0.1-0.10.fc44 fedora 656.7 KiB libgpg-error ppc64le 0:1.58-2.fc44 fedora 1.0 MiB libidn2 ppc64le 0:2.3.8-3.fc44 fedora 560.1 KiB libksba ppc64le 0:1.6.7-5.fc44 fedora 526.3 KiB liblastlog2 ppc64le 0:2.41.3-12.fc44 fedora 137.2 KiB libmount ppc64le 0:2.41.3-12.fc44 fedora 548.2 KiB libnghttp2 ppc64le 0:1.68.0-3.fc44 fedora 197.8 KiB libnghttp3 ppc64le 0:1.15.0-1.fc44 fedora 206.5 KiB libpkgconf ppc64le 0:2.5.1-1.fc44 fedora 133.9 KiB libpsl ppc64le 0:0.21.5-7.fc44 fedora 132.0 KiB librtas ppc64le 0:2.0.6-6.fc44 fedora 305.3 KiB libselinux ppc64le 0:3.10-1.fc44 fedora 265.0 KiB libselinux-utils ppc64le 0:3.10-1.fc44 fedora 1.3 MiB libsemanage ppc64le 0:3.10-1.fc44 fedora 423.8 KiB libsepol ppc64le 0:3.10-1.fc44 fedora 1.0 MiB libsmartcols ppc64le 0:2.41.3-12.fc44 fedora 289.3 KiB libssh ppc64le 0:0.12.0-1.fc44 fedora 911.1 KiB libssh-config noarch 0:0.12.0-1.fc44 fedora 277.0 B libstdc++ ppc64le 0:16.0.1-0.10.fc44 fedora 3.9 MiB libtasn1 ppc64le 0:4.20.0-3.fc44 fedora 219.9 KiB libtool-ltdl ppc64le 0:2.5.4-10.fc44 fedora 93.8 KiB libunistring ppc64le 0:1.1-11.fc44 fedora 1.9 MiB libusb1 ppc64le 0:1.0.29-5.fc44 fedora 242.7 KiB libuuid ppc64le 0:2.41.3-12.fc44 fedora 69.2 KiB libverto ppc64le 0:0.3.2-12.fc44 fedora 69.0 KiB libxcrypt ppc64le 0:4.5.2-3.fc44 fedora 336.9 KiB libxml2 ppc64le 0:2.12.10-6.fc44 fedora 2.3 MiB libzstd ppc64le 0:1.5.7-5.fc44 fedora 1.1 MiB linkdupes ppc64le 0:0.7.2-4.fc44 fedora 905.6 KiB lua-libs ppc64le 0:5.4.8-5.fc44 fedora 393.7 KiB lua-srpm-macros noarch 0:1-17.fc44 fedora 1.3 KiB lz4-libs ppc64le 0:1.10.0-4.fc44 fedora 261.0 KiB mpfr ppc64le 0:4.2.2-3.fc44 fedora 913.5 KiB ncurses-base noarch 0:6.6-1.fc44 fedora 329.7 KiB ncurses-libs ppc64le 0:6.6-1.fc44 fedora 1.5 MiB nettle ppc64le 0:3.10.1-3.fc44 fedora 957.4 KiB ngtcp2 ppc64le 0:1.19.0-2.fc44 fedora 405.0 KiB ngtcp2-crypto-ossl ppc64le 0:1.19.0-2.fc44 fedora 67.1 KiB npth ppc64le 0:1.8-4.fc44 fedora 93.0 KiB ocaml-srpm-macros noarch 0:11-3.fc44 fedora 1.9 KiB openblas-srpm-macros noarch 0:2-21.fc44 fedora 112.0 B openldap ppc64le 0:2.6.10-7.fc44 fedora 889.6 KiB openssl-libs ppc64le 1:3.5.5-1.fc44 fedora 9.1 MiB p11-kit ppc64le 0:0.26.2-1.fc44 fedora 3.2 MiB p11-kit-trust ppc64le 0:0.26.2-1.fc44 fedora 593.9 KiB package-notes-srpm-macros noarch 0:0.5-16.fc44 fedora 1.6 KiB pam-libs ppc64le 0:1.7.2-1.fc44 fedora 286.0 KiB pcre2 ppc64le 0:10.47-1.fc44.1 fedora 841.8 KiB pcre2-syntax noarch 0:10.47-1.fc44.1 fedora 281.9 KiB perl-srpm-macros noarch 0:1-61.fc44 fedora 861.0 B pkgconf ppc64le 0:2.5.1-1.fc44 fedora 116.6 KiB pkgconf-m4 noarch 0:2.5.1-1.fc44 fedora 14.3 KiB pkgconf-pkg-config ppc64le 0:2.5.1-1.fc44 fedora 990.0 B policycoreutils ppc64le 0:3.10-1.fc44 fedora 1.5 MiB popt ppc64le 0:1.19-10.fc44 fedora 208.6 KiB publicsuffix-list-dafsa noarch 0:20260116-1.fc44 fedora 70.4 KiB pyproject-srpm-macros noarch 0:1.18.7-1.fc44 fedora 1.9 KiB python-srpm-macros noarch 0:3.14-10.fc44 fedora 51.6 KiB qt5-srpm-macros noarch 0:5.15.18-2.fc44 fedora 500.0 B qt6-srpm-macros noarch 0:6.10.2-1.fc44 fedora 472.0 B readline ppc64le 0:8.3-4.fc44 fedora 627.4 KiB rpm ppc64le 0:6.0.1-2.fc44 fedora 4.2 MiB rpm-build-libs ppc64le 0:6.0.1-2.fc44 fedora 327.9 KiB rpm-libs ppc64le 0:6.0.1-2.fc44 fedora 1.2 MiB rpm-plugin-selinux ppc64le 0:6.0.1-2.fc44 fedora 67.8 KiB rpm-sequoia ppc64le 0:1.10.1-1.fc44 fedora 4.8 MiB rpm-sign-libs ppc64le 0:6.0.1-2.fc44 fedora 67.5 KiB rust-srpm-macros noarch 0:28.4-3.fc44 fedora 5.5 KiB selinux-policy noarch 0:43.1-1.fc44 fedora 32.0 KiB selinux-policy-targeted noarch 0:43.1-1.fc44 fedora 18.5 MiB setup noarch 0:2.15.0-28.fc44 fedora 724.9 KiB sqlite-libs ppc64le 0:3.51.2-1.fc44 fedora 1.9 MiB systemd-libs ppc64le 0:259.5-1.fc44 fedora 3.0 MiB systemd-standalone-sysusers ppc64le 0:259.5-1.fc44 fedora 393.7 KiB tpm2-tss ppc64le 0:4.1.3-9.fc44 fedora 2.4 MiB tree-sitter-srpm-macros noarch 0:0.4.2-2.fc44 fedora 8.3 KiB util-linux-core ppc64le 0:2.41.3-12.fc44 fedora 2.5 MiB xxhash-libs ppc64le 0:0.8.3-4.fc44 fedora 85.5 KiB xz-libs ppc64le 1:5.8.2-2.fc44 fedora 265.2 KiB zig-srpm-macros noarch 0:1-8.fc44 fedora 1.3 KiB zip ppc64le 0:3.0-45.fc44 fedora 889.1 KiB zlib-ng-compat ppc64le 0:2.3.3-3.fc44 fedora 197.3 KiB zstd ppc64le 0:1.5.7-5.fc44 fedora 562.0 KiB Installing groups: Buildsystem building group Transaction Summary: Installing: 184 packages Total size of inbound packages is 73 MiB. Need to download 73 MiB. After this operation, 279 MiB extra will be used (install 279 MiB, remove 0 B). [ 1/184] bzip2-0:1.0.8-23.fc44.ppc64le 100% | 1.3 MiB/s | 53.0 KiB | 00m00s [ 2/184] cpio-0:2.15-9.fc44.ppc64le 100% | 19.6 MiB/s | 300.9 KiB | 00m00s [ 3/184] diffutils-0:3.12-5.fc44.ppc64 100% | 33.0 MiB/s | 406.0 KiB | 00m00s [ 4/184] coreutils-0:9.10-3.fc44.ppc64 100% | 16.6 MiB/s | 1.2 MiB | 00m00s [ 5/184] fedora-release-common-0:44-0. 100% | 3.3 MiB/s | 23.9 KiB | 00m00s [ 6/184] bash-0:5.3.9-3.fc44.ppc64le 100% | 20.5 MiB/s | 1.9 MiB | 00m00s [ 7/184] findutils-1:4.10.0-7.fc44.ppc 100% | 26.0 MiB/s | 586.5 KiB | 00m00s [ 8/184] glibc-minimal-langpack-0:2.43 100% | 19.3 MiB/s | 78.9 KiB | 00m00s [ 9/184] gawk-0:5.3.2-3.fc44.ppc64le 100% | 37.7 MiB/s | 1.2 MiB | 00m00s [ 10/184] gzip-0:1.14-2.fc44.ppc64le 100% | 17.5 MiB/s | 178.8 KiB | 00m00s [ 11/184] grep-0:3.12-3.fc44.ppc64le 100% | 23.2 MiB/s | 308.8 KiB | 00m00s [ 12/184] info-0:7.2-9.fc44.ppc64le 100% | 24.7 MiB/s | 202.2 KiB | 00m00s [ 13/184] patch-0:2.8-4.fc44.ppc64le 100% | 20.1 MiB/s | 123.6 KiB | 00m00s [ 14/184] redhat-rpm-config-0:343-19.fc 100% | 15.5 MiB/s | 79.4 KiB | 00m00s [ 15/184] rpm-build-0:6.0.1-2.fc44.ppc6 100% | 26.2 MiB/s | 161.0 KiB | 00m00s [ 16/184] sed-0:4.9-7.fc44.ppc64le 100% | 35.0 MiB/s | 322.6 KiB | 00m00s [ 17/184] unzip-0:6.0-69.fc44.ppc64le 100% | 25.1 MiB/s | 205.2 KiB | 00m00s [ 18/184] tar-2:1.35-8.fc44.ppc64le 100% | 51.0 MiB/s | 887.0 KiB | 00m00s [ 19/184] shadow-utils-2:4.19.0-6.fc44. 100% | 41.0 MiB/s | 1.3 MiB | 00m00s [ 20/184] which-0:2.23-4.fc44.ppc64le 100% | 4.7 MiB/s | 43.1 KiB | 00m00s [ 21/184] xz-1:5.8.2-2.fc44.ppc64le 100% | 39.7 MiB/s | 610.3 KiB | 00m00s [ 22/184] util-linux-0:2.41.3-12.fc44.p 100% | 34.2 MiB/s | 1.3 MiB | 00m00s [ 23/184] filesystem-0:3.18-52.fc44.ppc 100% | 36.1 MiB/s | 1.3 MiB | 00m00s [ 24/184] ncurses-libs-0:6.6-1.fc44.ppc 100% | 21.9 MiB/s | 382.0 KiB | 00m00s [ 25/184] bzip2-libs-0:1.0.8-23.fc44.pp 100% | 16.1 MiB/s | 49.4 KiB | 00m00s [ 26/184] gmp-1:6.3.0-5.fc44.ppc64le 100% | 34.7 MiB/s | 319.9 KiB | 00m00s [ 27/184] libacl-0:2.3.2-6.fc44.ppc64le 100% | 8.6 MiB/s | 26.4 KiB | 00m00s [ 28/184] libattr-0:2.5.2-8.fc44.ppc64l 100% | 4.6 MiB/s | 18.7 KiB | 00m00s [ 29/184] libcap-0:2.77-2.fc44.ppc64le 100% | 23.0 MiB/s | 94.2 KiB | 00m00s [ 30/184] glibc-0:2.43-2.fc44.ppc64le 100% | 49.4 MiB/s | 3.3 MiB | 00m00s [ 31/184] libselinux-0:3.10-1.fc44.ppc6 100% | 6.4 MiB/s | 111.7 KiB | 00m00s [ 32/184] coreutils-common-0:9.10-3.fc4 100% | 38.8 MiB/s | 2.1 MiB | 00m00s [ 33/184] fedora-repos-0:44-0.3.noarch 100% | 3.0 MiB/s | 9.2 KiB | 00m00s [ 34/184] systemd-libs-0:259.5-1.fc44.p 100% | 37.7 MiB/s | 888.8 KiB | 00m00s [ 35/184] mpfr-0:4.2.2-3.fc44.ppc64le 100% | 26.9 MiB/s | 357.9 KiB | 00m00s [ 36/184] readline-0:8.3-4.fc44.ppc64le 100% | 33.9 MiB/s | 243.1 KiB | 00m00s [ 37/184] glibc-common-0:2.43-2.fc44.pp 100% | 41.0 MiB/s | 377.7 KiB | 00m00s [ 38/184] pcre2-0:10.47-1.fc44.1.ppc64l 100% | 34.9 MiB/s | 285.6 KiB | 00m00s [ 39/184] ed-0:1.22.5-2.fc44.ppc64le 100% | 17.0 MiB/s | 87.3 KiB | 00m00s [ 40/184] R-srpm-macros-0:1.3.5-1.fc44. 100% | 3.5 MiB/s | 10.9 KiB | 00m00s [ 41/184] build-reproducibility-srpm-ma 100% | 4.3 MiB/s | 13.1 KiB | 00m00s [ 42/184] ansible-srpm-macros-0:1-20.1. 100% | 6.5 MiB/s | 20.1 KiB | 00m00s [ 43/184] openssl-libs-1:3.5.5-1.fc44.p 100% | 44.4 MiB/s | 2.8 MiB | 00m00s [ 44/184] cmake-srpm-macros-0:4.3.0-1.f 100% | 745.3 KiB/s | 10.4 KiB | 00m00s [ 45/184] dwz-0:0.16-3.fc44.ppc64le 100% | 9.5 MiB/s | 145.8 KiB | 00m00s [ 46/184] efi-srpm-macros-0:6-6.fc44.no 100% | 7.3 MiB/s | 22.6 KiB | 00m00s [ 47/184] file-0:5.46-9.fc44.ppc64le 100% | 16.1 MiB/s | 49.6 KiB | 00m00s [ 48/184] filesystem-srpm-macros-0:3.18 100% | 8.7 MiB/s | 26.6 KiB | 00m00s [ 49/184] fonts-srpm-macros-1:5.0.0-2.f 100% | 8.9 MiB/s | 27.4 KiB | 00m00s [ 50/184] forge-srpm-macros-0:0.4.0-4.f 100% | 6.5 MiB/s | 20.0 KiB | 00m00s [ 51/184] fpc-srpm-macros-0:1.3-16.fc44 100% | 2.6 MiB/s | 7.9 KiB | 00m00s [ 52/184] gap-srpm-macros-0:2-2.fc44.no 100% | 2.2 MiB/s | 9.1 KiB | 00m00s [ 53/184] ghc-srpm-macros-0:1.10-1.fc44 100% | 2.9 MiB/s | 8.8 KiB | 00m00s [ 54/184] gnat-srpm-macros-0:7-2.fc44.n 100% | 2.8 MiB/s | 8.7 KiB | 00m00s [ 55/184] go-srpm-macros-0:3.8.0-2.fc44 100% | 9.2 MiB/s | 28.2 KiB | 00m00s [ 56/184] java-srpm-macros-0:1-8.fc44.n 100% | 2.6 MiB/s | 8.1 KiB | 00m00s [ 57/184] kernel-srpm-macros-0:1.0-28.f 100% | 2.9 MiB/s | 9.0 KiB | 00m00s [ 58/184] lua-srpm-macros-0:1-17.fc44.n 100% | 2.9 MiB/s | 8.9 KiB | 00m00s [ 59/184] ocaml-srpm-macros-0:11-3.fc44 100% | 4.5 MiB/s | 9.3 KiB | 00m00s [ 60/184] openblas-srpm-macros-0:2-21.f 100% | 2.5 MiB/s | 7.8 KiB | 00m00s [ 61/184] package-notes-srpm-macros-0:0 100% | 4.4 MiB/s | 9.1 KiB | 00m00s [ 62/184] perl-srpm-macros-0:1-61.fc44. 100% | 4.1 MiB/s | 8.4 KiB | 00m00s [ 63/184] pyproject-srpm-macros-0:1.18. 100% | 6.4 MiB/s | 13.1 KiB | 00m00s [ 64/184] python-srpm-macros-0:3.14-10. 100% | 11.7 MiB/s | 24.0 KiB | 00m00s [ 65/184] qt5-srpm-macros-0:5.15.18-2.f 100% | 2.8 MiB/s | 8.7 KiB | 00m00s [ 66/184] qt6-srpm-macros-0:6.10.2-1.fc 100% | 3.0 MiB/s | 9.1 KiB | 00m00s [ 67/184] rust-srpm-macros-0:28.4-3.fc4 100% | 3.6 MiB/s | 11.1 KiB | 00m00s [ 68/184] tree-sitter-srpm-macros-0:0.4 100% | 4.4 MiB/s | 13.5 KiB | 00m00s [ 69/184] zig-srpm-macros-0:1-8.fc44.no 100% | 2.2 MiB/s | 8.8 KiB | 00m00s [ 70/184] rpm-0:6.0.1-2.fc44.ppc64le 100% | 43.5 MiB/s | 579.3 KiB | 00m00s [ 71/184] zip-0:3.0-45.fc44.ppc64le 100% | 24.6 MiB/s | 276.6 KiB | 00m00s [ 72/184] debugedit-0:5.2-6.fc44.ppc64l 100% | 17.5 MiB/s | 89.8 KiB | 00m00s [ 73/184] elfutils-libelf-0:0.194-5.fc4 100% | 29.5 MiB/s | 211.8 KiB | 00m00s [ 74/184] elfutils-0:0.194-5.fc44.ppc64 100% | 39.9 MiB/s | 572.4 KiB | 00m00s [ 75/184] libgcc-0:16.0.1-0.10.fc44.ppc 100% | 25.9 MiB/s | 106.2 KiB | 00m00s [ 76/184] libarchive-0:3.8.4-2.fc44.ppc 100% | 37.2 MiB/s | 495.1 KiB | 00m00s [ 77/184] pkgconf-pkg-config-0:2.5.1-1. 100% | 4.6 MiB/s | 9.4 KiB | 00m00s [ 78/184] popt-0:1.19-10.fc44.ppc64le 100% | 22.7 MiB/s | 69.9 KiB | 00m00s [ 79/184] rpm-build-libs-0:6.0.1-2.fc44 100% | 21.8 MiB/s | 134.1 KiB | 00m00s [ 80/184] libstdc++-0:16.0.1-0.10.fc44. 100% | 45.0 MiB/s | 1.0 MiB | 00m00s [ 81/184] zstd-0:1.5.7-5.fc44.ppc64le 100% | 31.6 MiB/s | 194.3 KiB | 00m00s [ 82/184] rpm-libs-0:6.0.1-2.fc44.ppc64 100% | 31.0 MiB/s | 444.1 KiB | 00m00s [ 83/184] audit-libs-0:4.1.3-1.fc44.ppc 100% | 30.4 MiB/s | 155.5 KiB | 00m00s [ 84/184] libeconf-0:0.7.9-3.fc44.ppc64 100% | 13.0 MiB/s | 40.1 KiB | 00m00s [ 85/184] libsemanage-0:3.10-1.fc44.ppc 100% | 26.4 MiB/s | 135.1 KiB | 00m00s [ 86/184] libxcrypt-0:4.5.2-3.fc44.ppc6 100% | 19.5 MiB/s | 139.7 KiB | 00m00s [ 87/184] pam-libs-0:1.7.2-1.fc44.ppc64 100% | 15.4 MiB/s | 63.0 KiB | 00m00s [ 88/184] setup-0:2.15.0-28.fc44.noarch 100% | 25.6 MiB/s | 157.2 KiB | 00m00s [ 89/184] libblkid-0:2.41.3-12.fc44.ppc 100% | 23.3 MiB/s | 142.9 KiB | 00m00s [ 90/184] libcap-ng-0:0.9.1-1.fc44.ppc6 100% | 11.0 MiB/s | 33.8 KiB | 00m00s [ 91/184] libfdisk-0:2.41.3-12.fc44.ppc 100% | 24.7 MiB/s | 177.1 KiB | 00m00s [ 92/184] liblastlog2-0:2.41.3-12.fc44. 100% | 3.9 MiB/s | 24.2 KiB | 00m00s [ 93/184] librtas-0:2.0.6-6.fc44.ppc64l 100% | 20.3 MiB/s | 83.2 KiB | 00m00s [ 94/184] libmount-0:2.41.3-12.fc44.ppc 100% | 30.2 MiB/s | 185.7 KiB | 00m00s [ 95/184] libuuid-0:2.41.3-12.fc44.ppc6 100% | 13.6 MiB/s | 27.8 KiB | 00m00s [ 96/184] libsmartcols-0:2.41.3-12.fc44 100% | 21.6 MiB/s | 110.6 KiB | 00m00s [ 97/184] zlib-ng-compat-0:2.3.3-3.fc44 100% | 21.9 MiB/s | 89.6 KiB | 00m00s [ 98/184] xz-libs-1:5.8.2-2.fc44.ppc64l 100% | 30.9 MiB/s | 126.8 KiB | 00m00s [ 99/184] util-linux-core-0:2.41.3-12.f 100% | 44.4 MiB/s | 591.3 KiB | 00m00s [100/184] ncurses-base-0:6.6-1.fc44.noa 100% | 21.5 MiB/s | 88.0 KiB | 00m00s [101/184] gnulib-l10n-0:20241231-2.fc44 100% | 36.7 MiB/s | 150.3 KiB | 00m00s [102/184] libsepol-0:3.10-1.fc44.ppc64l 100% | 53.2 MiB/s | 381.6 KiB | 00m00s [103/184] glibc-gconv-extra-0:2.43-2.fc 100% | 58.3 MiB/s | 1.7 MiB | 00m00s [104/184] crypto-policies-0:20251128-3. 100% | 24.0 MiB/s | 98.3 KiB | 00m00s [105/184] ca-certificates-0:2025.2.80_v 100% | 52.8 MiB/s | 972.7 KiB | 00m00s [106/184] fedora-gpg-keys-0:44-0.3.noar 100% | 23.0 MiB/s | 141.4 KiB | 00m00s [107/184] pcre2-syntax-0:10.47-1.fc44.1 100% | 40.2 MiB/s | 164.7 KiB | 00m00s [108/184] linkdupes-0:0.7.2-4.fc44.ppc6 100% | 52.3 MiB/s | 374.9 KiB | 00m00s [109/184] add-determinism-0:0.7.2-4.fc4 100% | 51.0 MiB/s | 887.4 KiB | 00m00s [110/184] file-libs-0:5.46-9.fc44.ppc64 100% | 52.6 MiB/s | 862.1 KiB | 00m00s [111/184] curl-0:8.18.0-4.fc44.ppc64le 100% | 21.9 MiB/s | 247.2 KiB | 00m00s [112/184] alternatives-0:1.33-5.fc44.pp 100% | 21.1 MiB/s | 43.2 KiB | 00m00s [113/184] elfutils-debuginfod-client-0: 100% | 16.0 MiB/s | 49.3 KiB | 00m00s [114/184] jansson-0:2.14-4.fc44.ppc64le 100% | 16.5 MiB/s | 50.6 KiB | 00m00s [115/184] elfutils-libs-0:0.194-5.fc44. 100% | 50.1 MiB/s | 307.9 KiB | 00m00s [116/184] libzstd-0:1.5.7-5.fc44.ppc64l 100% | 39.0 MiB/s | 399.6 KiB | 00m00s [117/184] lz4-libs-0:1.10.0-4.fc44.ppc6 100% | 24.8 MiB/s | 101.7 KiB | 00m00s [118/184] libxml2-0:2.12.10-6.fc44.ppc6 100% | 54.3 MiB/s | 778.2 KiB | 00m00s [119/184] pkgconf-0:2.5.1-1.fc44.ppc64l 100% | 8.0 MiB/s | 49.2 KiB | 00m00s [120/184] pkgconf-m4-0:2.5.1-1.fc44.noa 100% | 6.7 MiB/s | 13.8 KiB | 00m00s [121/184] lua-libs-0:5.4.8-5.fc44.ppc64 100% | 48.7 MiB/s | 149.7 KiB | 00m00s [122/184] libgomp-0:16.0.1-0.10.fc44.pp 100% | 48.8 MiB/s | 399.8 KiB | 00m00s [123/184] rpm-sign-libs-0:6.0.1-2.fc44. 100% | 13.8 MiB/s | 28.2 KiB | 00m00s [124/184] sqlite-libs-0:3.51.2-1.fc44.p 100% | 50.6 MiB/s | 880.1 KiB | 00m00s [125/184] libffi-0:3.5.2-2.fc44.ppc64le 100% | 13.7 MiB/s | 42.0 KiB | 00m00s [126/184] rpm-sequoia-0:1.10.1-1.fc44.p 100% | 52.5 MiB/s | 1.5 MiB | 00m00s [127/184] p11-kit-trust-0:0.26.2-1.fc44 100% | 25.5 MiB/s | 156.5 KiB | 00m00s [128/184] p11-kit-0:0.26.2-1.fc44.ppc64 100% | 31.5 MiB/s | 548.4 KiB | 00m00s [129/184] json-c-0:0.18-8.fc44.ppc64le 100% | 16.2 MiB/s | 49.8 KiB | 00m00s [130/184] elfutils-default-yama-scope-0 100% | 5.8 MiB/s | 11.9 KiB | 00m00s [131/184] libpkgconf-0:2.5.1-1.fc44.ppc 100% | 15.2 MiB/s | 46.7 KiB | 00m00s [132/184] ima-evm-utils-libs-0:1.6.2-8. 100% | 9.9 MiB/s | 30.3 KiB | 00m00s [133/184] libfsverity-0:1.6-4.fc44.ppc6 100% | 9.5 MiB/s | 19.6 KiB | 00m00s [134/184] libtasn1-0:4.20.0-3.fc44.ppc6 100% | 19.6 MiB/s | 80.4 KiB | 00m00s [135/184] gpgverify-0:2.2-4.fc44.noarch 100% | 3.7 MiB/s | 11.2 KiB | 00m00s [136/184] gnupg2-0:2.4.9-5.fc44.ppc64le 100% | 60.3 MiB/s | 1.7 MiB | 00m00s [137/184] gnupg2-dirmngr-0:2.4.9-5.fc44 100% | 21.8 MiB/s | 313.1 KiB | 00m00s [138/184] gnupg2-gpg-agent-0:2.4.9-5.fc 100% | 37.1 MiB/s | 304.2 KiB | 00m00s [139/184] gnupg2-gpgconf-0:2.4.9-5.fc44 100% | 24.5 MiB/s | 125.6 KiB | 00m00s [140/184] gnupg2-keyboxd-0:2.4.9-5.fc44 100% | 25.1 MiB/s | 103.0 KiB | 00m00s [141/184] gnupg2-verify-0:2.4.9-5.fc44. 100% | 36.0 MiB/s | 184.5 KiB | 00m00s [142/184] libassuan-0:2.5.7-5.fc44.ppc6 100% | 23.3 MiB/s | 71.5 KiB | 00m00s [143/184] libgpg-error-0:1.58-2.fc44.pp 100% | 31.7 MiB/s | 259.9 KiB | 00m00s [144/184] libgcrypt-0:1.12.1-1.fc44.ppc 100% | 41.9 MiB/s | 686.6 KiB | 00m00s [145/184] npth-0:1.8-4.fc44.ppc64le 100% | 4.1 MiB/s | 25.2 KiB | 00m00s [146/184] binutils-0:2.46-1.fc44.ppc64l 100% | 19.2 MiB/s | 6.7 MiB | 00m00s [147/184] tpm2-tss-0:4.1.3-9.fc44.ppc64 100% | 10.8 MiB/s | 396.7 KiB | 00m00s [148/184] libksba-0:1.6.7-5.fc44.ppc64l 100% | 24.6 MiB/s | 176.0 KiB | 00m00s [149/184] openldap-0:2.6.10-7.fc44.ppc6 100% | 47.0 MiB/s | 288.8 KiB | 00m00s [150/184] gnutls-0:3.8.12-1.fc44.ppc64l 100% | 27.1 MiB/s | 1.4 MiB | 00m00s [151/184] libusb1-0:1.0.29-5.fc44.ppc64 100% | 7.6 MiB/s | 85.7 KiB | 00m00s [152/184] libidn2-0:2.3.8-3.fc44.ppc64l 100% | 19.2 MiB/s | 176.9 KiB | 00m00s [153/184] libunistring-0:1.1-11.fc44.pp 100% | 51.0 MiB/s | 574.5 KiB | 00m00s [154/184] nettle-0:3.10.1-3.fc44.ppc64l 100% | 34.6 MiB/s | 460.3 KiB | 00m00s [155/184] libtool-ltdl-0:2.5.4-10.fc44. 100% | 9.6 MiB/s | 39.5 KiB | 00m00s [156/184] cyrus-sasl-lib-0:2.1.28-35.fc 100% | 40.0 MiB/s | 901.5 KiB | 00m00s [157/184] libevent-0:2.1.12-17.fc44.ppc 100% | 23.8 MiB/s | 292.9 KiB | 00m00s [158/184] gdbm-libs-1:1.23-11.fc44.ppc6 100% | 7.6 MiB/s | 62.0 KiB | 00m00s [159/184] fedora-release-0:44-0.15.noar 100% | 4.1 MiB/s | 12.7 KiB | 00m00s [160/184] systemd-standalone-sysusers-0 100% | 30.0 MiB/s | 153.6 KiB | 00m00s [161/184] xxhash-libs-0:0.8.3-4.fc44.pp 100% | 12.3 MiB/s | 37.8 KiB | 00m00s [162/184] fedora-release-identity-basic 100% | 4.4 MiB/s | 13.5 KiB | 00m00s [163/184] libcurl-0:8.18.0-4.fc44.ppc64 100% | 39.8 MiB/s | 489.5 KiB | 00m00s [164/184] krb5-libs-0:1.22.2-2.fc44.ppc 100% | 44.1 MiB/s | 858.6 KiB | 00m00s [165/184] libbrotli-0:1.2.0-3.fc44.ppc6 100% | 32.0 MiB/s | 393.6 KiB | 00m00s [166/184] libnghttp2-0:1.68.0-3.fc44.pp 100% | 16.1 MiB/s | 82.6 KiB | 00m00s [167/184] libnghttp3-0:1.15.0-1.fc44.pp 100% | 24.9 MiB/s | 76.5 KiB | 00m00s [168/184] libpsl-0:0.21.5-7.fc44.ppc64l 100% | 16.2 MiB/s | 66.4 KiB | 00m00s [169/184] libssh-0:0.12.0-1.fc44.ppc64l 100% | 38.5 MiB/s | 315.8 KiB | 00m00s [170/184] ngtcp2-0:1.19.0-2.fc44.ppc64l 100% | 23.3 MiB/s | 166.8 KiB | 00m00s [171/184] ngtcp2-crypto-ossl-0:1.19.0-2 100% | 13.0 MiB/s | 26.6 KiB | 00m00s [172/184] keyutils-libs-0:1.6.3-7.fc44. 100% | 10.6 MiB/s | 32.4 KiB | 00m00s [173/184] libcom_err-0:1.47.3-4.fc44.pp 100% | 8.9 MiB/s | 27.3 KiB | 00m00s [174/184] libverto-0:0.3.2-12.fc44.ppc6 100% | 3.6 MiB/s | 21.8 KiB | 00m00s [175/184] publicsuffix-list-dafsa-0:202 100% | 14.7 MiB/s | 60.3 KiB | 00m00s [176/184] libssh-config-0:0.12.0-1.fc44 100% | 3.1 MiB/s | 9.4 KiB | 00m00s [177/184] libfido2-0:1.16.0-5.fc44.ppc6 100% | 26.7 MiB/s | 109.4 KiB | 00m00s [178/184] libcbor-0:0.13.0-2.fc44.ppc64 100% | 12.0 MiB/s | 36.8 KiB | 00m00s [179/184] policycoreutils-0:3.10-1.fc44 100% | 36.4 MiB/s | 260.7 KiB | 00m00s [180/184] selinux-policy-0:43.1-1.fc44. 100% | 17.2 MiB/s | 70.5 KiB | 00m00s [181/184] libselinux-utils-0:3.10-1.fc4 100% | 40.3 MiB/s | 123.9 KiB | 00m00s [182/184] rpm-plugin-selinux-0:6.0.1-2. 100% | 6.2 MiB/s | 19.2 KiB | 00m00s [183/184] gdb-minimal-0:17.1-4.fc44.ppc 100% | 17.2 MiB/s | 4.9 MiB | 00m00s [184/184] selinux-policy-targeted-0:43. 100% | 18.7 MiB/s | 6.8 MiB | 00m00s -------------------------------------------------------------------------------- [184/184] Total 100% | 62.0 MiB/s | 72.9 MiB | 00m01s Running transaction Importing OpenPGP key 0x6D9F90A6: UserID : "Fedora (44) " Fingerprint: 36F612DCF27F7D1A48A835E4DBFCF71C6D9F90A6 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-44-primary The key was successfully imported. [ 1/186] Verify package files 100% | 159.0 B/s | 184.0 B | 00m01s [ 2/186] Prepare transaction 100% | 906.0 B/s | 184.0 B | 00m00s [ 3/186] Installing libgcc-0:16.0.1-0. 100% | 70.3 MiB/s | 288.1 KiB | 00m00s [ 4/186] Installing libssh-config-0:0. 100% | 796.9 KiB/s | 816.0 B | 00m00s [ 5/186] Installing publicsuffix-list- 100% | 34.7 MiB/s | 71.1 KiB | 00m00s [ 6/186] Installing fedora-release-ide 100% | 445.3 KiB/s | 912.0 B | 00m00s [ 7/186] Installing fedora-gpg-keys-0: 100% | 11.1 MiB/s | 182.1 KiB | 00m00s [ 8/186] Installing fedora-repos-0:44- 100% | 5.6 MiB/s | 5.7 KiB | 00m00s [ 9/186] Installing fedora-release-com 100% | 8.1 MiB/s | 24.9 KiB | 00m00s [ 10/186] Installing fedora-release-0:4 100% | 11.0 KiB/s | 124.0 B | 00m00s >>> Running sysusers scriptlet: setup-0:2.15.0-28.fc44.noarch >>> Finished sysusers scriptlet: setup-0:2.15.0-28.fc44.noarch >>> Scriptlet output: >>> Creating group 'adm' with GID 4. >>> Creating group 'audio' with GID 63. >>> Creating group 'cdrom' with GID 11. >>> Creating group 'clock' with GID 103. >>> Creating group 'dialout' with GID 18. >>> Creating group 'disk' with GID 6. >>> Creating group 'floppy' with GID 19. >>> Creating group 'ftp' with GID 50. >>> Creating group 'games' with GID 20. >>> Creating group 'input' with GID 104. >>> Creating group 'kmem' with GID 9. >>> Creating group 'kvm' with GID 36. >>> Creating group 'lock' with GID 54. >>> Creating group 'lp' with GID 7. >>> Creating group 'mail' with GID 12. >>> Creating group 'man' with GID 15. >>> Creating group 'mem' with GID 8. >>> Creating group 'nobody' with GID 65534. >>> Creating group 'render' with GID 105. >>> Creating group 'root' with GID 0. >>> Creating group 'sgx' with GID 106. >>> Creating group 'sys' with GID 3. >>> Creating group 'tape' with GID 33. >>> Creating group 'tty' with GID 5. >>> Creating group 'users' with GID 100. >>> Creating group 'utmp' with GID 22. >>> Creating group 'video' with GID 39. >>> Creating group 'wheel' with GID 10. >>> Creating user 'adm' (adm) with UID 3 and GID 4. >>> Creating group 'bin' with GID 1. >>> Creating user 'bin' (bin) with UID 1 and GID 1. >>> Creating group 'daemon' with GID 2. >>> Creating user 'daemon' (daemon) with UID 2 and GID 2. >>> Creating user 'ftp' (FTP User) with UID 14 and GID 50. >>> Creating user 'games' (games) with UID 12 and GID 100. >>> Creating user 'halt' (halt) with UID 7 and GID 0. >>> Creating user 'lp' (lp) with UID 4 and GID 7. >>> Creating user 'mail' (mail) with UID 8 and GID 12. >>> Creating user 'nobody' (Kernel Overflow User) with UID 65534 and GID 6553 [ 11/186] Installing setup-0:2.15.0-28. 100% | 14.6 MiB/s | 730.6 KiB | 00m00s >>> [RPM] /etc/hosts created as /etc/hosts.rpmnew [ 12/186] Installing filesystem-0:3.18- 100% | 731.1 KiB/s | 212.8 KiB | 00m00s [ 13/186] Installing pkgconf-m4-0:2.5.1 100% | 14.4 MiB/s | 14.7 KiB | 00m00s [ 14/186] Installing pcre2-syntax-0:10. 100% | 69.4 MiB/s | 284.3 KiB | 00m00s [ 15/186] Installing gnulib-l10n-0:2024 100% | 53.9 MiB/s | 661.9 KiB | 00m00s [ 16/186] Installing coreutils-common-0 100% | 111.3 MiB/s | 10.7 MiB | 00m00s [ 17/186] Installing ncurses-base-0:6.6 100% | 19.3 MiB/s | 355.3 KiB | 00m00s [ 18/186] Installing bash-0:5.3.9-3.fc4 100% | 84.3 MiB/s | 8.9 MiB | 00m00s [ 19/186] Installing glibc-common-0:2.4 100% | 27.5 MiB/s | 1.5 MiB | 00m00s [ 20/186] Installing glibc-gconv-extra- 100% | 124.5 MiB/s | 18.5 MiB | 00m00s [ 21/186] Installing glibc-0:2.43-2.fc4 100% | 81.1 MiB/s | 11.8 MiB | 00m00s [ 22/186] Installing ncurses-libs-0:6.6 100% | 99.7 MiB/s | 1.5 MiB | 00m00s [ 23/186] Installing glibc-minimal-lang 100% | 121.1 KiB/s | 124.0 B | 00m00s [ 24/186] Installing zlib-ng-compat-0:2 100% | 64.5 MiB/s | 198.1 KiB | 00m00s [ 25/186] Installing bzip2-libs-0:1.0.8 100% | 44.8 MiB/s | 137.5 KiB | 00m00s [ 26/186] Installing libgpg-error-0:1.5 100% | 21.1 MiB/s | 1.0 MiB | 00m00s [ 27/186] Installing libstdc++-0:16.0.1 100% | 126.3 MiB/s | 3.9 MiB | 00m00s [ 28/186] Installing libassuan-0:2.5.7- 100% | 53.1 MiB/s | 217.6 KiB | 00m00s [ 29/186] Installing libgcrypt-0:1.12.1 100% | 105.0 MiB/s | 1.6 MiB | 00m00s [ 30/186] Installing readline-0:8.3-4.f 100% | 87.8 MiB/s | 629.5 KiB | 00m00s [ 31/186] Installing gmp-1:6.3.0-5.fc44 100% | 96.2 MiB/s | 788.3 KiB | 00m00s [ 32/186] Installing libuuid-0:2.41.3-1 100% | 34.3 MiB/s | 70.3 KiB | 00m00s [ 33/186] Installing xz-libs-1:5.8.2-2. 100% | 65.0 MiB/s | 266.3 KiB | 00m00s [ 34/186] Installing systemd-libs-0:259 100% | 118.5 MiB/s | 3.0 MiB | 00m00s [ 35/186] Installing popt-0:1.19-10.fc4 100% | 26.3 MiB/s | 215.2 KiB | 00m00s [ 36/186] Installing libzstd-0:1.5.7-5. 100% | 109.1 MiB/s | 1.1 MiB | 00m00s [ 37/186] Installing elfutils-libelf-0: 100% | 109.7 MiB/s | 1.2 MiB | 00m00s [ 38/186] Installing npth-0:1.8-4.fc44. 100% | 45.9 MiB/s | 94.1 KiB | 00m00s [ 39/186] Installing libblkid-0:2.41.3- 100% | 86.8 MiB/s | 355.5 KiB | 00m00s [ 40/186] Installing libxcrypt-0:4.5.2- 100% | 55.3 MiB/s | 339.6 KiB | 00m00s [ 41/186] Installing libsepol-0:3.10-1. 100% | 104.2 MiB/s | 1.0 MiB | 00m00s [ 42/186] Installing sqlite-libs-0:3.51 100% | 107.9 MiB/s | 1.9 MiB | 00m00s [ 43/186] Installing gnupg2-gpgconf-0:2 100% | 7.9 MiB/s | 323.6 KiB | 00m00s [ 44/186] Installing libattr-0:2.5.2-8. 100% | 33.7 MiB/s | 69.0 KiB | 00m00s [ 45/186] Installing libacl-0:2.3.2-6.f 100% | 33.4 MiB/s | 68.3 KiB | 00m00s [ 46/186] Installing pcre2-0:10.47-1.fc 100% | 102.9 MiB/s | 843.2 KiB | 00m00s [ 47/186] Installing libselinux-0:3.10- 100% | 65.0 MiB/s | 266.3 KiB | 00m00s [ 48/186] Installing grep-0:3.12-3.fc44 100% | 20.0 MiB/s | 1.0 MiB | 00m00s [ 49/186] Installing sed-0:4.9-7.fc44.p 100% | 18.8 MiB/s | 945.2 KiB | 00m00s [ 50/186] Installing findutils-1:4.10.0 100% | 35.3 MiB/s | 2.0 MiB | 00m00s [ 51/186] Installing libtasn1-0:4.20.0- 100% | 54.1 MiB/s | 221.7 KiB | 00m00s [ 52/186] Installing libunistring-0:1.1 100% | 117.0 MiB/s | 1.9 MiB | 00m00s [ 53/186] Installing libidn2-0:2.3.8-3. 100% | 29.1 MiB/s | 566.3 KiB | 00m00s [ 54/186] Installing crypto-policies-0: 100% | 9.1 MiB/s | 157.7 KiB | 00m00s [ 55/186] Installing xz-1:5.8.2-2.fc44. 100% | 24.9 MiB/s | 1.4 MiB | 00m00s [ 56/186] Installing libmount-0:2.41.3- 100% | 89.4 MiB/s | 549.3 KiB | 00m00s [ 57/186] Installing gnupg2-verify-0:2. 100% | 10.5 MiB/s | 429.5 KiB | 00m00s [ 58/186] Installing dwz-0:0.16-3.fc44. 100% | 9.7 MiB/s | 387.8 KiB | 00m00s [ 59/186] Installing mpfr-0:4.2.2-3.fc4 100% | 89.4 MiB/s | 915.1 KiB | 00m00s [ 60/186] Installing gawk-0:5.3.2-3.fc4 100% | 44.9 MiB/s | 2.8 MiB | 00m00s [ 61/186] Installing libksba-0:1.6.7-5. 100% | 86.1 MiB/s | 528.8 KiB | 00m00s [ 62/186] Installing unzip-0:6.0-69.fc4 100% | 12.5 MiB/s | 536.9 KiB | 00m00s [ 63/186] Installing file-libs-0:5.46-9 100% | 180.0 MiB/s | 11.9 MiB | 00m00s [ 64/186] Installing file-0:5.46-9.fc44 100% | 3.6 MiB/s | 141.5 KiB | 00m00s [ 65/186] Installing diffutils-0:3.12-5 100% | 31.2 MiB/s | 1.7 MiB | 00m00s [ 66/186] Installing libeconf-0:0.7.9-3 100% | 40.2 MiB/s | 82.4 KiB | 00m00s [ 67/186] Installing libcap-ng-0:0.9.1- 100% | 52.7 MiB/s | 162.0 KiB | 00m00s [ 68/186] Installing audit-libs-0:4.1.3 100% | 90.0 MiB/s | 552.7 KiB | 00m00s [ 69/186] Installing pam-libs-0:1.7.2-1 100% | 70.4 MiB/s | 288.4 KiB | 00m00s [ 70/186] Installing libcap-0:2.77-2.fc 100% | 11.6 MiB/s | 511.9 KiB | 00m00s [ 71/186] Installing libsemanage-0:3.10 100% | 83.1 MiB/s | 425.6 KiB | 00m00s [ 72/186] Installing libsmartcols-0:2.4 100% | 70.9 MiB/s | 290.4 KiB | 00m00s [ 73/186] Installing alternatives-0:1.3 100% | 2.4 MiB/s | 91.5 KiB | 00m00s [ 74/186] Installing lua-libs-0:5.4.8-5 100% | 77.2 MiB/s | 395.1 KiB | 00m00s [ 75/186] Installing libffi-0:3.5.2-2.f 100% | 85.2 MiB/s | 348.9 KiB | 00m00s [ 76/186] Installing p11-kit-0:0.26.2-1 100% | 45.9 MiB/s | 3.3 MiB | 00m00s [ 77/186] Installing p11-kit-trust-0:0. 100% | 11.4 MiB/s | 595.6 KiB | 00m00s [ 78/186] Installing json-c-0:0.18-8.fc 100% | 34.1 MiB/s | 139.7 KiB | 00m00s [ 79/186] Installing ngtcp2-0:1.19.0-2. 100% | 56.7 MiB/s | 406.6 KiB | 00m00s [ 80/186] Installing openssl-libs-1:3.5 100% | 109.8 MiB/s | 9.1 MiB | 00m00s [ 81/186] Installing coreutils-0:9.10-3 100% | 79.5 MiB/s | 9.5 MiB | 00m00s [ 82/186] Installing ca-certificates-0: 100% | 740.0 KiB/s | 2.5 MiB | 00m03s [ 83/186] Installing gzip-0:1.14-2.fc44 100% | 8.0 MiB/s | 442.9 KiB | 00m00s [ 84/186] Installing rpm-sequoia-0:1.10 100% | 128.8 MiB/s | 4.8 MiB | 00m00s [ 85/186] Installing libfsverity-0:1.6- 100% | 33.7 MiB/s | 69.0 KiB | 00m00s [ 86/186] Installing libevent-0:2.1.12- 100% | 115.6 MiB/s | 1.3 MiB | 00m00s [ 87/186] Installing ngtcp2-crypto-ossl 100% | 33.2 MiB/s | 68.0 KiB | 00m00s [ 88/186] Installing util-linux-core-0: 100% | 39.4 MiB/s | 2.5 MiB | 00m00s [ 89/186] Installing zip-0:3.0-45.fc44. 100% | 19.8 MiB/s | 893.0 KiB | 00m00s [ 90/186] Installing gnupg2-keyboxd-0:2 100% | 25.4 MiB/s | 234.4 KiB | 00m00s [ 91/186] Installing libpsl-0:0.21.5-7. 100% | 43.3 MiB/s | 133.1 KiB | 00m00s [ 92/186] Installing tar-2:1.35-8.fc44. 100% | 48.2 MiB/s | 3.1 MiB | 00m00s [ 93/186] Installing linkdupes-0:0.7.2- 100% | 19.7 MiB/s | 907.1 KiB | 00m00s [ 94/186] Installing libselinux-utils-0 100% | 27.1 MiB/s | 1.4 MiB | 00m00s [ 95/186] Installing liblastlog2-0:2.41 100% | 17.0 MiB/s | 139.2 KiB | 00m00s [ 96/186] Installing systemd-standalone 100% | 9.9 MiB/s | 394.3 KiB | 00m00s [ 97/186] Installing rpm-libs-0:6.0.1-2 100% | 111.2 MiB/s | 1.2 MiB | 00m00s [ 98/186] Installing libfdisk-0:2.41.3- 100% | 78.8 MiB/s | 484.0 KiB | 00m00s [ 99/186] Installing zstd-0:1.5.7-5.fc4 100% | 12.8 MiB/s | 565.6 KiB | 00m00s [100/186] Installing libusb1-0:1.0.29-5 100% | 17.0 MiB/s | 244.3 KiB | 00m00s >>> Running sysusers scriptlet: tpm2-tss-0:4.1.3-9.fc44.ppc64le >>> Finished sysusers scriptlet: tpm2-tss-0:4.1.3-9.fc44.ppc64le >>> Scriptlet output: >>> Creating group 'tss' with GID 59. >>> Creating user 'tss' (Account used for TPM access) with UID 59 and GID 59. >>> [101/186] Installing tpm2-tss-0:4.1.3-9 100% | 109.3 MiB/s | 2.4 MiB | 00m00s [102/186] Installing ima-evm-utils-libs 100% | 45.8 MiB/s | 93.8 KiB | 00m00s [103/186] Installing gnupg2-gpg-agent-0 100% | 18.7 MiB/s | 977.9 KiB | 00m00s [104/186] Installing libxml2-0:2.12.10- 100% | 40.5 MiB/s | 2.3 MiB | 00m00s [105/186] Installing nettle-0:3.10.1-3. 100% | 104.2 MiB/s | 960.5 KiB | 00m00s [106/186] Installing gnutls-0:3.8.12-1. 100% | 118.0 MiB/s | 4.0 MiB | 00m00s [107/186] Installing bzip2-0:1.0.8-23.f 100% | 4.3 MiB/s | 175.4 KiB | 00m00s [108/186] Installing add-determinism-0: 100% | 41.5 MiB/s | 2.3 MiB | 00m00s [109/186] Installing cpio-0:2.15-9.fc44 100% | 23.2 MiB/s | 1.2 MiB | 00m00s [110/186] Installing ed-0:1.22.5-2.fc44 100% | 5.6 MiB/s | 223.9 KiB | 00m00s [111/186] Installing patch-0:2.8-4.fc44 100% | 6.6 MiB/s | 263.8 KiB | 00m00s [112/186] Installing librtas-0:2.0.6-6. 100% | 18.8 MiB/s | 307.4 KiB | 00m00s [113/186] Installing util-linux-0:2.41. 100% | 56.2 MiB/s | 7.0 MiB | 00m00s [114/186] Installing policycoreutils-0: 100% | 20.1 MiB/s | 1.5 MiB | 00m00s [115/186] Installing selinux-policy-0:4 100% | 1.0 MiB/s | 33.6 KiB | 00m00s [116/186] Installing selinux-policy-tar 100% | 48.0 MiB/s | 14.8 MiB | 00m00s [117/186] Installing build-reproducibil 100% | 1.5 MiB/s | 1.5 KiB | 00m00s [118/186] Installing jansson-0:2.14-4.f 100% | 51.5 MiB/s | 158.3 KiB | 00m00s [119/186] Installing lz4-libs-0:1.10.0- 100% | 64.0 MiB/s | 262.1 KiB | 00m00s [120/186] Installing libarchive-0:3.8.4 100% | 97.4 MiB/s | 1.3 MiB | 00m00s [121/186] Installing libgomp-0:16.0.1-0 100% | 91.8 MiB/s | 658.1 KiB | 00m00s [122/186] Installing libpkgconf-0:2.5.1 100% | 44.0 MiB/s | 135.0 KiB | 00m00s [123/186] Installing pkgconf-0:2.5.1-1. 100% | 2.8 MiB/s | 119.1 KiB | 00m00s [124/186] Installing pkgconf-pkg-config 100% | 47.9 KiB/s | 1.8 KiB | 00m00s [125/186] Installing libtool-ltdl-0:2.5 100% | 46.3 MiB/s | 94.9 KiB | 00m00s [126/186] Installing gdbm-libs-1:1.23-1 100% | 57.4 MiB/s | 235.0 KiB | 00m00s [127/186] Installing cyrus-sasl-lib-0:2 100% | 48.6 MiB/s | 2.9 MiB | 00m00s [128/186] Installing openldap-0:2.6.10- 100% | 79.3 MiB/s | 893.4 KiB | 00m00s [129/186] Installing gnupg2-dirmngr-0:2 100% | 16.1 MiB/s | 840.5 KiB | 00m00s [130/186] Installing gnupg2-0:2.4.9-5.f 100% | 72.7 MiB/s | 6.8 MiB | 00m00s [131/186] Installing rpm-sign-libs-0:6. 100% | 33.4 MiB/s | 68.4 KiB | 00m00s [132/186] Installing gpgverify-0:2.2-4. 100% | 9.2 MiB/s | 9.4 KiB | 00m00s [133/186] Installing xxhash-libs-0:0.8. 100% | 42.4 MiB/s | 86.9 KiB | 00m00s [134/186] Installing libbrotli-0:1.2.0- 100% | 92.2 MiB/s | 1.0 MiB | 00m00s [135/186] Installing libnghttp2-0:1.68. 100% | 64.8 MiB/s | 198.9 KiB | 00m00s [136/186] Installing libnghttp3-0:1.15. 100% | 67.7 MiB/s | 207.9 KiB | 00m00s [137/186] Installing keyutils-libs-0:1. 100% | 32.3 MiB/s | 99.3 KiB | 00m00s [138/186] Installing libcom_err-0:1.47. 100% | 54.7 MiB/s | 112.0 KiB | 00m00s [139/186] Installing libverto-0:0.3.2-1 100% | 23.0 MiB/s | 70.8 KiB | 00m00s [140/186] Installing krb5-libs-0:1.22.2 100% | 102.4 MiB/s | 3.0 MiB | 00m00s [141/186] Installing libcbor-0:0.13.0-2 100% | 45.9 MiB/s | 140.9 KiB | 00m00s [142/186] Installing libfido2-0:1.16.0- 100% | 67.2 MiB/s | 344.0 KiB | 00m00s [143/186] Installing libssh-0:0.12.0-1. 100% | 99.1 MiB/s | 913.1 KiB | 00m00s [144/186] Installing libcurl-0:8.18.0-4 100% | 100.8 MiB/s | 1.2 MiB | 00m00s [145/186] Installing curl-0:8.18.0-4.fc 100% | 9.3 MiB/s | 530.7 KiB | 00m00s [146/186] Installing rpm-0:6.0.1-2.fc44 100% | 30.0 MiB/s | 2.8 MiB | 00m00s [147/186] Installing cmake-srpm-macros- 100% | 785.2 KiB/s | 804.0 B | 00m00s [148/186] Installing efi-srpm-macros-0: 100% | 20.1 MiB/s | 41.2 KiB | 00m00s [149/186] Installing java-srpm-macros-0 100% | 1.1 MiB/s | 1.1 KiB | 00m00s [150/186] Installing lua-srpm-macros-0: 100% | 1.9 MiB/s | 1.9 KiB | 00m00s [151/186] Installing tree-sitter-srpm-m 100% | 4.5 MiB/s | 9.3 KiB | 00m00s [152/186] Installing zig-srpm-macros-0: 100% | 1.8 MiB/s | 1.9 KiB | 00m00s [153/186] Installing filesystem-srpm-ma 100% | 19.0 MiB/s | 38.9 KiB | 00m00s [154/186] Installing elfutils-default-y 100% | 340.5 KiB/s | 2.0 KiB | 00m00s [155/186] Installing elfutils-libs-0:0. 100% | 85.6 MiB/s | 876.2 KiB | 00m00s [156/186] Installing elfutils-debuginfo 100% | 3.5 MiB/s | 145.6 KiB | 00m00s [157/186] Installing binutils-0:2.46-1. 100% | 115.7 MiB/s | 32.6 MiB | 00m00s [158/186] Installing elfutils-0:0.194-5 100% | 54.8 MiB/s | 3.5 MiB | 00m00s [159/186] Installing gdb-minimal-0:17.1 100% | 103.1 MiB/s | 16.3 MiB | 00m00s [160/186] Installing debugedit-0:5.2-6. 100% | 9.0 MiB/s | 385.3 KiB | 00m00s [161/186] Installing rpm-build-libs-0:6 100% | 80.3 MiB/s | 328.7 KiB | 00m00s [162/186] Installing rust-srpm-macros-0 100% | 6.2 MiB/s | 6.4 KiB | 00m00s [163/186] Installing qt6-srpm-macros-0: 100% | 730.5 KiB/s | 748.0 B | 00m00s [164/186] Installing qt5-srpm-macros-0: 100% | 757.8 KiB/s | 776.0 B | 00m00s [165/186] Installing perl-srpm-macros-0 100% | 1.1 MiB/s | 1.1 KiB | 00m00s [166/186] Installing package-notes-srpm 100% | 2.0 MiB/s | 2.0 KiB | 00m00s [167/186] Installing openblas-srpm-macr 100% | 382.8 KiB/s | 392.0 B | 00m00s [168/186] Installing ocaml-srpm-macros- 100% | 2.1 MiB/s | 2.1 KiB | 00m00s [169/186] Installing kernel-srpm-macros 100% | 2.3 MiB/s | 2.3 KiB | 00m00s [170/186] Installing gnat-srpm-macros-0 100% | 1.2 MiB/s | 1.3 KiB | 00m00s [171/186] Installing ghc-srpm-macros-0: 100% | 1.0 MiB/s | 1.0 KiB | 00m00s [172/186] Installing gap-srpm-macros-0: 100% | 2.6 MiB/s | 2.7 KiB | 00m00s [173/186] Installing fpc-srpm-macros-0: 100% | 410.2 KiB/s | 420.0 B | 00m00s [174/186] Installing ansible-srpm-macro 100% | 17.7 MiB/s | 36.2 KiB | 00m00s [175/186] Installing redhat-rpm-config- 100% | 26.5 MiB/s | 189.9 KiB | 00m00s [176/186] Installing forge-srpm-macros- 100% | 19.7 MiB/s | 40.3 KiB | 00m00s [177/186] Installing fonts-srpm-macros- 100% | 27.8 MiB/s | 57.0 KiB | 00m00s [178/186] Installing go-srpm-macros-0:3 100% | 20.5 MiB/s | 63.0 KiB | 00m00s [179/186] Installing rpm-build-0:6.0.1- 100% | 14.0 MiB/s | 671.6 KiB | 00m00s [180/186] Installing pyproject-srpm-mac 100% | 2.4 MiB/s | 2.5 KiB | 00m00s [181/186] Installing R-srpm-macros-0:1. 100% | 4.3 MiB/s | 4.4 KiB | 00m00s [182/186] Installing python-srpm-macros 100% | 4.7 MiB/s | 52.9 KiB | 00m00s [183/186] Installing rpm-plugin-selinux 100% | 33.6 MiB/s | 68.8 KiB | 00m00s [184/186] Installing which-0:2.23-4.fc4 100% | 2.8 MiB/s | 125.4 KiB | 00m00s [185/186] Installing shadow-utils-2:4.1 100% | 45.6 MiB/s | 4.9 MiB | 00m00s [186/186] Installing info-0:7.2-9.fc44. 100% | 34.0 KiB/s | 485.6 KiB | 00m14s Complete! Finish: installing minimal buildroot with dnf5 Start: creating root cache Finish: creating root cache Finish: chroot init INFO: Installed packages: INFO: R-srpm-macros-1.3.5-1.fc44.noarch add-determinism-0.7.2-4.fc44.ppc64le alternatives-1.33-5.fc44.ppc64le ansible-srpm-macros-1-20.1.fc44.noarch audit-libs-4.1.3-1.fc44.ppc64le bash-5.3.9-3.fc44.ppc64le binutils-2.46-1.fc44.ppc64le build-reproducibility-srpm-macros-0.7.2-4.fc44.noarch bzip2-1.0.8-23.fc44.ppc64le bzip2-libs-1.0.8-23.fc44.ppc64le ca-certificates-2025.2.80_v9.0.304-6.fc44.noarch cmake-srpm-macros-4.3.0-1.fc44.noarch coreutils-9.10-3.fc44.ppc64le coreutils-common-9.10-3.fc44.ppc64le cpio-2.15-9.fc44.ppc64le crypto-policies-20251128-3.git19878fe.fc44.noarch curl-8.18.0-4.fc44.ppc64le cyrus-sasl-lib-2.1.28-35.fc44.ppc64le debugedit-5.2-6.fc44.ppc64le diffutils-3.12-5.fc44.ppc64le dwz-0.16-3.fc44.ppc64le ed-1.22.5-2.fc44.ppc64le efi-srpm-macros-6-6.fc44.noarch elfutils-0.194-5.fc44.ppc64le elfutils-debuginfod-client-0.194-5.fc44.ppc64le elfutils-default-yama-scope-0.194-5.fc44.noarch elfutils-libelf-0.194-5.fc44.ppc64le elfutils-libs-0.194-5.fc44.ppc64le fedora-gpg-keys-44-0.3.noarch fedora-release-44-0.15.noarch fedora-release-common-44-0.15.noarch fedora-release-identity-basic-44-0.15.noarch fedora-repos-44-0.3.noarch file-5.46-9.fc44.ppc64le file-libs-5.46-9.fc44.ppc64le filesystem-3.18-52.fc44.ppc64le filesystem-srpm-macros-3.18-52.fc44.noarch findutils-4.10.0-7.fc44.ppc64le fonts-srpm-macros-5.0.0-2.fc44.noarch forge-srpm-macros-0.4.0-4.fc44.noarch fpc-srpm-macros-1.3-16.fc44.noarch gap-srpm-macros-2-2.fc44.noarch gawk-5.3.2-3.fc44.ppc64le gdb-minimal-17.1-4.fc44.ppc64le gdbm-libs-1.23-11.fc44.ppc64le ghc-srpm-macros-1.10-1.fc44.noarch glibc-2.43-2.fc44.ppc64le glibc-common-2.43-2.fc44.ppc64le glibc-gconv-extra-2.43-2.fc44.ppc64le glibc-minimal-langpack-2.43-2.fc44.ppc64le gmp-6.3.0-5.fc44.ppc64le gnat-srpm-macros-7-2.fc44.noarch gnulib-l10n-20241231-2.fc44.noarch gnupg2-2.4.9-5.fc44.ppc64le gnupg2-dirmngr-2.4.9-5.fc44.ppc64le gnupg2-gpg-agent-2.4.9-5.fc44.ppc64le gnupg2-gpgconf-2.4.9-5.fc44.ppc64le gnupg2-keyboxd-2.4.9-5.fc44.ppc64le gnupg2-verify-2.4.9-5.fc44.ppc64le gnutls-3.8.12-1.fc44.ppc64le go-srpm-macros-3.8.0-2.fc44.noarch gpg-pubkey-36f612dcf27f7d1a48a835e4dbfcf71c6d9f90a6-6786af3b gpgverify-2.2-4.fc44.noarch grep-3.12-3.fc44.ppc64le gzip-1.14-2.fc44.ppc64le ima-evm-utils-libs-1.6.2-8.fc44.ppc64le info-7.2-9.fc44.ppc64le jansson-2.14-4.fc44.ppc64le java-srpm-macros-1-8.fc44.noarch json-c-0.18-8.fc44.ppc64le kernel-srpm-macros-1.0-28.fc44.noarch keyutils-libs-1.6.3-7.fc44.ppc64le krb5-libs-1.22.2-2.fc44.ppc64le libacl-2.3.2-6.fc44.ppc64le libarchive-3.8.4-2.fc44.ppc64le libassuan-2.5.7-5.fc44.ppc64le libattr-2.5.2-8.fc44.ppc64le libblkid-2.41.3-12.fc44.ppc64le libbrotli-1.2.0-3.fc44.ppc64le libcap-2.77-2.fc44.ppc64le libcap-ng-0.9.1-1.fc44.ppc64le libcbor-0.13.0-2.fc44.ppc64le libcom_err-1.47.3-4.fc44.ppc64le libcurl-8.18.0-4.fc44.ppc64le libeconf-0.7.9-3.fc44.ppc64le libevent-2.1.12-17.fc44.ppc64le libfdisk-2.41.3-12.fc44.ppc64le libffi-3.5.2-2.fc44.ppc64le libfido2-1.16.0-5.fc44.ppc64le libfsverity-1.6-4.fc44.ppc64le libgcc-16.0.1-0.10.fc44.ppc64le libgcrypt-1.12.1-1.fc44.ppc64le libgomp-16.0.1-0.10.fc44.ppc64le libgpg-error-1.58-2.fc44.ppc64le libidn2-2.3.8-3.fc44.ppc64le libksba-1.6.7-5.fc44.ppc64le liblastlog2-2.41.3-12.fc44.ppc64le libmount-2.41.3-12.fc44.ppc64le libnghttp2-1.68.0-3.fc44.ppc64le libnghttp3-1.15.0-1.fc44.ppc64le libpkgconf-2.5.1-1.fc44.ppc64le libpsl-0.21.5-7.fc44.ppc64le librtas-2.0.6-6.fc44.ppc64le libselinux-3.10-1.fc44.ppc64le libselinux-utils-3.10-1.fc44.ppc64le libsemanage-3.10-1.fc44.ppc64le libsepol-3.10-1.fc44.ppc64le libsmartcols-2.41.3-12.fc44.ppc64le libssh-0.12.0-1.fc44.ppc64le libssh-config-0.12.0-1.fc44.noarch libstdc++-16.0.1-0.10.fc44.ppc64le libtasn1-4.20.0-3.fc44.ppc64le libtool-ltdl-2.5.4-10.fc44.ppc64le libunistring-1.1-11.fc44.ppc64le libusb1-1.0.29-5.fc44.ppc64le libuuid-2.41.3-12.fc44.ppc64le libverto-0.3.2-12.fc44.ppc64le libxcrypt-4.5.2-3.fc44.ppc64le libxml2-2.12.10-6.fc44.ppc64le libzstd-1.5.7-5.fc44.ppc64le linkdupes-0.7.2-4.fc44.ppc64le lua-libs-5.4.8-5.fc44.ppc64le lua-srpm-macros-1-17.fc44.noarch lz4-libs-1.10.0-4.fc44.ppc64le mpfr-4.2.2-3.fc44.ppc64le ncurses-base-6.6-1.fc44.noarch ncurses-libs-6.6-1.fc44.ppc64le nettle-3.10.1-3.fc44.ppc64le ngtcp2-1.19.0-2.fc44.ppc64le ngtcp2-crypto-ossl-1.19.0-2.fc44.ppc64le npth-1.8-4.fc44.ppc64le ocaml-srpm-macros-11-3.fc44.noarch openblas-srpm-macros-2-21.fc44.noarch openldap-2.6.10-7.fc44.ppc64le openssl-libs-3.5.5-1.fc44.ppc64le p11-kit-0.26.2-1.fc44.ppc64le p11-kit-trust-0.26.2-1.fc44.ppc64le package-notes-srpm-macros-0.5-16.fc44.noarch pam-libs-1.7.2-1.fc44.ppc64le patch-2.8-4.fc44.ppc64le pcre2-10.47-1.fc44.1.ppc64le pcre2-syntax-10.47-1.fc44.1.noarch perl-srpm-macros-1-61.fc44.noarch pkgconf-2.5.1-1.fc44.ppc64le pkgconf-m4-2.5.1-1.fc44.noarch pkgconf-pkg-config-2.5.1-1.fc44.ppc64le policycoreutils-3.10-1.fc44.ppc64le popt-1.19-10.fc44.ppc64le publicsuffix-list-dafsa-20260116-1.fc44.noarch pyproject-srpm-macros-1.18.7-1.fc44.noarch python-srpm-macros-3.14-10.fc44.noarch qt5-srpm-macros-5.15.18-2.fc44.noarch qt6-srpm-macros-6.10.2-1.fc44.noarch readline-8.3-4.fc44.ppc64le redhat-rpm-config-343-19.fc44.noarch rpm-6.0.1-2.fc44.ppc64le rpm-build-6.0.1-2.fc44.ppc64le rpm-build-libs-6.0.1-2.fc44.ppc64le rpm-libs-6.0.1-2.fc44.ppc64le rpm-plugin-selinux-6.0.1-2.fc44.ppc64le rpm-sequoia-1.10.1-1.fc44.ppc64le rpm-sign-libs-6.0.1-2.fc44.ppc64le rust-srpm-macros-28.4-3.fc44.noarch sed-4.9-7.fc44.ppc64le selinux-policy-43.1-1.fc44.noarch selinux-policy-targeted-43.1-1.fc44.noarch setup-2.15.0-28.fc44.noarch shadow-utils-4.19.0-6.fc44.ppc64le sqlite-libs-3.51.2-1.fc44.ppc64le systemd-libs-259.5-1.fc44.ppc64le systemd-standalone-sysusers-259.5-1.fc44.ppc64le tar-1.35-8.fc44.ppc64le tpm2-tss-4.1.3-9.fc44.ppc64le tree-sitter-srpm-macros-0.4.2-2.fc44.noarch unzip-6.0-69.fc44.ppc64le util-linux-2.41.3-12.fc44.ppc64le util-linux-core-2.41.3-12.fc44.ppc64le which-2.23-4.fc44.ppc64le xxhash-libs-0.8.3-4.fc44.ppc64le xz-5.8.2-2.fc44.ppc64le xz-libs-5.8.2-2.fc44.ppc64le zig-srpm-macros-1-8.fc44.noarch zip-3.0-45.fc44.ppc64le zlib-ng-compat-2.3.3-3.fc44.ppc64le zstd-1.5.7-5.fc44.ppc64le Start: buildsrpm Start: rpmbuild -bs Building target platforms: ppc64le Building for target ppc64le Reading /var/tmp/rpm-tmp.An5PoJ setting SOURCE_DATE_EPOCH=1774656000 Wrote: /builddir/build/SRPMS/python-git-changelog-2.9.3-1.fc44.src.rpm Finish: rpmbuild -bs INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-44-ppc64le-1774705104.621530/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names Finish: buildsrpm INFO: Done(/var/lib/copr-rpmbuild/workspace/workdir-yn7e4655/python-git-changelog/python-git-changelog.spec) Config(child) 0 minutes 55 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_success=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot INFO: Start(/var/lib/copr-rpmbuild/results/python-git-changelog-2.9.3-1.fc44.src.rpm) Config(fedora-44-ppc64le) Start(bootstrap): chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-44-ppc64le-bootstrap-1774705104.621530/root. INFO: reusing tmpfs at /var/lib/mock/fedora-44-ppc64le-bootstrap-1774705104.621530/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start(bootstrap): cleaning package manager metadata Finish(bootstrap): cleaning package manager metadata Finish(bootstrap): chroot init Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-44-ppc64le-1774705104.621530/root. INFO: calling preinit hooks INFO: enabled root cache Start: unpacking root cache Finish: unpacking root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Buildroot is handled by package management downloaded with a bootstrap image: rpm-6.0.1-2.fc44.ppc64le rpm-sequoia-1.10.1-1.fc44.ppc64le dnf5-5.4.0.0-3.fc44.ppc64le dnf5-plugins-5.4.0.0-3.fc44.ppc64le Finish: chroot init Start: build phase for python-git-changelog-2.9.3-1.fc44.src.rpm Start: build setup for python-git-changelog-2.9.3-1.fc44.src.rpm Building target platforms: ppc64le Building for target ppc64le Reading /var/tmp/rpm-tmp.14LnBz setting SOURCE_DATE_EPOCH=1774656000 Wrote: /builddir/build/SRPMS/python-git-changelog-2.9.3-1.fc44.src.rpm Updating and loading repositories: updates 100% | 25.0 KiB/s | 8.4 KiB | 00m00s fedora 100% | 29.9 KiB/s | 8.4 KiB | 00m00s Copr repository 100% | 6.3 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing: git-core ppc64le 0:2.53.0-1.fc44 fedora 28.0 MiB python3-pytest noarch 0:8.4.2-2.fc44 fedora 22.5 MiB python3-pytest-gitconfig noarch 0:0.9.0-1.fc44 fedora 36.5 KiB Installing dependencies: expat ppc64le 0:2.7.3-2.fc44 fedora 424.5 KiB less ppc64le 0:691-2.fc44 fedora 660.1 KiB libedit ppc64le 0:3.1-58.20251016cvs.fc44 fedora 344.0 KiB mpdecimal ppc64le 0:4.0.1-3.fc44 fedora 281.1 KiB openssh ppc64le 0:10.2p1-6.fc44 fedora 1.5 MiB openssh-clients ppc64le 0:10.2p1-6.fc44 fedora 3.2 MiB python-pip-wheel noarch 0:26.0.1-2.fc44 fedora 1.2 MiB python3 ppc64le 0:3.14.3-1.fc44 fedora 84.6 KiB python3-iniconfig noarch 0:2.3.0-2.fc44 fedora 49.8 KiB python3-libs ppc64le 0:3.14.3-1.fc44 fedora 46.7 MiB python3-packaging noarch 0:25.0-8.fc44 fedora 607.4 KiB python3-pluggy noarch 0:1.6.0-5.fc44 fedora 211.5 KiB python3-pygments noarch 0:2.19.1-9.fc44 fedora 11.3 MiB tzdata noarch 0:2025c-2.fc44 fedora 1.2 MiB Transaction Summary: Installing: 17 packages Total size of inbound packages is 25 MiB. Need to download 25 MiB. After this operation, 118 MiB extra will be used (install 118 MiB, remove 0 B). [ 1/17] python3-pytest-gitconfig-0:0.9. 100% | 569.4 KiB/s | 20.5 KiB | 00m00s [ 2/17] expat-0:2.7.3-2.fc44.ppc64le 100% | 18.0 MiB/s | 129.0 KiB | 00m00s [ 3/17] less-0:691-2.fc44.ppc64le 100% | 37.6 MiB/s | 231.2 KiB | 00m00s [ 4/17] python3-pytest-0:8.4.2-2.fc44.n 100% | 35.1 MiB/s | 2.3 MiB | 00m00s [ 5/17] python3-0:3.14.3-1.fc44.ppc64le 100% | 13.8 MiB/s | 28.2 KiB | 00m00s [ 6/17] openssh-clients-0:10.2p1-6.fc44 100% | 34.6 MiB/s | 815.8 KiB | 00m00s [ 7/17] python3-iniconfig-0:2.3.0-2.fc4 100% | 6.4 MiB/s | 26.3 KiB | 00m00s [ 8/17] python3-pluggy-0:1.6.0-5.fc44.n 100% | 20.1 MiB/s | 61.6 KiB | 00m00s [ 9/17] git-core-0:2.53.0-1.fc44.ppc64l 100% | 52.9 MiB/s | 5.6 MiB | 00m00s [10/17] python3-packaging-0:25.0-8.fc44 100% | 5.1 MiB/s | 161.2 KiB | 00m00s [11/17] libedit-0:3.1-58.20251016cvs.fc 100% | 23.4 MiB/s | 119.7 KiB | 00m00s [12/17] openssh-0:10.2p1-6.fc44.ppc64le 100% | 44.6 MiB/s | 365.8 KiB | 00m00s [13/17] mpdecimal-0:4.0.1-3.fc44.ppc64l 100% | 36.3 MiB/s | 111.4 KiB | 00m00s [14/17] python3-pygments-0:2.19.1-9.fc4 100% | 46.0 MiB/s | 2.7 MiB | 00m00s [15/17] python-pip-wheel-0:26.0.1-2.fc4 100% | 39.6 MiB/s | 1.1 MiB | 00m00s [16/17] tzdata-0:2025c-2.fc44.noarch 100% | 46.5 MiB/s | 714.3 KiB | 00m00s [17/17] python3-libs-0:3.14.3-1.fc44.pp 100% | 87.4 MiB/s | 10.0 MiB | 00m00s -------------------------------------------------------------------------------- [17/17] Total 100% | 106.1 MiB/s | 24.5 MiB | 00m00s Running transaction [ 1/19] Verify package files 100% | 47.0 B/s | 17.0 B | 00m00s [ 2/19] Prepare transaction 100% | 116.0 B/s | 17.0 B | 00m00s [ 3/19] Installing expat-0:2.7.3-2.fc44 100% | 7.7 MiB/s | 426.6 KiB | 00m00s [ 4/19] Installing tzdata-0:2025c-2.fc4 100% | 11.5 MiB/s | 1.5 MiB | 00m00s [ 5/19] Installing python-pip-wheel-0:2 100% | 152.8 MiB/s | 1.2 MiB | 00m00s [ 6/19] Installing mpdecimal-0:4.0.1-3. 100% | 16.2 MiB/s | 282.7 KiB | 00m00s [ 7/19] Installing python3-libs-0:3.14. 100% | 101.2 MiB/s | 47.1 MiB | 00m00s [ 8/19] Installing python3-0:3.14.3-1.f 100% | 2.1 MiB/s | 86.4 KiB | 00m00s [ 9/19] Installing python3-iniconfig-0: 100% | 13.2 MiB/s | 54.1 KiB | 00m00s [10/19] Installing python3-packaging-0: 100% | 60.5 MiB/s | 619.9 KiB | 00m00s [11/19] Installing python3-pluggy-0:1.6 100% | 19.3 MiB/s | 217.9 KiB | 00m00s [12/19] Installing python3-pygments-0:2 100% | 61.4 MiB/s | 11.5 MiB | 00m00s [13/19] Installing python3-pytest-0:8.4 100% | 99.0 MiB/s | 22.7 MiB | 00m00s [14/19] Installing openssh-0:10.2p1-6.f 100% | 29.7 MiB/s | 1.5 MiB | 00m00s [15/19] Installing libedit-0:3.1-58.202 100% | 67.5 MiB/s | 345.7 KiB | 00m00s [16/19] Installing openssh-clients-0:10 100% | 45.6 MiB/s | 3.2 MiB | 00m00s [17/19] Installing less-0:691-2.fc44.pp 100% | 14.1 MiB/s | 663.8 KiB | 00m00s [18/19] Installing git-core-0:2.53.0-1. 100% | 117.2 MiB/s | 28.0 MiB | 00m00s [19/19] Installing python3-pytest-gitco 100% | 568.0 KiB/s | 40.3 KiB | 00m00s Complete! Building target platforms: ppc64le Building for target ppc64le Reading /var/tmp/rpm-tmp.xVWM9K setting SOURCE_DATE_EPOCH=1774656000 Wrote: /builddir/build/SRPMS/python-git-changelog-2.9.3-1.fc44.src.rpm Updating and loading repositories: updates 100% | 26.6 KiB/s | 8.4 KiB | 00m00s fedora 100% | 31.0 KiB/s | 8.4 KiB | 00m00s Copr repository 100% | 6.5 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Nothing to do. Package "git-core-2.53.0-1.fc44.ppc64le" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-gitconfig-0.9.0-1.fc44.noarch" is already installed. Finish: build setup for python-git-changelog-2.9.3-1.fc44.src.rpm Start: rpmbuild python-git-changelog-2.9.3-1.fc44.src.rpm Building target platforms: ppc64le Building for target ppc64le Reading /var/tmp/rpm-tmp.zu9qn5 setting SOURCE_DATE_EPOCH=1774656000 Executing(%mkbuilddir): /bin/sh -e /var/tmp/rpm-tmp.mfclda Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.j1QGYn + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + rm -rf git-changelog-2.9.3 + /usr/lib/rpm/rpmuncompress -x -C git-changelog-2.9.3 /builddir/build/SOURCES/git-changelog-2.9.3.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd git-changelog-2.9.3 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + /usr/bin/git init -q + /usr/bin/git config user.name rpm-build + /usr/bin/git config user.email '' + /usr/bin/git config gc.auto 0 + /usr/bin/git add --force . + GIT_COMMITTER_DATE=@1774656000 + GIT_AUTHOR_DATE=@1774656000 + /usr/bin/git commit -q --no-gpg-sign --allow-empty -a --author 'rpm-build ' -m 'python-git-changelog-2.9.3 base' + /usr/bin/git checkout --track -b rpm-build Switched to a new branch 'rpm-build' branch 'rpm-build' set up to track 'master'. + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + rm -rf git-changelog-2.9.3 + /usr/lib/rpm/rpmuncompress -x /builddir/build/SOURCES/git-changelog-2.9.3.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd git-changelog-2.9.3 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + /usr/bin/git init -q + /usr/bin/git config user.name rpm-build + /usr/bin/git config user.email '' + /usr/bin/git config gc.auto 0 + /usr/bin/git add --force . + GIT_COMMITTER_DATE=@1774656000 + GIT_AUTHOR_DATE=@1774656000 + /usr/bin/git commit -q --no-gpg-sign --allow-empty -a --author 'rpm-build ' -m 'python-git-changelog-2.9.3 base' + /usr/bin/git checkout --track -b rpm-build Switched to a new branch 'rpm-build' branch 'rpm-build' set up to track 'master'. + git tag 2.9.3 + sed -i 's/"packaging.*"/"packaging"/' pyproject.toml + RPM_EC=0 ++ jobs -p + exit 0 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.wAEbKk + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + cd git-changelog-2.9.3 + echo pyproject-rpm-macros + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-git-changelog-2.9.3-1.fc44.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: updates 100% | 33.6 KiB/s | 8.4 KiB | 00m00s fedora 100% | 39.7 KiB/s | 8.4 KiB | 00m00s Copr repository 100% | 8.8 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing: pyproject-rpm-macros noarch 0:1.18.7-1.fc44 fedora 115.5 KiB Installing dependencies: python-rpm-macros noarch 0:3.14-10.fc44 fedora 27.6 KiB python3-rpm-macros noarch 0:3.14-10.fc44 fedora 6.5 KiB Transaction Summary: Installing: 3 packages Package "git-core-2.53.0-1.fc44.ppc64le" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-gitconfig-0.9.0-1.fc44.noarch" is already installed. Total size of inbound packages is 77 KiB. Need to download 77 KiB. After this operation, 150 KiB extra will be used (install 150 KiB, remove 0 B). [1/3] python3-rpm-macros-0:3.14-10.fc44 100% | 385.7 KiB/s | 12.3 KiB | 00m00s [2/3] pyproject-rpm-macros-0:1.18.7-1.f 100% | 1.2 MiB/s | 44.4 KiB | 00m00s [3/3] python-rpm-macros-0:3.14-10.fc44. 100% | 534.7 KiB/s | 19.8 KiB | 00m00s -------------------------------------------------------------------------------- [3/3] Total 100% | 2.0 MiB/s | 76.5 KiB | 00m00s Running transaction [1/5] Verify package files 100% | 2.9 KiB/s | 3.0 B | 00m00s [2/5] Prepare transaction 100% | 157.0 B/s | 3.0 B | 00m00s [3/5] Installing python-rpm-macros-0:3. 100% | 13.9 MiB/s | 28.5 KiB | 00m00s [4/5] Installing python3-rpm-macros-0:3 100% | 6.6 MiB/s | 6.8 KiB | 00m00s [5/5] Installing pyproject-rpm-macros-0 100% | 2.9 MiB/s | 117.5 KiB | 00m00s Complete! Building target platforms: ppc64le Building for target ppc64le Reading /var/tmp/rpm-tmp.Mp1syW setting SOURCE_DATE_EPOCH=1774656000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.ybCaPL + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + cd git-changelog-2.9.3 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=44 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir --output /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-buildrequires Handling pdm-backend from build-system.requires Requirement not satisfied: pdm-backend Exiting dependency generation pass: build backend + cat /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-buildrequires + rm -rfv '*.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-git-changelog-2.9.3-1.fc44.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: updates 100% | 30.8 KiB/s | 8.4 KiB | 00m00s fedora 100% | 38.9 KiB/s | 8.4 KiB | 00m00s Copr repository 100% | 8.5 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "git-core-2.53.0-1.fc44.ppc64le" is already installed. Package "pyproject-rpm-macros-1.18.7-1.fc44.noarch" is already installed. Package "python3-packaging-25.0-8.fc44.noarch" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-gitconfig-0.9.0-1.fc44.noarch" is already installed. Package Arch Version Repository Size Installing: python3-devel ppc64le 0:3.14.3-1.fc44 fedora 1.9 MiB python3-pdm-backend noarch 0:2.4.7-1.fc44 fedora 264.7 KiB python3-pip noarch 0:26.0.1-2.fc44 fedora 11.4 MiB Installing dependencies: python3-editables noarch 0:0.5-15.fc44 fedora 22.5 KiB python3-pyproject-metadata noarch 0:0.11.0-2.fc44 fedora 223.3 KiB python3-rpm-generators noarch 0:14-14.fc44 fedora 81.7 KiB python3-tomli-w noarch 0:1.2.0-7.fc44 fedora 34.8 KiB Transaction Summary: Installing: 7 packages Total size of inbound packages is 3 MiB. Need to download 3 MiB. After this operation, 14 MiB extra will be used (install 14 MiB, remove 0 B). [1/7] python3-pdm-backend-0:2.4.7-1.fc4 100% | 2.4 MiB/s | 96.3 KiB | 00m00s [2/7] python3-devel-0:3.14.3-1.fc44.ppc 100% | 9.1 MiB/s | 437.0 KiB | 00m00s [3/7] python3-editables-0:0.5-15.fc44.n 100% | 726.3 KiB/s | 19.6 KiB | 00m00s [4/7] python3-pyproject-metadata-0:0.11 100% | 2.8 MiB/s | 66.8 KiB | 00m00s [5/7] python3-tomli-w-0:1.2.0-7.fc44.no 100% | 2.1 MiB/s | 23.3 KiB | 00m00s [6/7] python3-rpm-generators-0:14-14.fc 100% | 2.5 MiB/s | 28.6 KiB | 00m00s [7/7] python3-pip-0:26.0.1-2.fc44.noarc 100% | 21.5 MiB/s | 2.7 MiB | 00m00s -------------------------------------------------------------------------------- [7/7] Total 100% | 26.3 MiB/s | 3.3 MiB | 00m00s Running transaction [1/9] Verify package files 100% | 142.0 B/s | 7.0 B | 00m00s [2/9] Prepare transaction 100% | 93.0 B/s | 7.0 B | 00m00s [3/9] Installing python3-rpm-generators 100% | 40.5 MiB/s | 82.9 KiB | 00m00s [4/9] Installing python3-tomli-w-0:1.2. 100% | 12.5 MiB/s | 38.3 KiB | 00m00s [5/9] Installing python3-pyproject-meta 100% | 44.7 MiB/s | 229.0 KiB | 00m00s [6/9] Installing python3-editables-0:0. 100% | 8.4 MiB/s | 25.7 KiB | 00m00s [7/9] Installing python3-pdm-backend-0: 100% | 27.0 MiB/s | 276.5 KiB | 00m00s [8/9] Installing python3-devel-0:3.14.3 100% | 23.8 MiB/s | 2.0 MiB | 00m00s [9/9] Installing python3-pip-0:26.0.1-2 100% | 41.9 MiB/s | 11.7 MiB | 00m00s Complete! Building target platforms: ppc64le Building for target ppc64le Reading /var/tmp/rpm-tmp.EzN40B setting SOURCE_DATE_EPOCH=1774656000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.yzSzhn + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + cd git-changelog-2.9.3 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=44 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir --output /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-buildrequires Handling pdm-backend from build-system.requires Requirement satisfied: pdm-backend (installed: pdm-backend 2.4.7) Handling Jinja2>=3.0 from hook generated metadata: Requires-Dist (git-changelog) Requirement not satisfied: Jinja2>=3.0 Handling packaging from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: packaging (installed: packaging 25.0) Handling platformdirs>=4.4 from hook generated metadata: Requires-Dist (git-changelog) Requirement not satisfied: platformdirs>=4.4 Handling semver>=3.0 from hook generated metadata: Requires-Dist (git-changelog) Requirement not satisfied: semver>=3.0 Handling tomli>=2.0; python_version < "3.11" from hook generated metadata: Requires-Dist (git-changelog) Ignoring alien requirement: tomli>=2.0; python_version < "3.11" Handling typing-extensions>=4.9; python_version < "3.13" from hook generated metadata: Requires-Dist (git-changelog) Ignoring alien requirement: typing-extensions>=4.9; python_version < "3.13" + cat /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-buildrequires + rm -rfv git_changelog-2.9.3+d20260328.dist-info/ removed 'git_changelog-2.9.3+d20260328.dist-info/licenses/LICENSE' removed directory 'git_changelog-2.9.3+d20260328.dist-info/licenses' removed 'git_changelog-2.9.3+d20260328.dist-info/METADATA' removed 'git_changelog-2.9.3+d20260328.dist-info/WHEEL' removed 'git_changelog-2.9.3+d20260328.dist-info/entry_points.txt' removed directory 'git_changelog-2.9.3+d20260328.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-git-changelog-2.9.3-1.fc44.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: updates 100% | 34.0 KiB/s | 8.4 KiB | 00m00s fedora 100% | 40.4 KiB/s | 8.4 KiB | 00m00s Copr repository 100% | 8.8 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing: python3-jinja2 noarch 0:3.1.6-7.fc44 fedora 3.1 MiB python3-platformdirs noarch 0:4.9.1-1.fc44 fedora 236.5 KiB python3-semver noarch 0:3.0.4-5.fc44 fedora 129.1 KiB Installing dependencies: python3-markupsafe ppc64le 0:3.0.2-7.fc44 fedora 117.3 KiB Transaction Summary: Installing: 4 packages Package "git-core-2.53.0-1.fc44.ppc64le" is already installed. Package "pyproject-rpm-macros-1.18.7-1.fc44.noarch" is already installed. Package "python3-devel-3.14.3-1.fc44.ppc64le" is already installed. Package "python3-packaging-25.0-8.fc44.noarch" is already installed. Package "python3-pdm-backend-2.4.7-1.fc44.noarch" is already installed. Package "python3-pip-26.0.1-2.fc44.noarch" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-gitconfig-0.9.0-1.fc44.noarch" is already installed. Total size of inbound packages is 661 KiB. Need to download 661 KiB. After this operation, 4 MiB extra will be used (install 4 MiB, remove 0 B). [1/4] python3-platformdirs-0:4.9.1-1.fc 100% | 1.6 MiB/s | 59.1 KiB | 00m00s [2/4] python3-semver-0:3.0.4-5.fc44.noa 100% | 1.4 MiB/s | 53.7 KiB | 00m00s [3/4] python3-markupsafe-0:3.0.2-7.fc44 100% | 5.3 MiB/s | 32.4 KiB | 00m00s [4/4] python3-jinja2-0:3.1.6-7.fc44.noa 100% | 10.5 MiB/s | 515.5 KiB | 00m00s -------------------------------------------------------------------------------- [4/4] Total 100% | 13.2 MiB/s | 660.7 KiB | 00m00s Running transaction [1/6] Verify package files 100% | 400.0 B/s | 4.0 B | 00m00s [2/6] Prepare transaction 100% | 64.0 B/s | 4.0 B | 00m00s [3/6] Installing python3-markupsafe-0:3 100% | 23.7 MiB/s | 121.6 KiB | 00m00s [4/6] Installing python3-jinja2-0:3.1.6 100% | 103.1 MiB/s | 3.1 MiB | 00m00s [5/6] Installing python3-semver-0:3.0.4 100% | 3.0 MiB/s | 135.7 KiB | 00m00s [6/6] Installing python3-platformdirs-0 100% | 5.4 MiB/s | 243.4 KiB | 00m00s Complete! Building target platforms: ppc64le Building for target ppc64le Reading /var/tmp/rpm-tmp.UwcRwf setting SOURCE_DATE_EPOCH=1774656000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.TWHwyd + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + cd git-changelog-2.9.3 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=44 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir --output /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-buildrequires Handling pdm-backend from build-system.requires Requirement satisfied: pdm-backend (installed: pdm-backend 2.4.7) Handling Jinja2>=3.0 from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: Jinja2>=3.0 (installed: Jinja2 3.1.6) Handling packaging from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: packaging (installed: packaging 25.0) Handling platformdirs>=4.4 from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: platformdirs>=4.4 (installed: platformdirs 4.9.1) Handling semver>=3.0 from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: semver>=3.0 (installed: semver 3.0.4) Handling tomli>=2.0; python_version < "3.11" from hook generated metadata: Requires-Dist (git-changelog) Ignoring alien requirement: tomli>=2.0; python_version < "3.11" Handling typing-extensions>=4.9; python_version < "3.13" from hook generated metadata: Requires-Dist (git-changelog) Ignoring alien requirement: typing-extensions>=4.9; python_version < "3.13" + cat /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-buildrequires + rm -rfv git_changelog-2.9.3+d20260328.dist-info/ removed 'git_changelog-2.9.3+d20260328.dist-info/licenses/LICENSE' removed directory 'git_changelog-2.9.3+d20260328.dist-info/licenses' removed 'git_changelog-2.9.3+d20260328.dist-info/METADATA' removed 'git_changelog-2.9.3+d20260328.dist-info/WHEEL' removed 'git_changelog-2.9.3+d20260328.dist-info/entry_points.txt' removed directory 'git_changelog-2.9.3+d20260328.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-git-changelog-2.9.3-1.fc44.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: updates 100% | 32.6 KiB/s | 8.4 KiB | 00m00s fedora 100% | 38.0 KiB/s | 8.4 KiB | 00m00s Copr repository 100% | 8.5 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Nothing to do. Package "git-core-2.53.0-1.fc44.ppc64le" is already installed. Package "pyproject-rpm-macros-1.18.7-1.fc44.noarch" is already installed. Package "python3-devel-3.14.3-1.fc44.ppc64le" is already installed. Package "python3-jinja2-3.1.6-7.fc44.noarch" is already installed. Package "python3-packaging-25.0-8.fc44.noarch" is already installed. Package "python3-pdm-backend-2.4.7-1.fc44.noarch" is already installed. Package "python3-pip-26.0.1-2.fc44.noarch" is already installed. Package "python3-platformdirs-4.9.1-1.fc44.noarch" is already installed. Package "python3-pytest-8.4.2-2.fc44.noarch" is already installed. Package "python3-pytest-gitconfig-0.9.0-1.fc44.noarch" is already installed. Package "python3-semver-3.0.4-5.fc44.noarch" is already installed. Building target platforms: ppc64le Building for target ppc64le Reading /var/tmp/rpm-tmp.q8olOd setting SOURCE_DATE_EPOCH=1774656000 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.8xBtz5 + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + cd git-changelog-2.9.3 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + RPM_TOXENV=py314 + FEDORA=44 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir --output /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-buildrequires Handling pdm-backend from build-system.requires Requirement satisfied: pdm-backend (installed: pdm-backend 2.4.7) Handling Jinja2>=3.0 from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: Jinja2>=3.0 (installed: Jinja2 3.1.6) Handling packaging from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: packaging (installed: packaging 25.0) Handling platformdirs>=4.4 from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: platformdirs>=4.4 (installed: platformdirs 4.9.1) Handling semver>=3.0 from hook generated metadata: Requires-Dist (git-changelog) Requirement satisfied: semver>=3.0 (installed: semver 3.0.4) Handling tomli>=2.0; python_version < "3.11" from hook generated metadata: Requires-Dist (git-changelog) Ignoring alien requirement: tomli>=2.0; python_version < "3.11" Handling typing-extensions>=4.9; python_version < "3.13" from hook generated metadata: Requires-Dist (git-changelog) Ignoring alien requirement: typing-extensions>=4.9; python_version < "3.13" + cat /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-buildrequires + rm -rfv git_changelog-2.9.3+d20260328.dist-info/ removed 'git_changelog-2.9.3+d20260328.dist-info/licenses/LICENSE' removed directory 'git_changelog-2.9.3+d20260328.dist-info/licenses' removed 'git_changelog-2.9.3+d20260328.dist-info/METADATA' removed 'git_changelog-2.9.3+d20260328.dist-info/WHEEL' removed 'git_changelog-2.9.3+d20260328.dist-info/entry_points.txt' removed directory 'git_changelog-2.9.3+d20260328.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Executing(%conf): /bin/sh -e /var/tmp/rpm-tmp.qVDYhM + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd git-changelog-2.9.3 + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.iGQYVo + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd git-changelog-2.9.3 + mkdir -p /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_wheel.py /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir Processing ./. Preparing metadata (pyproject.toml): started Running command Preparing metadata (pyproject.toml) Preparing metadata (pyproject.toml): finished with status 'done' Building wheels for collected packages: git-changelog Building wheel for git-changelog (pyproject.toml): started Running command Building wheel for git-changelog (pyproject.toml) - Adding /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir/pip-modern-metadata-aiw40pyu/git_changelog-2.9.3+d20260328.dist-info/METADATA -> git_changelog-2.9.3+d20260328.dist-info/METADATA - Adding /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir/pip-modern-metadata-aiw40pyu/git_changelog-2.9.3+d20260328.dist-info/WHEEL -> git_changelog-2.9.3+d20260328.dist-info/WHEEL - Adding /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir/pip-modern-metadata-aiw40pyu/git_changelog-2.9.3+d20260328.dist-info/entry_points.txt -> git_changelog-2.9.3+d20260328.dist-info/entry_points.txt - Adding /builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir/pip-modern-metadata-aiw40pyu/git_changelog-2.9.3+d20260328.dist-info/licenses/LICENSE -> git_changelog-2.9.3+d20260328.dist-info/licenses/LICENSE - Adding src/git_changelog/__init__.py -> git_changelog/__init__.py - Adding src/git_changelog/__main__.py -> git_changelog/__main__.py - Adding src/git_changelog/_internal/__init__.py -> git_changelog/_internal/__init__.py - Adding src/git_changelog/_internal/build.py -> git_changelog/_internal/build.py - Adding src/git_changelog/_internal/cli.py -> git_changelog/_internal/cli.py - Adding src/git_changelog/_internal/commit.py -> git_changelog/_internal/commit.py - Adding src/git_changelog/_internal/debug.py -> git_changelog/_internal/debug.py - Adding src/git_changelog/_internal/providers.py -> git_changelog/_internal/providers.py - Adding src/git_changelog/_internal/templates/__init__.py -> git_changelog/_internal/templates/__init__.py - Adding src/git_changelog/_internal/templates/angular.md.jinja -> git_changelog/_internal/templates/angular.md.jinja - Adding src/git_changelog/_internal/templates/debian.md.jinja -> git_changelog/_internal/templates/debian.md.jinja - Adding src/git_changelog/_internal/templates/keepachangelog.md.jinja -> git_changelog/_internal/templates/keepachangelog.md.jinja - Adding src/git_changelog/_internal/versioning.py -> git_changelog/_internal/versioning.py - Adding src/git_changelog/build.py -> git_changelog/build.py - Adding src/git_changelog/cli.py -> git_changelog/cli.py - Adding src/git_changelog/commit.py -> git_changelog/commit.py - Adding src/git_changelog/providers.py -> git_changelog/providers.py - Adding src/git_changelog/py.typed -> git_changelog/py.typed - Adding src/git_changelog/templates.py -> git_changelog/templates.py - Adding src/git_changelog/versioning.py -> git_changelog/versioning.py - Adding git_changelog-2.9.3+d20260328.dist-info/RECORD -> git_changelog-2.9.3+d20260328.dist-info/RECORD Building wheel for git-changelog (pyproject.toml): finished with status 'done' Created wheel for git-changelog: filename=git_changelog-2.9.3+d20260328-py3-none-any.whl size=40703 sha256=b92560cbeb53da838f0387ec3dd0399034b9761d01d9861e69e9eac10702a550 Stored in directory: /builddir/.cache/pip/wheels/1d/dd/74/6845c3f1e22a3f31b05f6c07d0fa7a7fa08996d35f464ef102 Successfully built git-changelog + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.u5Isiq + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + '[' /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT '!=' / ']' + rm -rf /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT ++ dirname /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT + mkdir -p /builddir/build/BUILD/python-git-changelog-2.9.3-build + mkdir /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd git-changelog-2.9.3 ++ ls /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir/git_changelog-2.9.3+d20260328-py3-none-any.whl ++ xargs basename --multiple ++ sed -E 's/([^-]+)-([^-]+)-.+\.whl/\1==\2/' + specifier=git_changelog==2.9.3+d20260328 + '[' -z git_changelog==2.9.3+d20260328 ']' + TMPDIR=/builddir/build/BUILD/python-git-changelog-2.9.3-build/.pyproject-builddir + /usr/bin/python3 -m pip install --root /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT --prefix /usr --no-deps --disable-pip-version-check --progress-bar off --verbose --ignore-installed --no-warn-script-location --no-index --no-cache-dir --find-links /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir git_changelog==2.9.3+d20260328 Using pip 26.0.1 from /usr/lib/python3.14/site-packages/pip (python 3.14) Looking in links: /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir Processing /builddir/build/BUILD/python-git-changelog-2.9.3-build/pyproject-wheeldir/git_changelog-2.9.3+d20260328-py3-none-any.whl Installing collected packages: git_changelog Creating /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/bin changing mode of /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/bin/git-changelog to 755 Successfully installed git_changelog-2.9.3+d20260328 + '[' -d /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/bin ']' + '[' -z sP ']' + shebang_flags=-kasP + /usr/bin/python3 -B /usr/lib/rpm/redhat/pathfix.py -pni /usr/bin/python3 -kasP /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/bin/git-changelog /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/bin/git-changelog: updating + rm -rfv /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/bin/__pycache__ + rm -f /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-ghost-distinfo + site_dirs=() + '[' -d /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages ']' + site_dirs+=("/usr/lib/python3.14/site-packages") + '[' /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib64/python3.14/site-packages '!=' /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages ']' + '[' -d /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib64/python3.14/site-packages ']' + for site_dir in ${site_dirs[@]} + for distinfo in /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT$site_dir/*.dist-info + echo '%ghost %dir /usr/lib/python3.14/site-packages/git_changelog-2.9.3+d20260328.dist-info' + sed -i s/pip/rpm/ /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog-2.9.3+d20260328.dist-info/INSTALLER + PYTHONPATH=/usr/lib/rpm/redhat + /usr/bin/python3 -B /usr/lib/rpm/redhat/pyproject_preprocess_record.py --buildroot /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT --record /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog-2.9.3+d20260328.dist-info/RECORD --output /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-record + rm -fv /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog-2.9.3+d20260328.dist-info/RECORD removed '/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog-2.9.3+d20260328.dist-info/RECORD' + rm -fv /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog-2.9.3+d20260328.dist-info/REQUESTED removed '/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog-2.9.3+d20260328.dist-info/REQUESTED' ++ wc -l /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-ghost-distinfo ++ cut -f1 '-d ' + lines=1 + '[' 1 -ne 1 ']' + RPM_FILES_ESCAPE=4.19 + /usr/bin/python3 /usr/lib/rpm/redhat/pyproject_save_files.py --output-files /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-files --output-modules /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-modules --buildroot /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT --sitelib /usr/lib/python3.14/site-packages --sitearch /usr/lib64/python3.14/site-packages --python-version 3.14 --pyproject-record /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-record --prefix /usr -l git_changelog + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig + COMPRESS='gzip -9 -n' + COMPRESS_EXT=.gz + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip /usr/bin/strip + /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump + /usr/lib/rpm/redhat/brp-strip-lto /usr/bin/strip + /usr/lib/rpm/check-rpaths + /usr/lib/rpm/redhat/brp-mangle-shebangs + /usr/lib/rpm/brp-remove-la-files + /usr/lib/rpm/redhat/brp-python-rpm-in-distinfo + env /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 -j5 Bytecompiling .py files below /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14 using python3.14 + /usr/lib/rpm/redhat/brp-python-hardlink + /usr/bin/add-det --brp -j5 /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/__pycache__/cli.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/__pycache__/build.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/__pycache__/commit.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/__pycache__/versioning.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/__pycache__/templates.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/__pycache__/providers.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/__pycache__/__main__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/__pycache__/debug.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/__pycache__/providers.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/templates/__pycache__/__init__.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/__pycache__/cli.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/__pycache__/build.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/__pycache__/commit.cpython-314.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/__pycache__/versioning.cpython-314.opt-1.pyc: rewriting with normalized contents Scanned 14 directories and 58 files, processed 16 inodes, 16 modified (0 replaced + 16 rewritten), 0 unsupported format, 0 errors + /usr/bin/linkdupes --brp /builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr Scanned 13 directories and 58 files, considered 58 files, read 4 files, linked 1 files, 0 errors sum of sizes of linked files: 0 bytes Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.18elqz + umask 022 + cd /builddir/build/BUILD/python-git-changelog-2.9.3-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd git-changelog-2.9.3 + '[' '!' -f /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-modules ']' + PATH=/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin + PYTHONPATH=/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib64/python3.14/site-packages:/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages + _PYTHONSITE=/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib64/python3.14/site-packages:/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages + PYTHONDONTWRITEBYTECODE=1 + /usr/bin/python3 -sP /usr/lib/rpm/redhat/import_all_modules.py -f /builddir/build/BUILD/python-git-changelog-2.9.3-build/python-git-changelog-2.9.3-1.fc44.ppc64le-pyproject-modules Check import: git_changelog Check import: git_changelog.build Check import: git_changelog.cli Check import: git_changelog.commit Check import: git_changelog.providers Check import: git_changelog.templates Check import: git_changelog.versioning + ignore=' --ignore=tests/test_api.py' + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + PATH=/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin + PYTHONPATH=/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib64/python3.14/site-packages:/builddir/build/BUILD/python-git-changelog-2.9.3-build/BUILDROOT/usr/lib/python3.14/site-packages + PYTHONDONTWRITEBYTECODE=1 + PYTEST_XDIST_AUTO_NUM_WORKERS=5 + /usr/bin/pytest -v -rs --ignore=tests/test_api.py ============================= test session starts ============================== platform linux -- Python 3.14.3, pytest-8.4.2, pluggy-1.6.0 -- /usr/bin/python3 cachedir: .pytest_cache rootdir: /builddir/build/BUILD/python-git-changelog-2.9.3-build/git-changelog-2.9.3 configfile: pyproject.toml plugins: gitconfig-0.9.0 collecting ... collected 382 items tests/test_angular_style.py::test_angular_convention_breaking_change PASSED [ 0%] tests/test_angular_style.py::test_angular_convention_breaking_changes PASSED [ 0%] tests/test_angular_style.py::test_angular_convention_feat PASSED [ 0%] tests/test_angular_style.py::test_angular_convention_fix PASSED [ 1%] tests/test_basic_style.py::test_basic_convention_breaking_change PASSED [ 1%] tests/test_basic_style.py::test_basic_convention_breaking_changes PASSED [ 1%] tests/test_basic_style.py::test_basic_convention_feat PASSED [ 1%] tests/test_basic_style.py::test_basic_convention_fix PASSED [ 2%] tests/test_build.py::test_bump_with_semver_on_new_repo[semver-auto-0.0.1] PASSED [ 2%] tests/test_build.py::test_bump_with_semver_on_new_repo[semver-major-1.0.0] PASSED [ 2%] tests/test_build.py::test_bump_with_semver_on_new_repo[semver-minor-0.1.0] PASSED [ 2%] tests/test_build.py::test_bump_with_semver_on_new_repo[semver-patch-0.0.1] PASSED [ 3%] tests/test_build.py::test_bump_with_semver_on_new_repo[semver-1.1.1-1.1.1] PASSED [ 3%] tests/test_build.py::test_bump_with_semver_on_new_repo[pep440-auto-0.0.1] FAILED [ 3%] tests/test_build.py::test_bump_with_semver_on_new_repo[pep440-major-1.0.0] FAILED [ 3%] tests/test_build.py::test_bump_with_semver_on_new_repo[pep440-minor+dev-0.1.0.dev0] FAILED [ 4%] tests/test_build.py::test_bump_with_semver_on_new_repo[pep440-micro+alpha+dev-0.0.1a0.dev0] FAILED [ 4%] tests/test_build.py::test_bump_with_semver_on_new_repo[pep440-1.1.1-1.1.1] FAILED [ 4%] tests/test_build.py::test_no_bump_on_first_tag[auto] PASSED [ 4%] tests/test_build.py::test_no_bump_on_first_tag[major] PASSED [ 5%] tests/test_build.py::test_no_bump_on_first_tag[minor] PASSED [ 5%] tests/test_build.py::test_no_bump_on_first_tag[2.0.0] PASSED [ 5%] tests/test_build.py::test_one_release_branch_with_feat_branch PASSED [ 6%] tests/test_build.py::test_one_release_branch_with_two_versions PASSED [ 6%] tests/test_build.py::test_two_release_branches PASSED [ 6%] tests/test_build.py::test_no_remote_url PASSED [ 6%] tests/test_build.py::test_merge_into_unreleased PASSED [ 7%] tests/test_build.py::test_build_changelog_with_pep440_versions PASSED [ 7%] tests/test_build.py::test_ignore_nonsemver_tag PASSED [ 7%] tests/test_build.py::test_untyped_commits PASSED [ 7%] tests/test_build.py::test_include_all_false_excludes_untyped PASSED [ 8%] tests/test_build.py::test_include_all_true_includes_untyped PASSED [ 8%] tests/test_build.py::test_include_all_with_sections_parameter PASSED [ 8%] tests/test_build.py::test_sections_all_expands_to_all_types PASSED [ 8%] tests/test_build.py::test_sections_all_with_basic_convention PASSED [ 9%] tests/test_build.py::test_sections_explicit_list_still_works PASSED [ 9%] tests/test_cli.py::test_main PASSED [ 9%] tests/test_cli.py::test_show_help PASSED [ 9%] tests/test_cli.py::test_get_version PASSED [ 10%] tests/test_cli.py::test_passing_repository_and_sections[args0] PASSED [ 10%] tests/test_cli.py::test_passing_repository_and_sections[args1] PASSED [ 10%] tests/test_cli.py::test_sections_all_parameter PASSED [ 10%] tests/test_cli.py::test_config_reading[None-None-None-True] PASSED [ 11%] tests/test_cli.py::test_config_reading[None-None-None-False] PASSED [ 11%] tests/test_cli.py::test_config_reading[None-None-None-None] PASSED [ 11%] tests/test_cli.py::test_config_reading[None--None-True] PASSED [ 12%] tests/test_cli.py::test_config_reading[None--None-False] PASSED [ 12%] tests/test_cli.py::test_config_reading[None--None-None] PASSED [ 12%] tests/test_cli.py::test_config_reading[None-,,-None-True] PASSED [ 12%] tests/test_cli.py::test_config_reading[None-,,-None-False] PASSED [ 13%] tests/test_cli.py::test_config_reading[None-,,-None-None] PASSED [ 13%] tests/test_cli.py::test_config_reading[None-a, b, -sections_value3-True] PASSED [ 13%] tests/test_cli.py::test_config_reading[None-a, b, -sections_value3-False] PASSED [ 13%] tests/test_cli.py::test_config_reading[None-a, b, -sections_value3-None] PASSED [ 14%] tests/test_cli.py::test_config_reading[None-a, , -sections_value4-True] PASSED [ 14%] tests/test_cli.py::test_config_reading[None-a, , -sections_value4-False] PASSED [ 14%] tests/test_cli.py::test_config_reading[None-a, , -sections_value4-None] PASSED [ 14%] tests/test_cli.py::test_config_reading[None-a, b, c-sections_value5-True] PASSED [ 15%] tests/test_cli.py::test_config_reading[None-a, b, c-sections_value5-False] PASSED [ 15%] tests/test_cli.py::test_config_reading[None-a, b, c-sections_value5-None] PASSED [ 15%] tests/test_cli.py::test_config_reading[None-sections6-sections_value6-True] PASSED [ 15%] tests/test_cli.py::test_config_reading[None-sections6-sections_value6-False] PASSED [ 16%] tests/test_cli.py::test_config_reading[None-sections6-sections_value6-None] PASSED [ 16%] tests/test_cli.py::test_config_reading[False-None-None-True] PASSED [ 16%] tests/test_cli.py::test_config_reading[False-None-None-False] PASSED [ 17%] tests/test_cli.py::test_config_reading[False-None-None-None] PASSED [ 17%] tests/test_cli.py::test_config_reading[False--None-True] PASSED [ 17%] tests/test_cli.py::test_config_reading[False--None-False] PASSED [ 17%] tests/test_cli.py::test_config_reading[False--None-None] PASSED [ 18%] tests/test_cli.py::test_config_reading[False-,,-None-True] PASSED [ 18%] tests/test_cli.py::test_config_reading[False-,,-None-False] PASSED [ 18%] tests/test_cli.py::test_config_reading[False-,,-None-None] PASSED [ 18%] tests/test_cli.py::test_config_reading[False-a, b, -sections_value3-True] PASSED [ 19%] tests/test_cli.py::test_config_reading[False-a, b, -sections_value3-False] PASSED [ 19%] tests/test_cli.py::test_config_reading[False-a, b, -sections_value3-None] PASSED [ 19%] tests/test_cli.py::test_config_reading[False-a, , -sections_value4-True] PASSED [ 19%] tests/test_cli.py::test_config_reading[False-a, , -sections_value4-False] PASSED [ 20%] tests/test_cli.py::test_config_reading[False-a, , -sections_value4-None] PASSED [ 20%] tests/test_cli.py::test_config_reading[False-a, b, c-sections_value5-True] PASSED [ 20%] tests/test_cli.py::test_config_reading[False-a, b, c-sections_value5-False] PASSED [ 20%] tests/test_cli.py::test_config_reading[False-a, b, c-sections_value5-None] PASSED [ 21%] tests/test_cli.py::test_config_reading[False-sections6-sections_value6-True] PASSED [ 21%] tests/test_cli.py::test_config_reading[False-sections6-sections_value6-False] PASSED [ 21%] tests/test_cli.py::test_config_reading[False-sections6-sections_value6-None] PASSED [ 21%] tests/test_cli.py::test_config_reading[True-None-None-True] PASSED [ 22%] tests/test_cli.py::test_config_reading[True-None-None-False] PASSED [ 22%] tests/test_cli.py::test_config_reading[True-None-None-None] PASSED [ 22%] tests/test_cli.py::test_config_reading[True--None-True] PASSED [ 23%] tests/test_cli.py::test_config_reading[True--None-False] PASSED [ 23%] tests/test_cli.py::test_config_reading[True--None-None] PASSED [ 23%] tests/test_cli.py::test_config_reading[True-,,-None-True] PASSED [ 23%] tests/test_cli.py::test_config_reading[True-,,-None-False] PASSED [ 24%] tests/test_cli.py::test_config_reading[True-,,-None-None] PASSED [ 24%] tests/test_cli.py::test_config_reading[True-a, b, -sections_value3-True] PASSED [ 24%] tests/test_cli.py::test_config_reading[True-a, b, -sections_value3-False] PASSED [ 24%] tests/test_cli.py::test_config_reading[True-a, b, -sections_value3-None] PASSED [ 25%] tests/test_cli.py::test_config_reading[True-a, , -sections_value4-True] PASSED [ 25%] tests/test_cli.py::test_config_reading[True-a, , -sections_value4-False] PASSED [ 25%] tests/test_cli.py::test_config_reading[True-a, , -sections_value4-None] PASSED [ 25%] tests/test_cli.py::test_config_reading[True-a, b, c-sections_value5-True] PASSED [ 26%] tests/test_cli.py::test_config_reading[True-a, b, c-sections_value5-False] PASSED [ 26%] tests/test_cli.py::test_config_reading[True-a, b, c-sections_value5-None] PASSED [ 26%] tests/test_cli.py::test_config_reading[True-sections6-sections_value6-True] PASSED [ 26%] tests/test_cli.py::test_config_reading[True-sections6-sections_value6-False] PASSED [ 27%] tests/test_cli.py::test_config_reading[True-sections6-sections_value6-None] PASSED [ 27%] tests/test_cli.py::test_settings_warning[None] PASSED [ 27%] tests/test_cli.py::test_settings_warning[False] PASSED [ 28%] tests/test_cli.py::test_settings_warning[True] PASSED [ 28%] tests/test_cli.py::test_show_version PASSED [ 28%] tests/test_cli.py::test_show_debug_info PASSED [ 28%] tests/test_cli.py::test_jinja_context PASSED [ 29%] tests/test_cli.py::test_versioning FAILED [ 29%] tests/test_cli.py::test_bumped_version_option PASSED [ 29%] tests/test_cli.py::test_include_all_cli_option PASSED [ 29%] tests/test_cli.py::test_include_all_config_option PASSED [ 30%] tests/test_cli.py::test_debian_version_regex[my-pkg-name (4.2.0~dev) UNRELEASED; urgency=medium-None] PASSED [ 30%] tests/test_cli.py::test_debian_version_regex[my-pkg-name (4.2.0~dev) stable; urgency=medium-4.2.0] PASSED [ 30%] tests/test_cli.py::test_debian_version_regex[my-pkg-name (4.2.0) stable; urgency=medium-4.2.0] PASSED [ 30%] tests/test_cli.py::test_debian_version_regex[my-pkg-name (4.2.0-1) stable; urgency=medium-4.2.0] PASSED [ 31%] tests/test_cli.py::test_debian_version_regex[my-pkg-name (4.2.0+dfsg-1) stable; urgency=medium-4.2.0] PASSED [ 31%] tests/test_cli.py::test_debian_version_regex[my-pkg-name (4.2.0-alpha1-1) stable; urgency=medium-4.2.0] PASSED [ 31%] tests/test_cli.py::test_debian_version_regex[my-pkg-name (1:4.2.0-1) stable; urgency=medium-4.2.0] PASSED [ 31%] tests/test_cli.py::test_debian_version_regex[my-pkg-name (4.2.0-0progress8.99u1) stable; urgency=medium-4.2.0] PASSED [ 32%] tests/test_cli.py::test_outputting_release_notes PASSED [ 32%] tests/test_cli.py::test_selecting_convention[angular] PASSED [ 32%] tests/test_cli.py::test_selecting_convention[basic] PASSED [ 32%] tests/test_cli.py::test_selecting_convention[conventional] PASSED [ 33%] tests/test_cli.py::test_selecting_convention[linux] PASSED [ 33%] tests/test_commit.py::test_parsing_trailers[t1: v1\nt2: v2-expected_trailers0] PASSED [ 33%] tests/test_commit.py::test_parsing_trailers[body\n\nt1: v1\nt2: v2-expected_trailers1] PASSED [ 34%] tests/test_commit.py::test_parsing_trailers[t1: v1\nt2:v2-expected_trailers2] PASSED [ 34%] tests/test_commit.py::test_parsing_trailers[t1: v1\nt2: v2\n\nf-expected_trailers3] PASSED [ 34%] tests/test_commit.py::test_parsing_trailers[t1: v1\nt2 v2-expected_trailers4] PASSED [ 34%] tests/test_commit.py::test_parsing_trailers[something: else\n\nt1: v1\nt2: v2-expected_trailers5] PASSED [ 35%] tests/test_commit.py::test_parsing_trailers[t1: v1\nt1: v2-expected_trailers6] PASSED [ 35%] tests/test_commit.py::test_trailers_emit_deprecation_warnings PASSED [ 35%] tests/test_commit.py::test_tzinfo PASSED [ 35%] tests/test_conventional_commit_style.py::test_conventional_convention_breaking_change PASSED [ 36%] tests/test_conventional_commit_style.py::test_conventional_convention_breaking_changes PASSED [ 36%] tests/test_conventional_commit_style.py::test_conventional_convention_subject_breaking_change PASSED [ 36%] tests/test_conventional_commit_style.py::test_conventional_convention_subject_breaking_change_with_scope PASSED [ 36%] tests/test_conventional_commit_style.py::test_conventional_convention_feat PASSED [ 37%] tests/test_conventional_commit_style.py::test_conventional_convention_feat_with_scope PASSED [ 37%] tests/test_conventional_commit_style.py::test_conventional_convention_fix PASSED [ 37%] tests/test_conventional_commit_style.py::test_conventional_convention_fix_with_scope PASSED [ 37%] tests/test_end_to_end.py::test_bumping_latest[repo0] PASSED [ 38%] tests/test_end_to_end.py::test_bumping_latest[repo1] PASSED [ 38%] tests/test_end_to_end.py::test_not_bumping_latest[repo0] PASSED [ 38%] tests/test_end_to_end.py::test_not_bumping_latest[repo1] PASSED [ 39%] tests/test_end_to_end.py::test_rendering_custom_sections[repo0] PASSED [ 39%] tests/test_end_to_end.py::test_rendering_custom_sections[repo1] PASSED [ 39%] tests/test_end_to_end.py::test_rendering_in_place[repo0] PASSED [ 39%] tests/test_end_to_end.py::test_rendering_in_place[repo1] PASSED [ 40%] tests/test_end_to_end.py::test_rendering_debian_prepend[repo0] PASSED [ 40%] tests/test_end_to_end.py::test_rendering_debian_prepend[repo1] PASSED [ 40%] tests/test_end_to_end.py::test_no_duplicate_rendering[repo0] PASSED [ 40%] tests/test_end_to_end.py::test_no_duplicate_rendering[repo1] PASSED [ 41%] tests/test_end_to_end.py::test_removing_credentials_from_remotes[repo0] PASSED [ 41%] tests/test_end_to_end.py::test_removing_credentials_from_remotes[repo1] PASSED [ 41%] tests/test_end_to_end.py::test_filter_commits_option[repo0] PASSED [ 41%] tests/test_end_to_end.py::test_filter_commits_option[repo1] PASSED [ 42%] tests/test_linux_style.py::test_linux_convention_breaking_change PASSED [ 42%] tests/test_linux_style.py::test_linux_convention_breaking_changes PASSED [ 42%] tests/test_linux_style.py::test_linux_convention[baz: Added a new feature-False-True-False-Added] PASSED [ 42%] tests/test_linux_style.py::test_linux_convention[baz: Add a new feature-False-True-False-Added] PASSED [ 43%] tests/test_linux_style.py::test_linux_convention[baz: Fix a problem-False-False-True-Fixed] PASSED [ 43%] tests/test_linux_style.py::test_linux_convention[baz: Change implementation-False-False-True-Changed] PASSED [ 43%] tests/test_linux_style.py::test_linux_convention[baz: Remove config file-False-False-True-Removed] PASSED [ 43%] tests/test_linux_style.py::test_linux_convention[baz: Merge branch abc-False-False-True-Merged] PASSED [ 44%] tests/test_linux_style.py::test_linux_convention[baz: Document a new feature-False-False-True-Documented] PASSED [ 44%] tests/test_linux_style.py::test_linux_convention[foo: Implement new API endpoint-False-False-True-] PASSED [ 44%] tests/test_linux_style.py::test_linux_convention[bar:Add support for new protocol-False-True-False-Added] PASSED [ 45%] tests/test_linux_style.py::test_linux_convention[Add support for new protocol-False-True-False-Added] PASSED [ 45%] tests/test_linux_style.py::test_linux_convention[Fix typo in documentation-False-False-True-Fixed] PASSED [ 45%] tests/test_linux_style.py::test_linux_convention[Implement new API endpoint-False-False-True-] PASSED [ 45%] tests/test_providers.py::test_github_issue_parsing PASSED [ 46%] tests/test_providers.py::test_gitlab_issue_parsing PASSED [ 46%] tests/test_providers.py::test_bitbucket_issue_parsing PASSED [ 46%] tests/test_release_notes.py::test_getting_release_notes PASSED [ 46%] tests/test_versioning.py::test_version_prefix[1-expected0] PASSED [ 47%] tests/test_versioning.py::test_version_prefix[v1-expected1] PASSED [ 47%] tests/test_versioning.py::test_version_prefix[va-expected2] PASSED [ 47%] tests/test_versioning.py::test_version_prefix[x1-expected3] PASSED [ 47%] tests/test_versioning.py::test_semver_bump_patch[major-0.0.1-1.0.0] PASSED [ 48%] tests/test_versioning.py::test_semver_bump_patch[major-0.1.0-1.0.0] PASSED [ 48%] tests/test_versioning.py::test_semver_bump_patch[major-0.1.1-1.0.0] PASSED [ 48%] tests/test_versioning.py::test_semver_bump_patch[major-1.0.0-2.0.0] PASSED [ 48%] tests/test_versioning.py::test_semver_bump_patch[major-1.0.1-2.0.0] PASSED [ 49%] tests/test_versioning.py::test_semver_bump_patch[major-1.1.0-2.0.0] PASSED [ 49%] tests/test_versioning.py::test_semver_bump_patch[major-1.1.1-2.0.0] PASSED [ 49%] tests/test_versioning.py::test_semver_bump_patch[minor-0.0.1-0.1.0] PASSED [ 50%] tests/test_versioning.py::test_semver_bump_patch[minor-0.1.0-0.2.0] PASSED [ 50%] tests/test_versioning.py::test_semver_bump_patch[minor-0.1.1-0.2.0] PASSED [ 50%] tests/test_versioning.py::test_semver_bump_patch[minor-1.0.0-1.1.0] PASSED [ 50%] tests/test_versioning.py::test_semver_bump_patch[minor-1.0.1-1.1.0] PASSED [ 51%] tests/test_versioning.py::test_semver_bump_patch[minor-1.1.0-1.2.0] PASSED [ 51%] tests/test_versioning.py::test_semver_bump_patch[minor-1.1.1-1.2.0] PASSED [ 51%] tests/test_versioning.py::test_semver_bump_patch[patch-0.0.1-0.0.2] PASSED [ 51%] tests/test_versioning.py::test_semver_bump_patch[patch-0.1.0-0.1.1] PASSED [ 52%] tests/test_versioning.py::test_semver_bump_patch[patch-0.1.1-0.1.2] PASSED [ 52%] tests/test_versioning.py::test_semver_bump_patch[patch-1.0.0-1.0.1] PASSED [ 52%] tests/test_versioning.py::test_semver_bump_patch[patch-1.0.1-1.0.2] PASSED [ 52%] tests/test_versioning.py::test_semver_bump_patch[patch-1.1.0-1.1.1] PASSED [ 53%] tests/test_versioning.py::test_semver_bump_patch[patch-1.1.1-1.1.2] PASSED [ 53%] tests/test_versioning.py::test_semver_bump_patch[release-1.1.1-1.1.1] PASSED [ 53%] tests/test_versioning.py::test_semver_bump_patch[release-1.1.1-alpha-1.1.1] PASSED [ 53%] tests/test_versioning.py::test_semver_bump_patch[release-1.1.1-alpha+build-1.1.1] PASSED [ 54%] tests/test_versioning.py::test_semver_bump_major_zerover[0.0.1-0.1.0] PASSED [ 54%] tests/test_versioning.py::test_semver_bump_major_zerover[0.1.0-0.2.0] PASSED [ 54%] tests/test_versioning.py::test_semver_bump_major_zerover[0.1.1-0.2.0] PASSED [ 54%] tests/test_versioning.py::test_semver_bump_major_zerover[1.0.0-2.0.0] PASSED [ 55%] tests/test_versioning.py::test_semver_bump_major_zerover[1.0.1-2.0.0] PASSED [ 55%] tests/test_versioning.py::test_semver_bump_major_zerover[1.1.0-2.0.0] PASSED [ 55%] tests/test_versioning.py::test_semver_bump_major_zerover[1.1.1-2.0.0] PASSED [ 56%] tests/test_versioning.py::test_semver_bump_unknown_part PASSED [ 56%] tests/test_versioning.py::test_pep440_bump[epoch-0!1.0-1!1.0] FAILED [ 56%] tests/test_versioning.py::test_pep440_bump[epoch-1!1.0-2!1.0] FAILED [ 56%] tests/test_versioning.py::test_pep440_bump[epoch-2!1.0a0.dev1-3!1.0] FAILED [ 57%] tests/test_versioning.py::test_pep440_bump[release-1.0a0-1.0] FAILED [ 57%] tests/test_versioning.py::test_pep440_bump[release-1.0.1b1-1.0.1] FAILED [ 57%] tests/test_versioning.py::test_pep440_bump[release-2.1rc2-2.1] FAILED [ 57%] tests/test_versioning.py::test_pep440_bump[release-1.dev0-1] FAILED [ 58%] tests/test_versioning.py::test_pep440_bump[major-0.0.1-1.0.0] FAILED [ 58%] tests/test_versioning.py::test_pep440_bump[major-0.1.0-1.0.0] FAILED [ 58%] tests/test_versioning.py::test_pep440_bump[major-0.1.1-1.0.0] FAILED [ 58%] tests/test_versioning.py::test_pep440_bump[major-1.0.0-2.0.0] FAILED [ 59%] tests/test_versioning.py::test_pep440_bump[major-1.0.1-2.0.0] FAILED [ 59%] tests/test_versioning.py::test_pep440_bump[major-1.1.0-2.0.0] FAILED [ 59%] tests/test_versioning.py::test_pep440_bump[major-1.1.1-2.0.0] FAILED [ 59%] tests/test_versioning.py::test_pep440_bump[major-1-2] FAILED [ 60%] tests/test_versioning.py::test_pep440_bump[major-1.1-2.0] FAILED [ 60%] tests/test_versioning.py::test_pep440_bump[major-1.1.1.1-2.0.0.0] FAILED [ 60%] tests/test_versioning.py::test_pep440_bump[major-1a2.post3-2] FAILED [ 60%] tests/test_versioning.py::test_pep440_bump[minor-0.0.1-0.1.0] FAILED [ 61%] tests/test_versioning.py::test_pep440_bump[minor-0.1.0-0.2.0] FAILED [ 61%] tests/test_versioning.py::test_pep440_bump[minor-0.1.1-0.2.0] FAILED [ 61%] tests/test_versioning.py::test_pep440_bump[minor-1.0.0-1.1.0] FAILED [ 62%] tests/test_versioning.py::test_pep440_bump[minor-1.0.1-1.1.0] FAILED [ 62%] tests/test_versioning.py::test_pep440_bump[minor-1.1.0-1.2.0] FAILED [ 62%] tests/test_versioning.py::test_pep440_bump[minor-1.1.1-1.2.0] FAILED [ 62%] tests/test_versioning.py::test_pep440_bump[minor-1-1.1] FAILED [ 63%] tests/test_versioning.py::test_pep440_bump[minor-1.1-1.2] FAILED [ 63%] tests/test_versioning.py::test_pep440_bump[minor-1.1.1.1-1.2.0.0] FAILED [ 63%] tests/test_versioning.py::test_pep440_bump[minor-1a2.post3-1.1] FAILED [ 63%] tests/test_versioning.py::test_pep440_bump[micro-0.0.1-0.0.2] FAILED [ 64%] tests/test_versioning.py::test_pep440_bump[micro-0.1.0-0.1.1] FAILED [ 64%] tests/test_versioning.py::test_pep440_bump[micro-0.1.1-0.1.2] FAILED [ 64%] tests/test_versioning.py::test_pep440_bump[micro-1.0.0-1.0.1] FAILED [ 64%] tests/test_versioning.py::test_pep440_bump[micro-1.0.1-1.0.2] FAILED [ 65%] tests/test_versioning.py::test_pep440_bump[micro-1.1.0-1.1.1] FAILED [ 65%] tests/test_versioning.py::test_pep440_bump[micro-1.1.1-1.1.2] FAILED [ 65%] tests/test_versioning.py::test_pep440_bump[micro-1-1.0.1] FAILED [ 65%] tests/test_versioning.py::test_pep440_bump[micro-1.1-1.1.1] FAILED [ 66%] tests/test_versioning.py::test_pep440_bump[micro-1.1.1.1-1.1.2.0] FAILED [ 66%] tests/test_versioning.py::test_pep440_bump[micro-1a2.post3-1.0.1] FAILED [ 66%] tests/test_versioning.py::test_pep440_bump[pre-1a0-1a1] FAILED [ 67%] tests/test_versioning.py::test_pep440_bump[pre-1b1-1b2] FAILED [ 67%] tests/test_versioning.py::test_pep440_bump[pre-1c2-1rc3] FAILED [ 67%] tests/test_versioning.py::test_pep440_bump[pre-1.0a2.post3-1.0a3] FAILED [ 67%] tests/test_versioning.py::test_pep440_bump[alpha-1a0-1a1] FAILED [ 68%] tests/test_versioning.py::test_pep440_bump[alpha-1.1a99-1.1a100] FAILED [ 68%] tests/test_versioning.py::test_pep440_bump[beta-1a0-1b0] FAILED [ 68%] tests/test_versioning.py::test_pep440_bump[beta-1.1a99-1.1b0] FAILED [ 68%] tests/test_versioning.py::test_pep440_bump[beta-1b0-1b1] FAILED [ 69%] tests/test_versioning.py::test_pep440_bump[beta-1.1b1-1.1b2] FAILED [ 69%] tests/test_versioning.py::test_pep440_bump[candidate-1a0-1rc0] FAILED [ 69%] tests/test_versioning.py::test_pep440_bump[candidate-1.1a99-1.1rc0] FAILED [ 69%] tests/test_versioning.py::test_pep440_bump[candidate-1b0-1rc0] FAILED [ 70%] tests/test_versioning.py::test_pep440_bump[candidate-1.1b1-1.1rc0] FAILED [ 70%] tests/test_versioning.py::test_pep440_bump[candidate-1c0-1rc1] FAILED [ 70%] tests/test_versioning.py::test_pep440_bump[candidate-1.1rc1-1.1rc2] FAILED [ 70%] tests/test_versioning.py::test_pep440_bump[post-1-1.post0] FAILED [ 71%] tests/test_versioning.py::test_pep440_bump[post-1.post0-1.post1] FAILED [ 71%] tests/test_versioning.py::test_pep440_bump[post-1.0a2.post3-1.0a2.post4] FAILED [ 71%] tests/test_versioning.py::test_pep440_bump[dev-1.dev0-1.dev1] FAILED [ 71%] tests/test_versioning.py::test_pep440_bump[dev-1.post0.dev1-1.post0.dev2] FAILED [ 72%] tests/test_versioning.py::test_pep440_bump[dev-1.0a2.post3.dev2-1.0a2.post3.dev3] FAILED [ 72%] tests/test_versioning.py::test_pep440_bump[major+alpha-1-2a0] FAILED [ 72%] tests/test_versioning.py::test_pep440_bump[major+alpha-1a0-2a0] FAILED [ 73%] tests/test_versioning.py::test_pep440_bump[major+alpha-1b0.dev0-2a0] FAILED [ 73%] tests/test_versioning.py::test_pep440_bump[major+beta-1-2b0] FAILED [ 73%] tests/test_versioning.py::test_pep440_bump[major+beta-1a0-2b0] FAILED [ 73%] tests/test_versioning.py::test_pep440_bump[major+candidate-1-2rc0] FAILED [ 74%] tests/test_versioning.py::test_pep440_bump[major+candidate-1a0-2rc0] FAILED [ 74%] tests/test_versioning.py::test_pep440_bump[major+dev-1-2.dev0] FAILED [ 74%] tests/test_versioning.py::test_pep440_bump[major+dev-1a0.post0-2.dev0] FAILED [ 74%] tests/test_versioning.py::test_pep440_bump[major+alpha+dev-1-2a0.dev0] FAILED [ 75%] tests/test_versioning.py::test_pep440_bump[major+alpha+dev-1a1.dev1-2a0.dev0] FAILED [ 75%] tests/test_versioning.py::test_pep440_bump[major+beta+dev-1-2b0.dev0] FAILED [ 75%] tests/test_versioning.py::test_pep440_bump[major+beta+dev-1a1.dev1-2b0.dev0] FAILED [ 75%] tests/test_versioning.py::test_pep440_bump[major+candidate+dev-1-2rc0.dev0] FAILED [ 76%] tests/test_versioning.py::test_pep440_bump[major+candidate+dev-1a1.dev1-2rc0.dev0] FAILED [ 76%] tests/test_versioning.py::test_pep440_bump[minor+alpha-1-1.1a0] FAILED [ 76%] tests/test_versioning.py::test_pep440_bump[minor+alpha-1a0-1.1a0] FAILED [ 76%] tests/test_versioning.py::test_pep440_bump[minor+alpha-1b0.dev0-1.1a0] FAILED [ 77%] tests/test_versioning.py::test_pep440_bump[minor+beta-1-1.1b0] FAILED [ 77%] tests/test_versioning.py::test_pep440_bump[minor+beta-1a0-1.1b0] FAILED [ 77%] tests/test_versioning.py::test_pep440_bump[minor+candidate-1-1.1rc0] FAILED [ 78%] tests/test_versioning.py::test_pep440_bump[minor+candidate-1a0-1.1rc0] FAILED [ 78%] tests/test_versioning.py::test_pep440_bump[minor+dev-1-1.1.dev0] FAILED [ 78%] tests/test_versioning.py::test_pep440_bump[minor+dev-1a0.post0-1.1.dev0] FAILED [ 78%] tests/test_versioning.py::test_pep440_bump[minor+alpha+dev-1-1.1a0.dev0] FAILED [ 79%] tests/test_versioning.py::test_pep440_bump[minor+alpha+dev-1a1.dev1-1.1a0.dev0] FAILED [ 79%] tests/test_versioning.py::test_pep440_bump[minor+beta+dev-1-1.1b0.dev0] FAILED [ 79%] tests/test_versioning.py::test_pep440_bump[minor+beta+dev-1a1.dev1-1.1b0.dev0] FAILED [ 79%] tests/test_versioning.py::test_pep440_bump[minor+candidate+dev-1-1.1rc0.dev0] FAILED [ 80%] tests/test_versioning.py::test_pep440_bump[minor+candidate+dev-1a1.dev1-1.1rc0.dev0] FAILED [ 80%] tests/test_versioning.py::test_pep440_bump[micro+alpha-1-1.0.1a0] FAILED [ 80%] tests/test_versioning.py::test_pep440_bump[micro+alpha-1a0-1.0.1a0] FAILED [ 80%] tests/test_versioning.py::test_pep440_bump[micro+alpha-1b0.dev0-1.0.1a0] FAILED [ 81%] tests/test_versioning.py::test_pep440_bump[micro+beta-1-1.0.1b0] FAILED [ 81%] tests/test_versioning.py::test_pep440_bump[micro+beta-1a0-1.0.1b0] FAILED [ 81%] tests/test_versioning.py::test_pep440_bump[micro+candidate-1-1.0.1rc0] FAILED [ 81%] tests/test_versioning.py::test_pep440_bump[micro+candidate-1a0-1.0.1rc0] FAILED [ 82%] tests/test_versioning.py::test_pep440_bump[micro+dev-1-1.0.1.dev0] FAILED [ 82%] tests/test_versioning.py::test_pep440_bump[micro+dev-1a0.post0-1.0.1.dev0] FAILED [ 82%] tests/test_versioning.py::test_pep440_bump[micro+alpha+dev-1-1.0.1a0.dev0] FAILED [ 82%] tests/test_versioning.py::test_pep440_bump[micro+alpha+dev-1a1.dev1-1.0.1a0.dev0] FAILED [ 83%] tests/test_versioning.py::test_pep440_bump[micro+beta+dev-1-1.0.1b0.dev0] FAILED [ 83%] tests/test_versioning.py::test_pep440_bump[micro+beta+dev-1a1.dev1-1.0.1b0.dev0] FAILED [ 83%] tests/test_versioning.py::test_pep440_bump[micro+candidate+dev-1-1.0.1rc0.dev0] FAILED [ 84%] tests/test_versioning.py::test_pep440_bump[micro+candidate+dev-1a1.dev1-1.0.1rc0.dev0] FAILED [ 84%] tests/test_versioning.py::test_pep440_bump[alpha+dev-1a0-1a1.dev0] FAILED [ 84%] tests/test_versioning.py::test_pep440_bump[beta+dev-1a0-1b0.dev0] FAILED [ 84%] tests/test_versioning.py::test_pep440_bump[beta+dev-1b0-1b1.dev0] FAILED [ 85%] tests/test_versioning.py::test_pep440_bump[candidate+dev-1a0-1rc0.dev0] FAILED [ 85%] tests/test_versioning.py::test_pep440_bump[candidate+dev-1b0-1rc0.dev0] FAILED [ 85%] tests/test_versioning.py::test_pep440_bump[candidate+dev-1rc0-1rc1.dev0] FAILED [ 85%] tests/test_versioning.py::test_pep440_bump_major_zerover[0.0.1-0.1.0] FAILED [ 86%] tests/test_versioning.py::test_pep440_bump_major_zerover[0.1.0-0.2.0] FAILED [ 86%] tests/test_versioning.py::test_pep440_bump_major_zerover[0.1.1-0.2.0] FAILED [ 86%] tests/test_versioning.py::test_pep440_bump_major_zerover[1.0.0-2.0.0] FAILED [ 86%] tests/test_versioning.py::test_pep440_bump_major_zerover[1.0.1-2.0.0] FAILED [ 87%] tests/test_versioning.py::test_pep440_bump_major_zerover[1.1.0-2.0.0] FAILED [ 87%] tests/test_versioning.py::test_pep440_bump_major_zerover[1.1.1-2.0.0] FAILED [ 87%] tests/test_versioning.py::test_pep440_bump_major_zerover[1-2] FAILED [ 87%] tests/test_versioning.py::test_pep440_bump_major_zerover[1.1-2.0] FAILED [ 88%] tests/test_versioning.py::test_pep440_bump_major_zerover[1a2.post3-2] FAILED [ 88%] tests/test_versioning.py::test_pep440_bump_error[pre-1] PASSED [ 88%] tests/test_versioning.py::test_pep440_bump_error[pre-1.0] PASSED [ 89%] tests/test_versioning.py::test_pep440_bump_error[pre-1.0.post0] PASSED [ 89%] tests/test_versioning.py::test_pep440_bump_error[pre-1.0.dev0] PASSED [ 89%] tests/test_versioning.py::test_pep440_bump_error[release-1.post0] PASSED [ 89%] tests/test_versioning.py::test_pep440_bump_error[release-1.post0.dev0] PASSED [ 90%] tests/test_versioning.py::test_pep440_bump_error[alpha-1b0] PASSED [ 90%] tests/test_versioning.py::test_pep440_bump_error[alpha-1rc0] PASSED [ 90%] tests/test_versioning.py::test_pep440_bump_error[beta-1rc0] PASSED [ 90%] tests/test_versioning.py::test_pep440_bump_error[dev-1] PASSED [ 91%] tests/test_versioning.py::test_pep440_bump_error[dev-1a0] PASSED [ 91%] tests/test_versioning.py::test_pep440_bump_error[dev-1.post0] PASSED [ 91%] tests/test_versioning.py::test_pep440_bump_unknown_part PASSED [ 91%] tests/test_versioning.py::test_pep440_bump_trim[release-1.0-1] FAILED [ 92%] tests/test_versioning.py::test_pep440_bump_trim[release-1.0a0-1] FAILED [ 92%] tests/test_versioning.py::test_pep440_bump_trim[major-1.0-2] FAILED [ 92%] tests/test_versioning.py::test_pep440_bump_trim[major-1.0a0-2] FAILED [ 92%] tests/test_versioning.py::test_pep440_bump_trim[minor-1.0-1.1] FAILED [ 93%] tests/test_versioning.py::test_pep440_bump_trim[minor-1.0.0a0-1.1] FAILED [ 93%] tests/test_versioning.py::test_pep440_bump_trim[micro-1.0.0.0-1.0.1] FAILED [ 93%] tests/test_versioning.py::test_pep440_bump_trim[micro-1.0.0.0a0-1.0.1] FAILED [ 93%] tests/test_versioning.py::test_pep440_dent[pre-1-1a0] FAILED [ 94%] tests/test_versioning.py::test_pep440_dent[pre-1.0-1.0a0] FAILED [ 94%] tests/test_versioning.py::test_pep440_dent[alpha-1-1a0] FAILED [ 94%] tests/test_versioning.py::test_pep440_dent[alpha-1.0-1.0a0] FAILED [ 95%] tests/test_versioning.py::test_pep440_dent[beta-1-1b0] FAILED [ 95%] tests/test_versioning.py::test_pep440_dent[beta-1.0-1.0b0] FAILED [ 95%] tests/test_versioning.py::test_pep440_dent[candidate-1-1rc0] FAILED [ 95%] tests/test_versioning.py::test_pep440_dent[candidate-1.0-1.0rc0] FAILED [ 96%] tests/test_versioning.py::test_pep440_dent[dev-1-1.dev0] FAILED [ 96%] tests/test_versioning.py::test_pep440_dent[dev-1.0-1.0.dev0] FAILED [ 96%] tests/test_versioning.py::test_pep440_dent_error[pre-1a0] PASSED [ 96%] tests/test_versioning.py::test_pep440_dent_error[pre-1b0] PASSED [ 97%] tests/test_versioning.py::test_pep440_dent_error[pre-1rc0] PASSED [ 97%] tests/test_versioning.py::test_pep440_dent_error[alpha-1a0] PASSED [ 97%] tests/test_versioning.py::test_pep440_dent_error[alpha-1b0] PASSED [ 97%] tests/test_versioning.py::test_pep440_dent_error[alpha-1rc0] PASSED [ 98%] tests/test_versioning.py::test_pep440_dent_error[beta-1a0] PASSED [ 98%] tests/test_versioning.py::test_pep440_dent_error[beta-1b0] PASSED [ 98%] tests/test_versioning.py::test_pep440_dent_error[beta-1rc0] PASSED [ 98%] tests/test_versioning.py::test_pep440_dent_error[candidate-1a0] PASSED [ 99%] tests/test_versioning.py::test_pep440_dent_error[candidate-1b0] PASSED [ 99%] tests/test_versioning.py::test_pep440_dent_error[candidate-1rc0] PASSED [ 99%] tests/test_versioning.py::test_pep440_dent_error[dev-1.dev0] PASSED [100%] =================================== FAILURES =================================== _____________ test_bump_with_semver_on_new_repo[pep440-auto-0.0.1] _____________ repo = , versioning = 'pep440' bump = 'auto', expected = '0.0.1' @pytest.mark.parametrize( ("versioning", "bump", "expected"), [ ("semver", "auto", "0.0.1"), # chore commit ("semver", "major", "1.0.0"), ("semver", "minor", "0.1.0"), ("semver", "patch", "0.0.1"), ("semver", "1.1.1", "1.1.1"), ("pep440", "auto", "0.0.1"), # chore commit ("pep440", "major", "1.0.0"), ("pep440", "minor+dev", "0.1.0.dev0"), ("pep440", "micro+alpha+dev", "0.0.1a0.dev0"), ("pep440", "1.1.1", "1.1.1"), ], ) def test_bump_with_semver_on_new_repo( repo: GitRepo, versioning: Literal["pep440", "semver"], bump: str, expected: str, ) -> None: """Bump to user specified version on new Git repo. Parameters: repo: GitRepo to a temporary repository. bump: The bump parameter value. expected: Expected version for the new changelog entry. """ > changelog = Changelog( repo.path, convention=AngularConvention, bump=bump, versioning=versioning, zerover=False, ) tests/test_build.py:45: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:378: in __init__ self._bump(bump) ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:579: in _bump last_version.planned_tag = self.version_bumper(last_tag, version, zerover=self.zerover) # ty:ignore[invalid-argument-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________ test_bump_with_semver_on_new_repo[pep440-major-1.0.0] _____________ repo = , versioning = 'pep440' bump = 'major', expected = '1.0.0' @pytest.mark.parametrize( ("versioning", "bump", "expected"), [ ("semver", "auto", "0.0.1"), # chore commit ("semver", "major", "1.0.0"), ("semver", "minor", "0.1.0"), ("semver", "patch", "0.0.1"), ("semver", "1.1.1", "1.1.1"), ("pep440", "auto", "0.0.1"), # chore commit ("pep440", "major", "1.0.0"), ("pep440", "minor+dev", "0.1.0.dev0"), ("pep440", "micro+alpha+dev", "0.0.1a0.dev0"), ("pep440", "1.1.1", "1.1.1"), ], ) def test_bump_with_semver_on_new_repo( repo: GitRepo, versioning: Literal["pep440", "semver"], bump: str, expected: str, ) -> None: """Bump to user specified version on new Git repo. Parameters: repo: GitRepo to a temporary repository. bump: The bump parameter value. expected: Expected version for the new changelog entry. """ > changelog = Changelog( repo.path, convention=AngularConvention, bump=bump, versioning=versioning, zerover=False, ) tests/test_build.py:45: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:378: in __init__ self._bump(bump) ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:579: in _bump last_version.planned_tag = self.version_bumper(last_tag, version, zerover=self.zerover) # ty:ignore[invalid-argument-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________ test_bump_with_semver_on_new_repo[pep440-minor+dev-0.1.0.dev0] ________ repo = , versioning = 'pep440' bump = 'minor+dev', expected = '0.1.0.dev0' @pytest.mark.parametrize( ("versioning", "bump", "expected"), [ ("semver", "auto", "0.0.1"), # chore commit ("semver", "major", "1.0.0"), ("semver", "minor", "0.1.0"), ("semver", "patch", "0.0.1"), ("semver", "1.1.1", "1.1.1"), ("pep440", "auto", "0.0.1"), # chore commit ("pep440", "major", "1.0.0"), ("pep440", "minor+dev", "0.1.0.dev0"), ("pep440", "micro+alpha+dev", "0.0.1a0.dev0"), ("pep440", "1.1.1", "1.1.1"), ], ) def test_bump_with_semver_on_new_repo( repo: GitRepo, versioning: Literal["pep440", "semver"], bump: str, expected: str, ) -> None: """Bump to user specified version on new Git repo. Parameters: repo: GitRepo to a temporary repository. bump: The bump parameter value. expected: Expected version for the new changelog entry. """ > changelog = Changelog( repo.path, convention=AngularConvention, bump=bump, versioning=versioning, zerover=False, ) tests/test_build.py:45: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:378: in __init__ self._bump(bump) ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:579: in _bump last_version.planned_tag = self.version_bumper(last_tag, version, zerover=self.zerover) # ty:ignore[invalid-argument-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____ test_bump_with_semver_on_new_repo[pep440-micro+alpha+dev-0.0.1a0.dev0] ____ repo = , versioning = 'pep440' bump = 'micro+alpha+dev', expected = '0.0.1a0.dev0' @pytest.mark.parametrize( ("versioning", "bump", "expected"), [ ("semver", "auto", "0.0.1"), # chore commit ("semver", "major", "1.0.0"), ("semver", "minor", "0.1.0"), ("semver", "patch", "0.0.1"), ("semver", "1.1.1", "1.1.1"), ("pep440", "auto", "0.0.1"), # chore commit ("pep440", "major", "1.0.0"), ("pep440", "minor+dev", "0.1.0.dev0"), ("pep440", "micro+alpha+dev", "0.0.1a0.dev0"), ("pep440", "1.1.1", "1.1.1"), ], ) def test_bump_with_semver_on_new_repo( repo: GitRepo, versioning: Literal["pep440", "semver"], bump: str, expected: str, ) -> None: """Bump to user specified version on new Git repo. Parameters: repo: GitRepo to a temporary repository. bump: The bump parameter value. expected: Expected version for the new changelog entry. """ > changelog = Changelog( repo.path, convention=AngularConvention, bump=bump, versioning=versioning, zerover=False, ) tests/test_build.py:45: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:378: in __init__ self._bump(bump) ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:579: in _bump last_version.planned_tag = self.version_bumper(last_tag, version, zerover=self.zerover) # ty:ignore[invalid-argument-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________ test_bump_with_semver_on_new_repo[pep440-1.1.1-1.1.1] _____________ repo = , versioning = 'pep440' bump = '1.1.1', expected = '1.1.1' @pytest.mark.parametrize( ("versioning", "bump", "expected"), [ ("semver", "auto", "0.0.1"), # chore commit ("semver", "major", "1.0.0"), ("semver", "minor", "0.1.0"), ("semver", "patch", "0.0.1"), ("semver", "1.1.1", "1.1.1"), ("pep440", "auto", "0.0.1"), # chore commit ("pep440", "major", "1.0.0"), ("pep440", "minor+dev", "0.1.0.dev0"), ("pep440", "micro+alpha+dev", "0.0.1a0.dev0"), ("pep440", "1.1.1", "1.1.1"), ], ) def test_bump_with_semver_on_new_repo( repo: GitRepo, versioning: Literal["pep440", "semver"], bump: str, expected: str, ) -> None: """Bump to user specified version on new Git repo. Parameters: repo: GitRepo to a temporary repository. bump: The bump parameter value. expected: Expected version for the new changelog entry. """ > changelog = Changelog( repo.path, convention=AngularConvention, bump=bump, versioning=versioning, zerover=False, ) tests/test_build.py:45: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:378: in __init__ self._bump(bump) ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:583: in _bump self.version_bumper(version) ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________________________ test_versioning ________________________________ repo = def test_versioning(repo: GitRepo) -> None: """Use a specific versioning scheme. Parameters: repo: Temporary Git repository (fixture). """ repo.commit("feat: Feature") repo.tag("1.0.0") repo.commit("fix: Fix") with repo.enter(): assert main(["-cconventional", "-nsemver", "-Bauto"]) == 0 > assert main(["-cconventional", "-npep440", "-Bauto"]) == 0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_cli.py:301: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/cli.py:948: in main build_and_render(**settings) ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/cli.py:822: in build_and_render changelog = build( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/cli.py:612: in build changelog = Changelog( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:378: in __init__ self._bump(bump) ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/build.py:579: in _bump last_version.planned_tag = self.version_bumper(last_tag, version, zerover=self.zerover) # ty:ignore[invalid-argument-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ----------------------------- Captured stdout call ----------------------------- # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [1.0.1](https://github.com/example/example/releases/tag/1.0.1) - 2026-03-28 [Compare with 1.0.0](https://github.com/example/example/compare/1.0.0...1.0.1) ### Bug Fixes - Fix ([1088574](https://github.com/example/example/commit/1088574aee90de58104927945d223285c72f8a5c) by dummy). ## [1.0.0](https://github.com/example/example/releases/tag/1.0.0) - 2026-03-28 [Compare with first commit](https://github.com/example/example/compare/9aa98356091196d1e0d66a48bb958e3700cbd672...1.0.0) ### Features - Feature ([97dd635](https://github.com/example/example/commit/97dd635cbe4fe6c2df9a22d0480a72fb542099d5) by dummy). _____________________ test_pep440_bump[epoch-0!1.0-1!1.0] ______________________ part = 'epoch', version = '0!1.0', bumped = '1!1.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:740: in __call__ pep440_version = pep440_version.bump_epoch() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:180: in bump_epoch return PEP440Version.from_parts(epoch=self.epoch + 1, release=self.release) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 1, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[epoch-1!1.0-2!1.0] ______________________ part = 'epoch', version = '1!1.0', bumped = '2!1.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:740: in __call__ pep440_version = pep440_version.bump_epoch() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:180: in bump_epoch return PEP440Version.from_parts(epoch=self.epoch + 1, release=self.release) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 2, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________________ test_pep440_bump[epoch-2!1.0a0.dev1-3!1.0] __________________ part = 'epoch', version = '2!1.0a0.dev1', bumped = '3!1.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:740: in __call__ pep440_version = pep440_version.bump_epoch() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:180: in bump_epoch return PEP440Version.from_parts(epoch=self.epoch + 1, release=self.release) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 3, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[release-1.0a0-1.0] ______________________ part = 'release', version = '1.0a0', bumped = '1.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:742: in __call__ pep440_version = pep440_version.bump_release(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[release-1.0.1b1-1.0.1] ____________________ part = 'release', version = '1.0.1b1', bumped = '1.0.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:742: in __call__ pep440_version = pep440_version.bump_release(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[release-2.1rc2-2.1] _____________________ part = 'release', version = '2.1rc2', bumped = '2.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:742: in __call__ pep440_version = pep440_version.bump_release(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________________ test_pep440_bump[release-1.dev0-1] ______________________ part = 'release', version = '1.dev0', bumped = '1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:742: in __call__ pep440_version = pep440_version.bump_release(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major-0.0.1-1.0.0] ______________________ part = 'major', version = '0.0.1', bumped = '1.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major-0.1.0-1.0.0] ______________________ part = 'major', version = '0.1.0', bumped = '1.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major-0.1.1-1.0.0] ______________________ part = 'major', version = '0.1.1', bumped = '1.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major-1.0.0-2.0.0] ______________________ part = 'major', version = '1.0.0', bumped = '2.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major-1.0.1-2.0.0] ______________________ part = 'major', version = '1.0.1', bumped = '2.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major-1.1.0-2.0.0] ______________________ part = 'major', version = '1.1.0', bumped = '2.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major-1.1.1-2.0.0] ______________________ part = 'major', version = '1.1.1', bumped = '2.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________________ test_pep440_bump[major-1-2] __________________________ part = 'major', version = '1', bumped = '2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________________ test_pep440_bump[major-1.1-2.0] ________________________ part = 'major', version = '1.1', bumped = '2.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[major-1.1.1.1-2.0.0.0] ____________________ part = 'major', version = '1.1.1.1', bumped = '2.0.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major-1a2.post3-2] ______________________ part = 'major', version = '1a2.post3', bumped = '2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[minor-0.0.1-0.1.0] ______________________ part = 'minor', version = '0.0.1', bumped = '0.1.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[minor-0.1.0-0.2.0] ______________________ part = 'minor', version = '0.1.0', bumped = '0.2.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[minor-0.1.1-0.2.0] ______________________ part = 'minor', version = '0.1.1', bumped = '0.2.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[minor-1.0.0-1.1.0] ______________________ part = 'minor', version = '1.0.0', bumped = '1.1.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[minor-1.0.1-1.1.0] ______________________ part = 'minor', version = '1.0.1', bumped = '1.1.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[minor-1.1.0-1.2.0] ______________________ part = 'minor', version = '1.1.0', bumped = '1.2.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[minor-1.1.1-1.2.0] ______________________ part = 'minor', version = '1.1.1', bumped = '1.2.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________________ test_pep440_bump[minor-1-1.1] _________________________ part = 'minor', version = '1', bumped = '1.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________________ test_pep440_bump[minor-1.1-1.2] ________________________ part = 'minor', version = '1.1', bumped = '1.2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[minor-1.1.1.1-1.2.0.0] ____________________ part = 'minor', version = '1.1.1.1', bumped = '1.2.0.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump[minor-1a2.post3-1.1] _____________________ part = 'minor', version = '1a2.post3', bumped = '1.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[micro-0.0.1-0.0.2] ______________________ part = 'micro', version = '0.0.1', bumped = '0.0.2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[micro-0.1.0-0.1.1] ______________________ part = 'micro', version = '0.1.0', bumped = '0.1.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[micro-0.1.1-0.1.2] ______________________ part = 'micro', version = '0.1.1', bumped = '0.1.2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[micro-1.0.0-1.0.1] ______________________ part = 'micro', version = '1.0.0', bumped = '1.0.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[micro-1.0.1-1.0.2] ______________________ part = 'micro', version = '1.0.1', bumped = '1.0.2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[micro-1.1.0-1.1.1] ______________________ part = 'micro', version = '1.1.0', bumped = '1.1.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[micro-1.1.1-1.1.2] ______________________ part = 'micro', version = '1.1.1', bumped = '1.1.2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________________ test_pep440_bump[micro-1-1.0.1] ________________________ part = 'micro', version = '1', bumped = '1.0.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________________ test_pep440_bump[micro-1.1-1.1.1] _______________________ part = 'micro', version = '1.1', bumped = '1.1.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[micro-1.1.1.1-1.1.2.0] ____________________ part = 'micro', version = '1.1.1.1', bumped = '1.1.2.0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[micro-1a2.post3-1.0.1] ____________________ part = 'micro', version = '1a2.post3', bumped = '1.0.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________________ test_pep440_bump[pre-1a0-1a1] _________________________ part = 'pre', version = '1a0', bumped = '1a1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:754: in __call__ pep440_version = pep440_version.bump_pre() ^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________________ test_pep440_bump[pre-1b1-1b2] _________________________ part = 'pre', version = '1b1', bumped = '1b2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:754: in __call__ pep440_version = pep440_version.bump_pre() ^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________________ test_pep440_bump[pre-1c2-1rc3] ________________________ part = 'pre', version = '1c2', bumped = '1rc3' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:754: in __call__ pep440_version = pep440_version.bump_pre() ^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[pre-1.0a2.post3-1.0a3] ____________________ part = 'pre', version = '1.0a2.post3', bumped = '1.0a3' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:754: in __call__ pep440_version = pep440_version.bump_pre() ^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________________ test_pep440_bump[alpha-1a0-1a1] ________________________ part = 'alpha', version = '1a0', bumped = '1a1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:756: in __call__ pep440_version = pep440_version.bump_alpha() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:419: in bump_alpha return self.bump_pre("a") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump[alpha-1.1a99-1.1a100] ____________________ part = 'alpha', version = '1.1a99', bumped = '1.1a100' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:756: in __call__ pep440_version = pep440_version.bump_alpha() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:419: in bump_alpha return self.bump_pre("a") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________________ test_pep440_bump[beta-1a0-1b0] ________________________ part = 'beta', version = '1a0', bumped = '1b0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:758: in __call__ pep440_version = pep440_version.bump_beta() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:437: in bump_beta return self.bump_pre("b") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[beta-1.1a99-1.1b0] ______________________ part = 'beta', version = '1.1a99', bumped = '1.1b0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:758: in __call__ pep440_version = pep440_version.bump_beta() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:437: in bump_beta return self.bump_pre("b") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________________ test_pep440_bump[beta-1b0-1b1] ________________________ part = 'beta', version = '1b0', bumped = '1b1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:758: in __call__ pep440_version = pep440_version.bump_beta() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:437: in bump_beta return self.bump_pre("b") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________________ test_pep440_bump[beta-1.1b1-1.1b2] ______________________ part = 'beta', version = '1.1b1', bumped = '1.1b2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:758: in __call__ pep440_version = pep440_version.bump_beta() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:437: in bump_beta return self.bump_pre("b") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[candidate-1a0-1rc0] _____________________ part = 'candidate', version = '1a0', bumped = '1rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________________ test_pep440_bump[candidate-1.1a99-1.1rc0] ___________________ part = 'candidate', version = '1.1a99', bumped = '1.1rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[candidate-1b0-1rc0] _____________________ part = 'candidate', version = '1b0', bumped = '1rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[candidate-1.1b1-1.1rc0] ___________________ part = 'candidate', version = '1.1b1', bumped = '1.1rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[candidate-1c0-1rc1] _____________________ part = 'candidate', version = '1c0', bumped = '1rc1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________________ test_pep440_bump[candidate-1.1rc1-1.1rc2] ___________________ part = 'candidate', version = '1.1rc1', bumped = '1.1rc2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________________ test_pep440_bump[post-1-1.post0] _______________________ part = 'post', version = '1', bumped = '1.post0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:762: in __call__ pep440_version = pep440_version.bump_post() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:474: in bump_post return PEP440Version.from_parts( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': 0, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump[post-1.post0-1.post1] ____________________ part = 'post', version = '1.post0', bumped = '1.post1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:762: in __call__ pep440_version = pep440_version.bump_post() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:474: in bump_post return PEP440Version.from_parts( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': 1, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[post-1.0a2.post3-1.0a2.post4] ________________ part = 'post', version = '1.0a2.post3', bumped = '1.0a2.post4' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:762: in __call__ pep440_version = pep440_version.bump_post() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:474: in bump_post return PEP440Version.from_parts( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': 4, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[dev-1.dev0-1.dev1] ______________________ part = 'dev', version = '1.dev0', bumped = '1.dev1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:764: in __call__ pep440_version = pep440_version.bump_dev() ^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:509: in bump_dev return PEP440Version.from_parts( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': 1, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________ test_pep440_bump[dev-1.post0.dev1-1.post0.dev2] ________________ part = 'dev', version = '1.post0.dev1', bumped = '1.post0.dev2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:764: in __call__ pep440_version = pep440_version.bump_dev() ^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:509: in bump_dev return PEP440Version.from_parts( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': 2, 'epoch': 0, 'local': None, 'post': 0, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________ test_pep440_bump[dev-1.0a2.post3.dev2-1.0a2.post3.dev3] ____________ part = 'dev', version = '1.0a2.post3.dev2', bumped = '1.0a2.post3.dev3' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:764: in __call__ pep440_version = pep440_version.bump_dev() ^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:509: in bump_dev return PEP440Version.from_parts( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': 3, 'epoch': 0, 'local': None, 'post': 3, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major+alpha-1-2a0] ______________________ part = 'major+alpha', version = '1', bumped = '2a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump[major+alpha-1a0-2a0] _____________________ part = 'major+alpha', version = '1a0', bumped = '2a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________________ test_pep440_bump[major+alpha-1b0.dev0-2a0] __________________ part = 'major+alpha', version = '1b0.dev0', bumped = '2a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________________ test_pep440_bump[major+beta-1-2b0] ______________________ part = 'major+beta', version = '1', bumped = '2b0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major+beta-1a0-2b0] _____________________ part = 'major+beta', version = '1a0', bumped = '2b0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[major+candidate-1-2rc0] ___________________ part = 'major+candidate', version = '1', bumped = '2rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________________ test_pep440_bump[major+candidate-1a0-2rc0] __________________ part = 'major+candidate', version = '1a0', bumped = '2rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[major+dev-1-2.dev0] _____________________ part = 'major+dev', version = '1', bumped = '2.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump[major+dev-1a0.post0-2.dev0] _________________ part = 'major+dev', version = '1a0.post0', bumped = '2.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump[major+alpha+dev-1-2a0.dev0] _________________ part = 'major+alpha+dev', version = '1', bumped = '2a0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________ test_pep440_bump[major+alpha+dev-1a1.dev1-2a0.dev0] ______________ part = 'major+alpha+dev', version = '1a1.dev1', bumped = '2a0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump[major+beta+dev-1-2b0.dev0] __________________ part = 'major+beta+dev', version = '1', bumped = '2b0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________ test_pep440_bump[major+beta+dev-1a1.dev1-2b0.dev0] ______________ part = 'major+beta+dev', version = '1a1.dev1', bumped = '2b0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________ test_pep440_bump[major+candidate+dev-1-2rc0.dev0] _______________ part = 'major+candidate+dev', version = '1', bumped = '2rc0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________ test_pep440_bump[major+candidate+dev-1a1.dev1-2rc0.dev0] ___________ part = 'major+candidate+dev', version = '1a1.dev1', bumped = '2rc0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump[minor+alpha-1-1.1a0] _____________________ part = 'minor+alpha', version = '1', bumped = '1.1a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[minor+alpha-1a0-1.1a0] ____________________ part = 'minor+alpha', version = '1a0', bumped = '1.1a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump[minor+alpha-1b0.dev0-1.1a0] _________________ part = 'minor+alpha', version = '1b0.dev0', bumped = '1.1a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump[minor+beta-1-1.1b0] _____________________ part = 'minor+beta', version = '1', bumped = '1.1b0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump[minor+beta-1a0-1.1b0] ____________________ part = 'minor+beta', version = '1a0', bumped = '1.1b0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________________ test_pep440_bump[minor+candidate-1-1.1rc0] __________________ part = 'minor+candidate', version = '1', bumped = '1.1rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump[minor+candidate-1a0-1.1rc0] _________________ part = 'minor+candidate', version = '1a0', bumped = '1.1rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump[minor+dev-1-1.1.dev0] ____________________ part = 'minor+dev', version = '1', bumped = '1.1.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[minor+dev-1a0.post0-1.1.dev0] ________________ part = 'minor+dev', version = '1a0.post0', bumped = '1.1.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[minor+alpha+dev-1-1.1a0.dev0] ________________ part = 'minor+alpha+dev', version = '1', bumped = '1.1a0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________ test_pep440_bump[minor+alpha+dev-1a1.dev1-1.1a0.dev0] _____________ part = 'minor+alpha+dev', version = '1a1.dev1', bumped = '1.1a0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[minor+beta+dev-1-1.1b0.dev0] _________________ part = 'minor+beta+dev', version = '1', bumped = '1.1b0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________ test_pep440_bump[minor+beta+dev-1a1.dev1-1.1b0.dev0] _____________ part = 'minor+beta+dev', version = '1a1.dev1', bumped = '1.1b0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________ test_pep440_bump[minor+candidate+dev-1-1.1rc0.dev0] ______________ part = 'minor+candidate+dev', version = '1', bumped = '1.1rc0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________ test_pep440_bump[minor+candidate+dev-1a1.dev1-1.1rc0.dev0] __________ part = 'minor+candidate+dev', version = '1a1.dev1', bumped = '1.1rc0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[micro+alpha-1-1.0.1a0] ____________________ part = 'micro+alpha', version = '1', bumped = '1.0.1a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________________ test_pep440_bump[micro+alpha-1a0-1.0.1a0] ___________________ part = 'micro+alpha', version = '1a0', bumped = '1.0.1a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[micro+alpha-1b0.dev0-1.0.1a0] ________________ part = 'micro+alpha', version = '1b0.dev0', bumped = '1.0.1a0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump[micro+beta-1-1.0.1b0] ____________________ part = 'micro+beta', version = '1', bumped = '1.0.1b0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[micro+beta-1a0-1.0.1b0] ___________________ part = 'micro+beta', version = '1a0', bumped = '1.0.1b0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump[micro+candidate-1-1.0.1rc0] _________________ part = 'micro+candidate', version = '1', bumped = '1.0.1rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[micro+candidate-1a0-1.0.1rc0] ________________ part = 'micro+candidate', version = '1a0', bumped = '1.0.1rc0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[micro+dev-1-1.0.1.dev0] ___________________ part = 'micro+dev', version = '1', bumped = '1.0.1.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________ test_pep440_bump[micro+dev-1a0.post0-1.0.1.dev0] _______________ part = 'micro+dev', version = '1a0.post0', bumped = '1.0.1.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________ test_pep440_bump[micro+alpha+dev-1-1.0.1a0.dev0] _______________ part = 'micro+alpha+dev', version = '1', bumped = '1.0.1a0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________ test_pep440_bump[micro+alpha+dev-1a1.dev1-1.0.1a0.dev0] ____________ part = 'micro+alpha+dev', version = '1a1.dev1', bumped = '1.0.1a0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________ test_pep440_bump[micro+beta+dev-1-1.0.1b0.dev0] ________________ part = 'micro+beta+dev', version = '1', bumped = '1.0.1b0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________ test_pep440_bump[micro+beta+dev-1a1.dev1-1.0.1b0.dev0] ____________ part = 'micro+beta+dev', version = '1a1.dev1', bumped = '1.0.1b0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________ test_pep440_bump[micro+candidate+dev-1-1.0.1rc0.dev0] _____________ part = 'micro+candidate+dev', version = '1', bumped = '1.0.1rc0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________ test_pep440_bump[micro+candidate+dev-1a1.dev1-1.0.1rc0.dev0] _________ part = 'micro+candidate+dev', version = '1a1.dev1', bumped = '1.0.1rc0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[alpha+dev-1a0-1a1.dev0] ___________________ part = 'alpha+dev', version = '1a0', bumped = '1a1.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:756: in __call__ pep440_version = pep440_version.bump_alpha() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:419: in bump_alpha return self.bump_pre("a") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[beta+dev-1a0-1b0.dev0] ____________________ part = 'beta+dev', version = '1a0', bumped = '1b0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:758: in __call__ pep440_version = pep440_version.bump_beta() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:437: in bump_beta return self.bump_pre("b") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump[beta+dev-1b0-1b1.dev0] ____________________ part = 'beta+dev', version = '1b0', bumped = '1b1.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:758: in __call__ pep440_version = pep440_version.bump_beta() ^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:437: in bump_beta return self.bump_pre("b") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[candidate+dev-1a0-1rc0.dev0] _________________ part = 'candidate+dev', version = '1a0', bumped = '1rc0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[candidate+dev-1b0-1rc0.dev0] _________________ part = 'candidate+dev', version = '1b0', bumped = '1rc0.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________ test_pep440_bump[candidate+dev-1rc0-1rc1.dev0] ________________ part = 'candidate+dev', version = '1rc0', bumped = '1rc1.dev0' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("epoch", "0!1.0", "1!1.0"), ("epoch", "1!1.0", "2!1.0"), ("epoch", "2!1.0a0.dev1", "3!1.0"), ("release", "1.0a0", "1.0"), ("release", "1.0.1b1", "1.0.1"), ("release", "2.1rc2", "2.1"), ("release", "1.dev0", "1"), ("major", "0.0.1", "1.0.0"), ("major", "0.1.0", "1.0.0"), ("major", "0.1.1", "1.0.0"), ("major", "1.0.0", "2.0.0"), ("major", "1.0.1", "2.0.0"), ("major", "1.1.0", "2.0.0"), ("major", "1.1.1", "2.0.0"), ("major", "1", "2"), ("major", "1.1", "2.0"), ("major", "1.1.1.1", "2.0.0.0"), ("major", "1a2.post3", "2"), ("minor", "0.0.1", "0.1.0"), ("minor", "0.1.0", "0.2.0"), ("minor", "0.1.1", "0.2.0"), ("minor", "1.0.0", "1.1.0"), ("minor", "1.0.1", "1.1.0"), ("minor", "1.1.0", "1.2.0"), ("minor", "1.1.1", "1.2.0"), ("minor", "1", "1.1"), ("minor", "1.1", "1.2"), ("minor", "1.1.1.1", "1.2.0.0"), ("minor", "1a2.post3", "1.1"), ("micro", "0.0.1", "0.0.2"), ("micro", "0.1.0", "0.1.1"), ("micro", "0.1.1", "0.1.2"), ("micro", "1.0.0", "1.0.1"), ("micro", "1.0.1", "1.0.2"), ("micro", "1.1.0", "1.1.1"), ("micro", "1.1.1", "1.1.2"), ("micro", "1", "1.0.1"), ("micro", "1.1", "1.1.1"), ("micro", "1.1.1.1", "1.1.2.0"), ("micro", "1a2.post3", "1.0.1"), ("pre", "1a0", "1a1"), ("pre", "1b1", "1b2"), ("pre", "1c2", "1rc3"), ("pre", "1.0a2.post3", "1.0a3"), ("alpha", "1a0", "1a1"), ("alpha", "1.1a99", "1.1a100"), ("beta", "1a0", "1b0"), ("beta", "1.1a99", "1.1b0"), ("beta", "1b0", "1b1"), ("beta", "1.1b1", "1.1b2"), ("candidate", "1a0", "1rc0"), ("candidate", "1.1a99", "1.1rc0"), ("candidate", "1b0", "1rc0"), ("candidate", "1.1b1", "1.1rc0"), ("candidate", "1c0", "1rc1"), ("candidate", "1.1rc1", "1.1rc2"), ("post", "1", "1.post0"), ("post", "1.post0", "1.post1"), ("post", "1.0a2.post3", "1.0a2.post4"), ("dev", "1.dev0", "1.dev1"), ("dev", "1.post0.dev1", "1.post0.dev2"), ("dev", "1.0a2.post3.dev2", "1.0a2.post3.dev3"), ("major+alpha", "1", "2a0"), ("major+alpha", "1a0", "2a0"), ("major+alpha", "1b0.dev0", "2a0"), ("major+beta", "1", "2b0"), ("major+beta", "1a0", "2b0"), ("major+candidate", "1", "2rc0"), ("major+candidate", "1a0", "2rc0"), ("major+dev", "1", "2.dev0"), ("major+dev", "1a0.post0", "2.dev0"), ("major+alpha+dev", "1", "2a0.dev0"), ("major+alpha+dev", "1a1.dev1", "2a0.dev0"), ("major+beta+dev", "1", "2b0.dev0"), ("major+beta+dev", "1a1.dev1", "2b0.dev0"), ("major+candidate+dev", "1", "2rc0.dev0"), ("major+candidate+dev", "1a1.dev1", "2rc0.dev0"), ("minor+alpha", "1", "1.1a0"), ("minor+alpha", "1a0", "1.1a0"), ("minor+alpha", "1b0.dev0", "1.1a0"), ("minor+beta", "1", "1.1b0"), ("minor+beta", "1a0", "1.1b0"), ("minor+candidate", "1", "1.1rc0"), ("minor+candidate", "1a0", "1.1rc0"), ("minor+dev", "1", "1.1.dev0"), ("minor+dev", "1a0.post0", "1.1.dev0"), ("minor+alpha+dev", "1", "1.1a0.dev0"), ("minor+alpha+dev", "1a1.dev1", "1.1a0.dev0"), ("minor+beta+dev", "1", "1.1b0.dev0"), ("minor+beta+dev", "1a1.dev1", "1.1b0.dev0"), ("minor+candidate+dev", "1", "1.1rc0.dev0"), ("minor+candidate+dev", "1a1.dev1", "1.1rc0.dev0"), ("micro+alpha", "1", "1.0.1a0"), ("micro+alpha", "1a0", "1.0.1a0"), ("micro+alpha", "1b0.dev0", "1.0.1a0"), ("micro+beta", "1", "1.0.1b0"), ("micro+beta", "1a0", "1.0.1b0"), ("micro+candidate", "1", "1.0.1rc0"), ("micro+candidate", "1a0", "1.0.1rc0"), ("micro+dev", "1", "1.0.1.dev0"), ("micro+dev", "1a0.post0", "1.0.1.dev0"), ("micro+alpha+dev", "1", "1.0.1a0.dev0"), ("micro+alpha+dev", "1a1.dev1", "1.0.1a0.dev0"), ("micro+beta+dev", "1", "1.0.1b0.dev0"), ("micro+beta+dev", "1a1.dev1", "1.0.1b0.dev0"), ("micro+candidate+dev", "1", "1.0.1rc0.dev0"), ("micro+candidate+dev", "1a1.dev1", "1.0.1rc0.dev0"), ("alpha+dev", "1a0", "1a1.dev0"), ("beta+dev", "1a0", "1b0.dev0"), ("beta+dev", "1b0", "1b1.dev0"), ("candidate+dev", "1a0", "1rc0.dev0"), ("candidate+dev", "1b0", "1rc0.dev0"), ("candidate+dev", "1rc0", "1rc1.dev0"), ], ) def test_pep440_bump(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, zerover=False) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:760: in __call__ pep440_version = pep440_version.bump_candidate() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:455: in bump_candidate return self.bump_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:401: in bump_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, number)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_major_zerover[0.0.1-0.1.0] __________________ version = '0.0.1', bumped = '0.1.0' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:746: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_major_zerover[0.1.0-0.2.0] __________________ version = '0.1.0', bumped = '0.2.0' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:746: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_major_zerover[0.1.1-0.2.0] __________________ version = '0.1.1', bumped = '0.2.0' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:746: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_major_zerover[1.0.0-2.0.0] __________________ version = '1.0.0', bumped = '2.0.0' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_major_zerover[1.0.1-2.0.0] __________________ version = '1.0.1', bumped = '2.0.0' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_major_zerover[1.1.0-2.0.0] __________________ version = '1.1.0', bumped = '2.0.0' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_major_zerover[1.1.1-2.0.0] __________________ version = '1.1.1', bumped = '2.0.0' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump_major_zerover[1-2] ______________________ version = '1', bumped = '2' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump_major_zerover[1.1-2.0] ____________________ version = '1.1', bumped = '2.0' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_major_zerover[1a2.post3-2] __________________ version = '1a2.post3', bumped = '2' @pytest.mark.parametrize( ("version", "bumped"), [ ("0.0.1", "0.1.0"), ("0.1.0", "0.2.0"), ("0.1.1", "0.2.0"), ("1.0.0", "2.0.0"), ("1.0.1", "2.0.0"), ("1.1.0", "2.0.0"), ("1.1.1", "2.0.0"), ("1", "2"), ("1.1", "2.0"), ("1a2.post3", "2"), ], ) def test_pep440_bump_major_zerover(version: str, bumped: str) -> None: """Test major version bumping with zerover. Parameters: version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, "major", zerover=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:255: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump_trim[release-1.0-1] _____________________ part = 'release', version = '1.0', bumped = '1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("release", "1.0", "1"), ("release", "1.0a0", "1"), ("major", "1.0", "2"), ("major", "1.0a0", "2"), ("minor", "1.0", "1.1"), ("minor", "1.0.0a0", "1.1"), ("micro", "1.0.0.0", "1.0.1"), ("micro", "1.0.0.0a0", "1.0.1"), ], ) def test_pep440_bump_trim(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping and trimming. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, trim=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:742: in __call__ pep440_version = pep440_version.bump_release(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_bump_trim[release-1.0a0-1] ____________________ part = 'release', version = '1.0a0', bumped = '1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("release", "1.0", "1"), ("release", "1.0a0", "1"), ("major", "1.0", "2"), ("major", "1.0a0", "2"), ("minor", "1.0", "1.1"), ("minor", "1.0.0a0", "1.1"), ("micro", "1.0.0.0", "1.0.1"), ("micro", "1.0.0.0a0", "1.0.1"), ], ) def test_pep440_bump_trim(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping and trimming. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, trim=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:742: in __call__ pep440_version = pep440_version.bump_release(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________________ test_pep440_bump_trim[major-1.0-2] ______________________ part = 'major', version = '1.0', bumped = '2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("release", "1.0", "1"), ("release", "1.0a0", "1"), ("major", "1.0", "2"), ("major", "1.0a0", "2"), ("minor", "1.0", "1.1"), ("minor", "1.0.0a0", "1.1"), ("micro", "1.0.0.0", "1.0.1"), ("micro", "1.0.0.0a0", "1.0.1"), ], ) def test_pep440_bump_trim(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping and trimming. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, trim=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump_trim[major-1.0a0-2] _____________________ part = 'major', version = '1.0a0', bumped = '2' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("release", "1.0", "1"), ("release", "1.0a0", "1"), ("major", "1.0", "2"), ("major", "1.0a0", "2"), ("minor", "1.0", "1.1"), ("minor", "1.0.0a0", "1.1"), ("micro", "1.0.0.0", "1.0.1"), ("micro", "1.0.0.0a0", "1.0.1"), ], ) def test_pep440_bump_trim(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping and trimming. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, trim=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:748: in __call__ pep440_version = pep440_version.bump_major(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:287: in bump_major return self.bump_release(level=0, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _____________________ test_pep440_bump_trim[minor-1.0-1.1] _____________________ part = 'minor', version = '1.0', bumped = '1.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("release", "1.0", "1"), ("release", "1.0a0", "1"), ("major", "1.0", "2"), ("major", "1.0a0", "2"), ("minor", "1.0", "1.1"), ("minor", "1.0.0a0", "1.1"), ("micro", "1.0.0.0", "1.0.1"), ("micro", "1.0.0.0a0", "1.0.1"), ], ) def test_pep440_bump_trim(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping and trimming. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, trim=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ___________________ test_pep440_bump_trim[minor-1.0.0a0-1.1] ___________________ part = 'minor', version = '1.0.0a0', bumped = '1.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("release", "1.0", "1"), ("release", "1.0a0", "1"), ("major", "1.0", "2"), ("major", "1.0a0", "2"), ("minor", "1.0", "1.1"), ("minor", "1.0.0a0", "1.1"), ("micro", "1.0.0.0", "1.0.1"), ("micro", "1.0.0.0a0", "1.0.1"), ], ) def test_pep440_bump_trim(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping and trimming. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, trim=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:750: in __call__ pep440_version = pep440_version.bump_minor(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:310: in bump_minor return self.bump_release(level=1, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError __________________ test_pep440_bump_trim[micro-1.0.0.0-1.0.1] __________________ part = 'micro', version = '1.0.0.0', bumped = '1.0.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("release", "1.0", "1"), ("release", "1.0a0", "1"), ("major", "1.0", "2"), ("major", "1.0a0", "2"), ("minor", "1.0", "1.1"), ("minor", "1.0.0a0", "1.1"), ("micro", "1.0.0.0", "1.0.1"), ("micro", "1.0.0.0a0", "1.0.1"), ], ) def test_pep440_bump_trim(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping and trimming. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, trim=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________ test_pep440_bump_trim[micro-1.0.0.0a0-1.0.1] _________________ part = 'micro', version = '1.0.0.0a0', bumped = '1.0.1' @pytest.mark.parametrize( ("part", "version", "bumped"), [ ("release", "1.0", "1"), ("release", "1.0a0", "1"), ("major", "1.0", "2"), ("major", "1.0a0", "2"), ("minor", "1.0", "1.1"), ("minor", "1.0.0a0", "1.1"), ("micro", "1.0.0.0", "1.0.1"), ("micro", "1.0.0.0a0", "1.0.1"), ], ) def test_pep440_bump_trim(part: PEP440Strategy, version: str, bumped: str) -> None: """Test PEP 440 version bumping and trimming. Parameters: part: The version part to bump. version: The base version. bumped: The expected, bumped version. """ > assert bump_pep440(version, part, trim=True) == bumped ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:752: in __call__ pep440_version = pep440_version.bump_micro(trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:337: in bump_micro return self.bump_release(level=2, trim=trim) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:264: in bump_release return PEP440Version.from_parts(epoch=self.epoch, release=tuple(release)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________________ test_pep440_dent[pre-1-1a0] __________________________ part = 'pre', version = '1', dented = '1a0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:554: in dent_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, 0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________________ test_pep440_dent[pre-1.0-1.0a0] ________________________ part = 'pre', version = '1.0', dented = '1.0a0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:554: in dent_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, 0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________________ test_pep440_dent[alpha-1-1a0] _________________________ part = 'alpha', version = '1', dented = '1a0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:572: in dent_alpha return self.dent_pre("a") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:554: in dent_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, 0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________________ test_pep440_dent[alpha-1.0-1.0a0] _______________________ part = 'alpha', version = '1.0', dented = '1.0a0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:572: in dent_alpha return self.dent_pre("a") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:554: in dent_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, 0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _________________________ test_pep440_dent[beta-1-1b0] _________________________ part = 'beta', version = '1', dented = '1b0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:590: in dent_beta return self.dent_pre("b") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:554: in dent_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, 0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError _______________________ test_pep440_dent[beta-1.0-1.0b0] _______________________ part = 'beta', version = '1.0', dented = '1.0b0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:590: in dent_beta return self.dent_pre("b") ^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:554: in dent_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, 0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________________ test_pep440_dent[candidate-1-1rc0] ______________________ part = 'candidate', version = '1', dented = '1rc0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:608: in dent_candidate return self.dent_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:554: in dent_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, 0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ____________________ test_pep440_dent[candidate-1.0-1.0rc0] ____________________ part = 'candidate', version = '1.0', dented = '1.0rc0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:608: in dent_candidate return self.dent_pre("rc") ^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:554: in dent_pre return PEP440Version.from_parts(epoch=self.epoch, release=self.release, pre=(pre, 0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': None, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ________________________ test_pep440_dent[dev-1-1.dev0] ________________________ part = 'dev', version = '1', dented = '1.dev0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:632: in dent_dev return PEP440Version.from_parts( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': 0, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ______________________ test_pep440_dent[dev-1.0-1.0.dev0] ______________________ part = 'dev', version = '1.0', dented = '1.0.dev0' @pytest.mark.parametrize( ("part", "version", "dented"), [ ("pre", "1", "1a0"), ("pre", "1.0", "1.0a0"), ("alpha", "1", "1a0"), ("alpha", "1.0", "1.0a0"), ("beta", "1", "1b0"), ("beta", "1.0", "1.0b0"), ("candidate", "1", "1rc0"), ("candidate", "1.0", "1.0rc0"), ("dev", "1", "1.dev0"), ("dev", "1.0", "1.0.dev0"), ], ) def test_pep440_dent(part: PEP440Strategy, version: str, dented: str) -> None: """Test denting versions. Parameters: part: The version part to dent. version: The base version. dented: The expected, dented version. """ > assert str(getattr(PEP440Version(version), f"dent_{part}")()) == dented ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/test_versioning.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:632: in dent_dev return PEP440Version.from_parts( ../BUILDROOT/usr/lib/python3.14/site-packages/git_changelog/_internal/versioning.py:154: in from_parts return replace( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj = changes = {'dev': 0, 'epoch': 0, 'local': None, 'post': None, ...} cls = , func = None def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for immutable objects, like named tuples or frozen dataclasses. """ cls = obj.__class__ func = getattr(cls, '__replace__', None) if func is None: > raise TypeError(f"replace() does not support {cls.__name__} objects") E TypeError: replace() does not support PEP440Version objects /usr/lib64/python3.14/copy.py:285: TypeError ======================= 147 failed, 235 passed in 30.30s ======================= RPM build errors: error: Bad exit status from /var/tmp/rpm-tmp.18elqz (%check) Bad exit status from /var/tmp/rpm-tmp.18elqz (%check) Finish: rpmbuild python-git-changelog-2.9.3-1.fc44.src.rpm Finish: build phase for python-git-changelog-2.9.3-1.fc44.src.rpm INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-44-ppc64le-1774705104.621530/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names ERROR: Exception(/var/lib/copr-rpmbuild/results/python-git-changelog-2.9.3-1.fc44.src.rpm) Config(fedora-44-ppc64le) 1 minutes 4 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_failure=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot ERROR: Command failed: # /usr/bin/systemd-nspawn -q -M 5f2e5cfa6f6d4258aea7b39514be2e8b -D /var/lib/mock/fedora-44-ppc64le-1774705104.621530/root -a -u mockbuild --capability=cap_ipc_lock --capability=cap_ipc_lock --bind=/tmp/mock-resolv.6xvukr5z:/etc/resolv.conf --bind=/dev/btrfs-control --bind=/dev/mapper/control --bind=/dev/fuse --bind=/dev/loop-control --bind=/dev/loop0 --bind=/dev/loop1 --bind=/dev/loop2 --bind=/dev/loop3 --bind=/dev/loop4 --bind=/dev/loop5 --bind=/dev/loop6 --bind=/dev/loop7 --bind=/dev/loop8 --bind=/dev/loop9 --bind=/dev/loop10 --bind=/dev/loop11 --console=pipe --setenv=TERM=vt100 --setenv=SHELL=/bin/bash --setenv=HOME=/builddir --setenv=HOSTNAME=mock --setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin '--setenv=PROMPT_COMMAND=printf "\033]0;\007"' '--setenv=PS1= \s-\v\$ ' --setenv=LANG=C.UTF-8 --resolv-conf=off bash --login -c '/usr/bin/rpmbuild -ba --noprep --target ppc64le /builddir/build/originals/python-git-changelog.spec' Copr build error: Build failed