Skip to content

Releases: o-murphy/py-ballisticcalc

py-ballisticcalc v2.3.0b2

13 May 13:26
f36544f

Choose a tag to compare

Pre-release

📦 py-ballisticcalc v2.3.0b2

🚀 Highlights

Changed

  • BaseEngineConfigDict fields changed from T | None to Ttotal=False already provides optionality; explicit None values no longer accepted
  • with_no_minimum_velocity and with_max_drop_zero decorators typed with ParamSpec, Concatenate, and functools.wraps — decorated methods now preserve their full signatures for static type checkers
  • TrajectoryDataFilter.records class-level mutable default = [] removed; annotation-only declaration left, instance assigned in __init__
  • isinstance(x, (A, B)) replaced with isinstance(x, A | B) union syntax (PEP 604) across unit.py, vector.py, munition.py, trajectory_data.py, engines/scipy_engine.py
  • Implicit type aliases annotated with TypeAlias in interface.py, munition.py, interpolation.py, trajectory_data.py
  • typing.Self merged into existing from typing import (...) block in unit.py; duplicate from typing import blocks merged in trajectory_data.py and generics/engine.py
  • importlib.metadata compatibility shim removed from _EngineLoader._get_entries_by_groupentry_points().select() used directly (available since Python 3.9)
  • from __future__ import annotations removed from engines/base_engine.py, visualize/plot.py, and shot.py; shot.ShotProps.from_shot return type updated to Self
  • typing.Self moved from typing_extensions to stdlib typing in interface.py
  • tomllib imported directly from stdlib (Python 3.11+), version guard removed
  • Callable moved from typing to collections.abc in helpers.py

Removed

  • Python 3.10 support EOL - removed all references to Python 3.10, updated CI and dependencies

CI

  • py_ballisticcalc.exts wheels 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 wheels
  • cibuildwheel reduced to cp311-* cp314t-* — eliminates redundant per-interpreter builds for standard CPython; cp313t-* dropped (deprecated in cibuildwheel 3.4, removed in next minor), cp314t-* requires no enable flag
  • Cythonized engine test full matrix reduced from 6 to 3 Python versions (3.11, 3.14, 3.14t); 3.12, 3.13, 3.13t removed — abi3 binary is identical across standard versions, boundary versions provide sufficient coverage
  • CIBW_ENVIRONMENT_PASS: SETUPTOOLS_SCM_PRETEND_VERSION added to the publish workflow — previously the version override was not forwarded into cibuildwheel build containers, causing +gHASH local version suffixes that PyPI rejects
  • uv audit pre-commit hook added — checks for known vulnerabilities in locked dependencies before each commit
  • uv lock --upgrade — all dev/docs dependencies updated; resolves 18 Dependabot security alerts (Pillow, urllib3, tornado, CairoSVG, fonttools, requests, virtualenv, Pygments, pymdown-extensions)
  • pypi-publish.yml trigger changed from release: published to push: tags: v*; create-release job 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 from CHANGELOG.md; supports optional > intro and ### Upgrade Notes sections; auto-collects contributors via git log
  • .mailmap added — normalizes git author aliases to GitHub usernames for consistent contributor attribution

📜 Contributors

Special thanks to everyone who contributed to this release:

🔗 Full Changelog

👉 Compare v2.2.10...v2.3.0b2

v2.2.10

30 Apr 19:53

Choose a tag to compare

📦 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_fromPylist in py_bind.cpp now delegates to build_pchip_curve_from_arrays — the universal PCHIP builder extracted into base_types.hpp/base_types.cpp; eliminates code duplication between the Cython and FFI paths
  • BCLIBCFFI_CATCH macro replaced with ffi_call<F> template — same catch logic, no hidden return, full catch(...) coverage for non-std exceptions across the FFI boundary
  • try_get_exact signature changed from void (exception-as-control-flow) to bool; call sites in get_at converted from try/catch blocks to plain if checks — removes overhead on the hot interpolation path

Fixed

  • bclibc: undefined behavior in find_zero_angle — missing return after Ridder's loop
  • bclibc: ~BCLIBC_TrajectoryDataFilter destructor no longer throws (wrapped in try/catch)
  • bclibc: BCLIBC_BaseTrajData::operator[] bounds check used wrong constant and > instead of >=
  • bclibc: BCLIBC_TrajectoryData::interpolate bounds check used > instead of >=, allowing FLAG key
  • bclibc: try_get_exact refactored from exception-as-control-flow to returning bool
  • bclibc: memory leak in BCLIBCFFI_integrate when toC loop throws after malloc
  • bclibc: infinite loop guard added for calc_step <= 0 in Euler and RK4 integrators
  • bclibc: BCLIBC_ShotProps constructor no longer propagates domain_error from stability coefficient calculation
  • bclibc: BCLIBCFFI_CATCH macro replaced with type-safe ffi_call<F> template (adds catch(...) 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

👉 Compare v2.2.9...v2.2.10

v2.2.9

16 Mar 13:14
ee755dd

Choose a tag to compare

📦 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

🛠 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

👉 Compare v2.2.8...v2.2.9

v2.2.8

09 Jan 09:25
a98116f

Choose a tag to compare

📦 py-ballisticcalc v2.2.8

Type annotations update by @o-murphy in #303

🚀 Highlights

Added

  • Calculator now 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 fix
  • Calculator - type annotations fix
  • Type annotations modernized to Python 3.10+ style (PEP 604, PEP 585)
    • Optional[X]X | None
    • Union[X, Y]X | Y
    • List[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

👉 Compare v2.2.7...v2.2.8

v2.2.7

26 Dec 21:46
620c38e

Choose a tag to compare

📦 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_WindSock initialization in Cython/C++
  • BCLIBC_WindSock_from_pylist renamed to BCLIBC_WindSock_from_pytuple
  • C++ to Python Exception bridge improved, avoids multiple rethrows, uses dynamic_cast #296
  • C++ to Python Exception bridge many_exception_handler renamed to exception_dispatch
  • BCLIBC_BaseTrajData::get_key_val replaced with BCLIBC_BaseTrajData::operator[]
  • BCLIBC_BaseTrajSeq::get_key_val replaced with BCLIBC_BaseTrajSeq::operator[]
  • BCLIBC_TrajectoryData::get_key_val replaced with BCLIBC_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

👉 Compare v2.2.6...v2.2.7

v2.2.6.post1

13 Dec 23:33
ea7e460

Choose a tag to compare

📦 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

👉 Compare v2.2.6...v2.2.6.post1

v2.2.6

13 Dec 21:39

Choose a tag to compare

📦 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

👉 Compare v2.2.5...v2.2.6

v2.2.5

11 Dec 15:14

Choose a tag to compare

📦 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

👉 Compare v2.2.3...v2.2.5

v2.2.5rc3

10 Dec 21:20
d5bf9ca

Choose a tag to compare

v2.2.5rc3 Pre-release
Pre-release

What's Changed

Full Changelog: v2.2.5rc2...v2.2.5rc3

v2.2.5rc2

02 Dec 14:36
a856761

Choose a tag to compare

v2.2.5rc2 Pre-release
Pre-release

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_EssentialTerminators usage
    • feature: BCLIBC_Engine fields thread safety with std::recursive_mutex
    • feature: CythonizedBaseIntegrationEngine.integrate_raw_at - a method to integrate by key_attribute and target_value
    • docs: CythonizedBaseIntegrationEngine.integrate_raw_at docstrings added
    • docs: updated

Full Changelog: v2.2.5rc1...v2.2.5rc2