Releases: o-murphy/py-ballisticcalc
py-ballisticcalc v2.3.0b2
📦 py-ballisticcalc v2.3.0b2
🚀 Highlights
Changed
BaseEngineConfigDictfields changed fromT | NonetoT—total=Falsealready provides optionality; explicitNonevalues no longer acceptedwith_no_minimum_velocityandwith_max_drop_zerodecorators typed withParamSpec,Concatenate, andfunctools.wraps— decorated methods now preserve their full signatures for static type checkersTrajectoryDataFilter.recordsclass-level mutable default= []removed; annotation-only declaration left, instance assigned in__init__isinstance(x, (A, B))replaced withisinstance(x, A | B)union syntax (PEP 604) acrossunit.py,vector.py,munition.py,trajectory_data.py,engines/scipy_engine.py- Implicit type aliases annotated with
TypeAliasininterface.py,munition.py,interpolation.py,trajectory_data.py typing.Selfmerged into existingfrom typing import (...)block inunit.py; duplicatefrom typing importblocks merged intrajectory_data.pyandgenerics/engine.pyimportlib.metadatacompatibility shim removed from_EngineLoader._get_entries_by_group—entry_points().select()used directly (available since Python 3.9)from __future__ import annotationsremoved fromengines/base_engine.py,visualize/plot.py, andshot.py;shot.ShotProps.from_shotreturn type updated toSelftyping.Selfmoved fromtyping_extensionsto stdlibtypingininterface.pytomllibimported directly from stdlib (Python 3.11+), version guard removedCallablemoved fromtypingtocollections.abcinhelpers.py
Removed
- Python 3.10 support EOL - removed all references to Python 3.10, updated CI and dependencies
CI
py_ballisticcalc.extswheels now target the Python stable ABI (cp311-abi3-*): one binary per platform/architecture is compatible with CPython 3.11 and all later standard releases; free-threaded Python 3.13t / 3.14t is built as separate version-specific wheelscibuildwheelreduced tocp311-* cp314t-*— eliminates redundant per-interpreter builds for standard CPython;cp313t-*dropped (deprecated in cibuildwheel 3.4, removed in next minor),cp314t-*requires noenableflag- Cythonized engine test full matrix reduced from 6 to 3 Python versions (
3.11, 3.14, 3.14t);3.12,3.13,3.13tremoved — abi3 binary is identical across standard versions, boundary versions provide sufficient coverage CIBW_ENVIRONMENT_PASS: SETUPTOOLS_SCM_PRETEND_VERSIONadded to the publish workflow — previously the version override was not forwarded intocibuildwheelbuild containers, causing+gHASHlocal version suffixes that PyPI rejectsuv auditpre-commit hook added — checks for known vulnerabilities in locked dependencies before each commituv lock --upgrade— all dev/docs dependencies updated; resolves 18 Dependabot security alerts (Pillow, urllib3, tornado, CairoSVG, fonttools, requests, virtualenv, Pygments, pymdown-extensions)pypi-publish.ymltrigger changed fromrelease: publishedtopush: tags: v*;create-releasejob added — generates and creates a draft GitHub Release automatically on tag push.github/actions/gen_release_notes/— new composite action with a Python script that builds formatted release notes fromCHANGELOG.md; supports optional> introand### Upgrade Notessections; auto-collects contributors viagit log.mailmapadded — normalizes git author aliases to GitHub usernames for consistent contributor attribution
📜 Contributors
Special thanks to everyone who contributed to this release:
🔗 Full Changelog
v2.2.10
📦 py-ballisticcalc v2.2.10
Provides new model of binary dependencies updates
🚀 Highlights
Changed
- bclibc C++ engine is now a git submodule (previously vendored sources)
- bump bclibc to v1.0.4
BCLIBC_Curve_fromPylistinpy_bind.cppnow delegates tobuild_pchip_curve_from_arrays— the universal PCHIP builder extracted intobase_types.hpp/base_types.cpp; eliminates code duplication between the Cython and FFI pathsBCLIBCFFI_CATCHmacro replaced withffi_call<F>template — same catch logic, no hiddenreturn, fullcatch(...)coverage for non-std exceptions across the FFI boundarytry_get_exactsignature changed fromvoid(exception-as-control-flow) tobool; call sites inget_atconverted fromtry/catchblocks to plainifchecks — removes overhead on the hot interpolation path
Fixed
- bclibc: undefined behavior in
find_zero_angle— missingreturnafter Ridder's loop - bclibc:
~BCLIBC_TrajectoryDataFilterdestructor no longer throws (wrapped intry/catch) - bclibc:
BCLIBC_BaseTrajData::operator[]bounds check used wrong constant and>instead of>= - bclibc:
BCLIBC_TrajectoryData::interpolatebounds check used>instead of>=, allowingFLAGkey - bclibc:
try_get_exactrefactored from exception-as-control-flow to returningbool - bclibc: memory leak in
BCLIBCFFI_integratewhentoCloop throws aftermalloc - bclibc: infinite loop guard added for
calc_step <= 0in Euler and RK4 integrators - bclibc:
BCLIBC_ShotPropsconstructor no longer propagatesdomain_errorfrom stability coefficient calculation - bclibc:
BCLIBCFFI_CATCHmacro replaced with type-safeffi_call<F>template (addscatch(...)for non-std exceptions)
🛠 Upgrade Notes (API Compatibility)
This release is fully backward compatible with v2.2.3.
No public Python APIs were removed or renamed.
Recommended actions:
- Rebuild any local wheels (if you vendor or distribute them).
- If you use multithreading with the engine, you may now rely on improved thread-safety.
- If you subclass integration engines or wrap low-level handlers, review the updated behavior of termination logic—early termination is now more predictable.
- No code changes are needed for typical use cases (
Calculator, engine calls, trajectory evaluation, zeroing, etc.).
📜 Contributors
Special thanks to everyone who contributed to this release:
🔗 Full Changelog
v2.2.9
📦 py-ballisticcalc v2.2.9
Updates CI and package dependencies and adds small fixes to units conversion and types annotation
🚀 Highlights
Changed
- Updated CI dependencies versions
- Updated a list of package dependencies in pyproject.toml
Fixed
- Fixed
Unit.Jouleconversion factor inEnergyclass returning incorrect foot-pounds to Joules values. - Types annotations codestyle fix
- Security fix for vulnerability described at (https://github.com/o-murphy/py-ballisticcalc/security/dependabot/1)
🛠 Upgrade Notes (API Compatibility)
This release is fully backward compatible with v2.2.3.
No public Python APIs were removed or renamed.
Recommended actions:
- Rebuild any local wheels (if you vendor or distribute them).
- If you use multithreading with the engine, you may now rely on improved thread-safety.
- If you subclass integration engines or wrap low-level handlers, review the updated behavior of termination logic—early termination is now more predictable.
- No code changes are needed for typical use cases (
Calculator, engine calls, trajectory evaluation, zeroing, etc.).
📜 Contributors
Special thanks to everyone who contributed to this release:
🔗 Full Changelog
v2.2.8
📦 py-ballisticcalc v2.2.8
Type annotations update by @o-murphy in #303
🚀 Highlights
Added
Calculatornow can be used as a context manager
Changed
Calculator- improved initialisation and type annotations- engines
__init__signature adjusted for consistency
Fixed
- Type annotations fix in
unit.py EngineProtocol- type annotations fixCalculator- type annotations fix- Type annotations modernized to Python 3.10+ style (PEP 604, PEP 585)
Optional[X]→X | NoneUnion[X, Y]→X | YList[X]→list[X],Dict[K, V]→dict[K, V],Tuple[X, Y]→tuple[X, Y]- Removed unused typing imports
- Updated .pyi stub files for Cython extensions
- Added type guards in
uconv.py
🛠 Upgrade Notes (API Compatibility)
This release is fully backward compatible with v2.2.3.
No public Python APIs were removed or renamed.
Recommended actions:
- Rebuild any local wheels (if you vendor or distribute them).
- If you use multithreading with the engine, you may now rely on improved thread-safety.
- If you subclass integration engines or wrap low-level handlers, review the updated behavior of termination logic—early termination is now more predictable.
- No code changes are needed for typical use cases (
Calculator, engine calls, trajectory evaluation, zeroing, etc.).
📜 Contributors
Special thanks to everyone who contributed to this release:
🔗 Full Changelog
v2.2.7
📦 py-ballisticcalc v2.2.7
Fixes some issues in C++ engine, updates C++ to Cython exceptions bridge, updates docstrings
🚀 Highlights
What's Changed
Refactored C++ engine by @o-murphy in #300
- C++ headers includes refactoring
- Redundant Null Pointer Check Removal in
BCLIBC_Coriolis - Better
BCLIBC_WindSockinitialization in Cython/C++ BCLIBC_WindSock_from_pylistrenamed toBCLIBC_WindSock_from_pytuple- C++ to Python Exception bridge improved, avoids multiple rethrows, uses
dynamic_cast#296 - C++ to Python Exception bridge
many_exception_handlerrenamed toexception_dispatch BCLIBC_BaseTrajData::get_key_valreplaced withBCLIBC_BaseTrajData::operator[]BCLIBC_BaseTrajSeq::get_key_valreplaced withBCLIBC_BaseTrajSeq::operator[]BCLIBC_TrajectoryData::get_key_valreplaced withBCLIBC_TrajectoryData::operator[]
Fixed
remove useless atmosphere preinit in C++ rk4 by @o-murphy in #295
fix[doc]: docstring for usage of ShotProps.spin_drift by @bjmcculloch in #299
🛠 Upgrade Notes (API Compatibility)
This release is fully backward compatible with v2.2.3.
No public Python APIs were removed or renamed.
Recommended actions:
- Rebuild any local wheels (if you vendor or distribute them).
- If you use multithreading with the engine, you may now rely on improved thread-safety.
- If you subclass integration engines or wrap low-level handlers, review the updated behavior of termination logic—early termination is now more predictable.
- No code changes are needed for typical use cases (
Calculator, engine calls, trajectory evaluation, zeroing, etc.).
📜 Contributors
Special thanks to everyone who contributed to this release:
🔗 Full Changelog
v2.2.6.post1
📦 py-ballisticcalc v2.2.6.post1
Improves performance of C++ implemented Runge-Kutta 4th order integrator
🚀 Highlights
Fixed
Removed unnecessary atmosphere preinit in C++ RK4
Removed 'edited' release trigger from pypi-release.yml
🛠 Upgrade Notes (API Compatibility)
This release is fully backward compatible with v2.2.3.
No public Python APIs were removed or renamed.
Recommended actions:
- Rebuild any local wheels (if you vendor or distribute them).
- If you use multithreading with the engine, you may now rely on improved thread-safety.
- If you subclass integration engines or wrap low-level handlers, review the updated behavior of termination logic—early termination is now more predictable.
- No code changes are needed for typical use cases (
Calculator, engine calls, trajectory evaluation, zeroing, etc.).
📜 Contributors
Special thanks to everyone who contributed to this release:
🔗 Full Changelog
v2.2.6
📦 py-ballisticcalc v2.2.6
Improves performance of C++ implemented Runge-Kutta 4th order integrator
🚀 Highlights
C++ Runge-Kutta 4th order integrator was optimised
Uses precompute values, precompute Coriolis just once per integration step
C++ V3dT (vector) was optimized
C++ TrajectoryDataFilter fixes
Fixing TrajectoryDataFilter initialisation
🛠 Upgrade Notes (API Compatibility)
This release is fully backward compatible with v2.2.3.
No public Python APIs were removed or renamed.
Recommended actions:
- Rebuild any local wheels (if you vendor or distribute them).
- If you use multithreading with the engine, you may now rely on improved thread-safety.
- If you subclass integration engines or wrap low-level handlers, review the updated behavior of termination logic—early termination is now more predictable.
- No code changes are needed for typical use cases (
Calculator, engine calls, trajectory evaluation, zeroing, etc.).
📜 Contributors
Special thanks to everyone who contributed to this release:
🔗 Full Changelog
v2.2.5
📦 py-ballisticcalc v2.2.5
This release finalizes the internal modernization work of the 2.2.x line.
The core engine has been completely migrated to C++, memory usage has been significantly reduced, integrator control and thread-safety were improved, and documentation/CI have been refined.
The Python API remains stable and fully compatible with 2.2.3.
🚀 Highlights
Core rewrite and modernization
The majority of internal logic is now implemented in modern C++, with Cython providing a minimal, clean interface layer. This improves long-term maintainability and reduces duplication across the codebase.
Performance & memory efficiency
Memory usage was reduced across solvers, trajectory processing, and filters. Redundant copying was eliminated, and internal data flows were streamlined.
Integrator control & early termination
Integrator lifecycle and termination logic were unified. External and internal handlers can now terminate integration more safely and predictably.
Improved thread-safety
Key engine components were made safe for concurrent use, reducing race conditions and improving stability in multi-threaded environments.
Better Python integration
Bindings now feature clearer type annotations, improved error reporting, and helpers that simplify integration workflows.
CI, packaging, and documentation improvements
Reusable workflows, improved wheel builds, fixed documentation pipeline issues, and clarified contribution guidelines.
🔧 Changes
- Refactor: migration to a C++-centric engine with simplified Cython wrappers
- Refactor: improved memory usage and reduced unnecessary copying
- Feature: enhanced integrator termination control mechanisms
- Feature: additional helpers for integration workflows from Python
- Refactor: cleaned-up callback handling and improved safety
- Fix: various bug fixes across the engine and Cython interface
- Docs: updated documentation, README, Doxygen, and contributing guidelines
- CI: reusable build workflows and improved version extraction
- Polish: improved type annotations, clearer error messages, and better public interfaces
🛠 Upgrade Notes (API Compatibility)
This release is fully backward compatible with v2.2.3.
No public Python APIs were removed or renamed.
Recommended actions:
- Rebuild any local wheels (if you vendor or distribute them).
- If you use multithreading with the engine, you may now rely on improved thread-safety.
- If you subclass integration engines or wrap low-level handlers, review the updated behavior of termination logic—early termination is now more predictable.
- No code changes are needed for typical use cases (
Calculator, engine calls, trajectory evaluation, zeroing, etc.).
📜 Contributors
Special thanks to everyone who contributed to this release:
🔗 Full Changelog
v2.2.5rc3
v2.2.5rc2
What's Changed
- C++ Memory usage optimization by @o-murphy in #285
- refactor: integrator termination control & thread safety by @o-murphy in #286
- refactor: control integrator termination from external handlers
- feature: C++-level
GenericTerminator - refactor: controll termination from outer
BCLIBC_EssentialTerminators - refactor: much more safe
BCLIBC_EssentialTerminatorsusage - feature:
BCLIBC_Enginefields thread safety withstd::recursive_mutex - feature:
CythonizedBaseIntegrationEngine.integrate_raw_at- a method to integrate bykey_attributeandtarget_value - docs:
CythonizedBaseIntegrationEngine.integrate_raw_atdocstrings added - docs: updated
Full Changelog: v2.2.5rc1...v2.2.5rc2