Skip to content
17 changes: 4 additions & 13 deletions .github/workflows/binding.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest] # , windows-latest --- IGNORE ---
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: ["3.10", "3.12"]

runs-on: ${{ matrix.os }}
Expand All @@ -32,27 +32,18 @@ jobs:
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt update
sudo apt install -y cmake build-essential libtbb-dev libspdlog-dev libsimdjson-dev doxygen
sudo apt install -y cmake build-essential doxygen

- name: Install system dependencies (macOS)
if: matrix.os == 'macos-latest'
run: |
brew install cmake tbb spdlog simdjson doxygen
echo "CPLUS_INCLUDE_PATH=$(brew --prefix tbb)/include:$(brew --prefix fmt)/include:$(brew --prefix spdlog)/include:$(brew --prefix simdjson)/include" >> $GITHUB_ENV
echo "LIBRARY_PATH=$(brew --prefix tbb)/lib:$(brew --prefix fmt)/lib:$(brew --prefix spdlog)/lib:$(brew --prefix simdjson)/lib" >> $GITHUB_ENV
echo "LD_LIBRARY_PATH=$(brew --prefix tbb)/lib:$(brew --prefix fmt)/lib:$(brew --prefix spdlog)/lib:$(brew --prefix simdjson)/lib" >> $GITHUB_ENV
brew install cmake doxygen

- name: Install system dependencies (Windows)
if: matrix.os == 'windows-latest'
run: |
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
choco install doxygen.install
# Install vcpkg for spdlog and tbb on Windows
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg install spdlog:x64-windows tbb:x64-windows
echo "VCPKG_ROOT=$env:GITHUB_WORKSPACE\vcpkg" >> $env:GITHUB_ENV

- name: Upgrade pip and install build dependencies
run: |
Expand Down Expand Up @@ -189,7 +180,7 @@ jobs:
- name: Install system dependencies
run: |
sudo apt update
sudo apt install -y cmake build-essential libtbb-dev libspdlog-dev libsimdjson-dev doxygen
sudo apt install -y cmake build-essential doxygen

- name: Install development dependencies
run: |
Expand Down
4 changes: 1 addition & 3 deletions .github/workflows/cmake_examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@ jobs:
run: |
if [ ${{ matrix.os }} == 'ubuntu-latest' ]; then
sudo apt update
sudo apt install libtbb-dev libsimdjson-dev binutils
elif [ ${{ matrix.os }} == 'macos-latest' ]; then
brew install tbb simdjson
sudo apt install binutils
fi

- uses: actions/checkout@v4
Expand Down
7 changes: 0 additions & 7 deletions .github/workflows/cmake_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,6 @@ jobs:
sudo apt update
sudo apt install -y lcov gcovr build-essential cmake libhwloc-dev

- name: Install dependencies on macOS
if: matrix.os == 'macos-latest'
run: |
brew update
brew install tbb simdjson

- name: Install dependencies on Windows (vcpkg)
if: matrix.os == 'windows-latest'
shell: powershell
Expand All @@ -56,7 +50,6 @@ jobs:
mkdir -p build
cd build
cmake .. \
-DCMAKE_PREFIX_PATH="$(brew --prefix tbb):$(brew --prefix simdjson)" \
-DCMAKE_INSTALL_PREFIX=${GITHUB_WORKSPACE}/install
cmake --build . -j$(sysctl -n hw.ncpu) --config Debug

Expand Down
17 changes: 1 addition & 16 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,6 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install TBB (MacOS & Ubuntu)
run: |
if [[ "$RUNNER_OS" == "macOS" ]]; then
brew install tbb spdlog simdjson
echo "CPLUS_INCLUDE_PATH=$(brew --prefix tbb)/include:$(brew --prefix fmt)/include:$(brew --prefix spdlog)/include:$(brew --prefix simdjson)/include" >> $GITHUB_ENV
echo "LIBRARY_PATH=$(brew --prefix tbb)/lib:$(brew --prefix fmt)/lib:$(brew --prefix spdlog)/lib:$(brew --prefix simdjson)/lib" >> $GITHUB_ENV
echo "LD_LIBRARY_PATH=$(brew --prefix tbb)/lib:$(brew --prefix fmt)/lib:$(brew --prefix spdlog)/lib:$(brew --prefix simdjson)/lib" >> $GITHUB_ENV
elif [[ "$RUNNER_OS" == "Linux" ]]; then
sudo apt update && sudo apt install -y libtbb-dev libspdlog-dev libsimdjson-dev
fi

- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
Expand All @@ -42,11 +31,7 @@ jobs:
- name: Build C++
run: |
mkdir -p build && cd build
if [[ "$RUNNER_OS" == "macOS" ]]; then
cmake .. -DCMAKE_PREFIX_PATH="$(brew --prefix tbb);$(brew --prefix fmt);$(brew --prefix spdlog)"
else
cmake ..
fi
cmake ..
cmake --build .
sudo make install

Expand Down
48 changes: 41 additions & 7 deletions .github/workflows/pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ jobs:
- name: Install system dependencies
run: |
sudo apt update
sudo apt install -y cmake build-essential doxygen libtbb-dev libfmt-dev libspdlog-dev libsimdjson-dev
sudo apt install -y cmake build-essential doxygen

- name: Install build dependencies
run: |
Expand Down Expand Up @@ -127,7 +127,7 @@ jobs:

- name: Install system dependencies
run: |
brew install cmake tbb spdlog simdjson doxygen
brew install cmake doxygen

- name: Install build dependencies
run: |
Expand All @@ -136,9 +136,6 @@ jobs:

- name: Set macOS environment variables
run: |
echo "CPLUS_INCLUDE_PATH=$(brew --prefix tbb)/include:$(brew --prefix fmt)/include:$(brew --prefix spdlog)/include:$(brew --prefix simdjson)/include" >> $GITHUB_ENV
echo "LIBRARY_PATH=$(brew --prefix tbb)/lib:$(brew --prefix fmt)/lib:$(brew --prefix spdlog)/lib:$(brew --prefix simdjson)/lib" >> $GITHUB_ENV
echo "CMAKE_PREFIX_PATH=$(brew --prefix tbb);$(brew --prefix fmt);$(brew --prefix spdlog);$(brew --prefix simdjson)" >> $GITHUB_ENV
echo "ARCHFLAGS=-arch $(uname -m)" >> $GITHUB_ENV
echo "_PYTHON_HOST_PLATFORM=macosx-$(sw_vers -productVersion | cut -d. -f1)-$(uname -m)" >> $GITHUB_ENV

Expand All @@ -156,6 +153,43 @@ jobs:
name: wheel-macos-${{ matrix.python-version }}
path: wheelhouse/*.whl

build-wheels-windows:
name: Build wheels on Windows (Python ${{ matrix.python-version }})
needs: [check-version]
runs-on: windows-latest
if: needs.check-version.outputs.should_build == 'true'
strategy:
matrix:
python-version: ['3.10', '3.12']

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}

- name: Install system dependencies
run: |
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
choco install doxygen.install

- name: Install build dependencies
run: |
python -m pip install --upgrade pip
python -m pip install build wheel setuptools pybind11-stubgen

- name: Build wheel
run: python -m build --wheel

Comment on lines +182 to +186
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Windows wheel build doesn't use a wheel repair tool like delocate (used for macOS on line 148 of this file) or auditwheel (typically used for Linux). This means TBB DLLs won't be automatically bundled into the wheel by a repair tool. While the setup.py does copy TBB DLLs to the package directory (setup.py lines 161-184), those files need to be included in package_data in setup.py to actually be packaged. Consider either:

  1. Using delvewheel (Windows equivalent of delocate/auditwheel) to bundle DLLs into the wheel
  2. Ensuring the setup.py package_data includes *.dll patterns (which it currently doesn't)
Suggested change
python -m pip install build wheel setuptools pybind11-stubgen
- name: Build wheel
run: python -m build --wheel
python -m pip install build wheel setuptools pybind11-stubgen delvewheel
- name: Build wheel
run: python -m build --wheel
- name: Repair wheel with delvewheel
run: |
for whl in dist/*.whl; do
python -m delvewheel repair "$whl" -w dist
done

Copilot uses AI. Check for mistakes.
- name: Upload wheels as artifacts
uses: actions/upload-artifact@v4
with:
name: wheel-windows-${{ matrix.python-version }}
path: dist/*.whl

build-sdist:
name: Build source distribution
needs: [check-version]
Expand All @@ -174,7 +208,7 @@ jobs:
- name: Install system dependencies
run: |
sudo apt update
sudo apt install -y cmake build-essential libtbb-dev libspdlog-dev libsimdjson-dev doxygen
sudo apt install -y cmake build-essential doxygen

- name: Install build dependencies
run: |
Expand All @@ -192,7 +226,7 @@ jobs:

publish:
name: Publish to PyPI
needs: [check-version, build-wheels-linux, build-wheels-macos, build-sdist]
needs: [check-version, build-wheels-linux, build-wheels-macos, build-wheels-windows, build-sdist]
runs-on: ubuntu-latest
if: needs.check-version.outputs.should_build == 'true'

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pytest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y cmake build-essential libtbb-dev libspdlog-dev libsimdjson-dev doxygen
sudo apt install -y cmake build-essential doxygen
python -m pip install --upgrade pip
pip install pytest pytest-cov

Expand Down
39 changes: 25 additions & 14 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -130,17 +130,18 @@ if(NOT simdjson_POPULATED)
FetchContent_MakeAvailable(simdjson)
endif()
# Get TBB
set(TBB_TEST
OFF
CACHE BOOL "Disable TBB tests" FORCE)
set(TBB_TEST OFF CACHE BOOL "Disable TBB tests" FORCE)
set(TBB_EXAMPLES OFF CACHE BOOL "Disable TBB examples" FORCE)
set(TBB_STRICT OFF CACHE BOOL "Disable TBB strict mode" FORCE)
Comment on lines +133 to +135
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The formatting style for these TBB CMake options is inconsistent with the rest of the file. Other similar configurations in the file (e.g., lines 101-103, 104-106, 107-109) use multi-line formatting with proper indentation. Consider reformatting for consistency:

set(TBB_TEST
    OFF
    CACHE BOOL "Disable TBB tests" FORCE)
set(TBB_EXAMPLES
    OFF
    CACHE BOOL "Disable TBB examples" FORCE)
set(TBB_STRICT
    OFF
    CACHE BOOL "Disable TBB strict mode" FORCE)
Suggested change
set(TBB_TEST OFF CACHE BOOL "Disable TBB tests" FORCE)
set(TBB_EXAMPLES OFF CACHE BOOL "Disable TBB examples" FORCE)
set(TBB_STRICT OFF CACHE BOOL "Disable TBB strict mode" FORCE)
set(TBB_TEST
OFF
CACHE BOOL "Disable TBB tests" FORCE)
set(TBB_EXAMPLES
OFF
CACHE BOOL "Disable TBB examples" FORCE)
set(TBB_STRICT
OFF
CACHE BOOL "Disable TBB strict mode" FORCE)

Copilot uses AI. Check for mistakes.
# set(TBB_BUILD_SHARED ON CACHE BOOL "Build TBB as shared library" FORCE)
# set(TBB_BUILD_TBBMALLOC OFF CACHE BOOL "Disable TBB malloc" FORCE)
Comment on lines +136 to +137
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] These commented-out CMake options for TBB configuration should either be removed if they're not needed, or uncommented and properly configured if they are. Leaving them commented suggests uncertainty about the TBB build configuration. If these options are needed for specific platforms or use cases, they should be documented; otherwise, they add clutter.

Suggested change
# set(TBB_BUILD_SHARED ON CACHE BOOL "Build TBB as shared library" FORCE)
# set(TBB_BUILD_TBBMALLOC OFF CACHE BOOL "Disable TBB malloc" FORCE)

Copilot uses AI. Check for mistakes.

FetchContent_Declare(
tbb
GIT_REPOSITORY https://github.com/uxlfoundation/oneTBB
GIT_TAG v2022.3.0)
FetchContent_GetProperties(tbb)
if(NOT tbb_POPULATED)
FetchContent_MakeAvailable(tbb)
endif()
GIT_REPOSITORY https://github.com/uxlfoundation/oneTBB.git
GIT_TAG v2022.3.0
)
FetchContent_MakeAvailable(tbb)

add_library(dsf STATIC ${SOURCES})
target_compile_definitions(dsf PRIVATE SPDLOG_USE_STD_FORMAT)
Expand Down Expand Up @@ -177,6 +178,12 @@ install(
if(BUILD_PYTHON_BINDINGS)
include(FetchContent)

# Check if Doxygen is available for documentation generation
find_package(Doxygen REQUIRED)
if(NOT DOXYGEN_FOUND)
message(FATAL_ERROR "Doxygen is required to build the docstrings.")
endif()
Comment on lines +183 to +185
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The find_package(Doxygen REQUIRED) call already sets DOXYGEN_FOUND to TRUE if found, or fails the configuration if not found (due to REQUIRED). This subsequent check is redundant and will never trigger the FATAL_ERROR message since CMake would have already failed at the find_package step if Doxygen wasn't found.

Suggested change
if(NOT DOXYGEN_FOUND)
message(FATAL_ERROR "Doxygen is required to build the docstrings.")
endif()

Copilot uses AI. Check for mistakes.

# Get pybind11
FetchContent_Declare(
pybind11
Expand All @@ -188,15 +195,14 @@ if(BUILD_PYTHON_BINDINGS)
endif()

# Add the Python binding module
add_library(dsf_python_module MODULE src/dsf/bindings.cpp)
pybind11_add_module(dsf_python_module src/dsf/bindings.cpp)

# Ensure the Python module name has no 'lib' prefix on Unix systems
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment "Ensure the Python module name has no 'lib' prefix on Unix systems" is now misleading. With pybind11_add_module (line 198), the PREFIX is automatically set to empty string on all platforms, so this comment should be updated to reflect that we're simply setting the output name, not specifically handling the 'lib' prefix issue.

Suggested change
# Ensure the Python module name has no 'lib' prefix on Unix systems
# Set the output name of the Python module

Copilot uses AI. Check for mistakes.
set_target_properties(dsf_python_module PROPERTIES PREFIX "" OUTPUT_NAME
"dsf_cpp")
set_target_properties(dsf_python_module PROPERTIES OUTPUT_NAME "dsf_cpp")

# Link the pybind11 module with your static library and pybind11
target_link_libraries(
dsf_python_module PRIVATE dsf pybind11::module pybind11::headers TBB::tbb
dsf_python_module PRIVATE dsf pybind11::headers TBB::tbb
spdlog::spdlog)
target_compile_definitions(dsf_python_module PRIVATE SPDLOG_USE_STD_FORMAT)

Expand All @@ -218,8 +224,13 @@ if(BUILD_PYTHON_BINDINGS)
set_target_properties(
dsf_python_module
PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE
INSTALL_RPATH "${HOMEBREW_LIB}"
INSTALL_RPATH "${HOMEBREW_LIB};@loader_path"
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The CMakeLists.txt includes @loader_path in the RPATH (line 227), which is correct for loading bundled libraries. However, it still includes ${HOMEBREW_LIB} in the RPATH. Since TBB is now being fetched via FetchContent and bundled with the extension (as evidenced by setup.py copying TBB libraries), the Homebrew library paths may no longer be necessary for TBB. If spdlog and other dependencies are also fetched via FetchContent, this entire Homebrew RPATH configuration might be obsolete. Consider reviewing whether Homebrew paths are still needed or if @loader_path alone is sufficient.

Suggested change
INSTALL_RPATH "${HOMEBREW_LIB};@loader_path"
INSTALL_RPATH "@loader_path"

Copilot uses AI. Check for mistakes.
INSTALL_RPATH_USE_LINK_PATH TRUE)
elseif(UNIX)
set_target_properties(
dsf_python_module
PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE
INSTALL_RPATH "$ORIGIN")
endif()
endif()

Expand Down
62 changes: 62 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@
"-DBUILD_PYTHON_BINDINGS=ON",
]

if platform.system() == "Windows":
cmake_args += [f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{cfg.upper()}={extdir}"]

# Add macOS-specific CMake prefix paths for Homebrew dependencies
if platform.system() == "Darwin": # macOS
try:
Expand Down Expand Up @@ -123,6 +126,65 @@
cwd=build_temp,
)

# Copy TBB shared library if it exists (Linux and macOS)
if platform.system() == "Linux" or platform.system() == "Darwin":
print(f"Searching for TBB shared libraries in {build_temp}...")

tbb_libs = []
if platform.system() == "Linux":
# Look for libtbb.so* recursively
tbb_libs = list(build_temp.glob("**/libtbb.so*"))
# Also look for libtbb_debug.so* if we are in debug mode or if that's what was built
tbb_libs.extend(list(build_temp.glob("**/libtbb_debug.so*")))
Comment on lines +135 to +138
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The glob pattern **/libtbb.so* will match versioned files like libtbb.so.12, but the destination uses lib.name which is just the filename (e.g., libtbb.so.12). On Linux, the extension might be linked against a symlink like libtbb.so, but this code copies the actual versioned files. If the versioned file is copied but the .so symlink is not, runtime linking might fail. Consider either:

  1. Also copying the non-versioned symlink if it exists
  2. Creating a symlink in the destination to match what the linker expects
  3. Filtering to only copy the actual library file that matches what the NEEDED entry in the ELF header expects

Copilot uses AI. Check for mistakes.
else: # macOS
# Look for libtbb.dylib* recursively
tbb_libs = list(build_temp.glob("**/libtbb*.dylib"))

if tbb_libs:
print(f"Found TBB libraries: {tbb_libs}")
for lib in tbb_libs:
# We only want the real shared object, not symlinks if possible,
# but copying everything matching the pattern is safer to ensure we get the versioned one.
# However, we need to be careful not to overwrite if multiple matches found.
# Usually we want the one that the linker linked against.
# Since we set RPATH to $ORIGIN (Linux) or @loader_path (macOS), we need the library in the same dir as the extension.

# Avoid copying if it's a symlink pointing to something we already copied?
# simpler: just copy all of them.
dest = extdir / lib.name
if not dest.exists():
shutil.copy2(lib, dest)
print(f"Copied {lib} to {dest}")
else:
print("Warning: No TBB shared libraries found to copy.")

elif platform.system() == "Windows":
print(f"Searching for TBB DLLs in {build_temp}...")
# Look for tbb*.dll recursively
tbb_dlls = list(build_temp.glob("**/tbb*.dll"))

if tbb_dlls:
print(f"Found TBB DLLs: {tbb_dlls}")
# We want to copy them to the 'dsf' package directory so we can load them in __init__.py

Check warning

Code scanning / Pylintpython3 (reported by Codacy)

Line too long (104/100) Warning

Line too long (104/100)

Check warning

Code scanning / Pylint (reported by Codacy)

Line too long (104/100) Warning

Line too long (104/100)
# extdir is where dsf_cpp.pyd is (site-packages root usually)
# We want site-packages/dsf/

# self.build_lib is usually the root of the build (e.g. build/lib.win...)
# So we can construct the path to dsf package
dsf_pkg_dir = Path(self.build_lib) / "dsf"
dsf_pkg_dir.mkdir(parents=True, exist_ok=True)

Check warning

Code scanning / Pylint (reported by Codacy)

Instance of 'PurePath' has no 'mkdir' member Warning

Instance of 'PurePath' has no 'mkdir' member

# Also copy to source directory for editable installs
source_dsf_dir = Path(__file__).parent / "src" / "dsf"

for dll in tbb_dlls:
print(f"Copying {dll} to {dsf_pkg_dir}")
shutil.copy2(dll, dsf_pkg_dir)
print(f"Copying {dll} to {source_dsf_dir}")
shutil.copy2(dll, source_dsf_dir)
else:
print("Warning: No TBB DLLs found. This might cause import errors.")

def pre_build(self):
"""Extracts doxygen documentation from XML files and creates a C++ unordered_map"""

Expand Down
16 changes: 16 additions & 0 deletions src/dsf/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
import sys

Check warning

Code scanning / Pylint (reported by Codacy)

Missing module docstring Warning

Missing module docstring

Check warning

Code scanning / Pylintpython3 (reported by Codacy)

Missing module docstring Warning

Missing module docstring
import os

# On Windows, we need to explicitly load the bundled TBB DLLs
if sys.platform == "win32":
import glob
import ctypes

# Look for tbb dlls in the same directory as this __init__.py
_dll_dir = os.path.dirname(__file__)

Check warning

Code scanning / Pylint (reported by Codacy)

Constant name "_dll_dir" doesn't conform to UPPER_CASE naming style Warning

Constant name "_dll_dir" doesn't conform to UPPER_CASE naming style
for _dll in glob.glob(os.path.join(_dll_dir, "tbb*.dll")):
try:
ctypes.CDLL(_dll)
except Exception as e:

Check warning

Code scanning / Pylintpython3 (reported by Codacy)

Variable name "e" doesn't conform to snake_case naming style Warning

Variable name "e" doesn't conform to snake_case naming style

Check warning

Code scanning / Pylint (reported by Codacy)

Variable name "e" doesn't conform to snake_case naming style Warning

Variable name "e" doesn't conform to snake_case naming style

Check notice

Code scanning / Pylint (reported by Codacy)

Catching too general exception Exception Note

Catching too general exception Exception

Check notice

Code scanning / Pylintpython3 (reported by Codacy)

Catching too general exception Exception Note

Catching too general exception Exception
print(f"Warning: Failed to load {_dll}: {e}")
Comment on lines +12 to +15
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using a bare except Exception with only a print statement silently swallows errors during DLL loading. This could make debugging difficult if there are issues with TBB DLLs. Consider either being more specific about which exceptions to catch (e.g., OSError, WindowsError) or logging the error in a way that's more visible, rather than just printing. Alternatively, if the DLL loading failure is critical, consider re-raising the exception after logging.

Copilot uses AI. Check for mistakes.

from dsf_cpp import __version__, LogLevel, get_log_level, set_log_level, mobility, mdt

from .python.cartography import (
Expand Down
2 changes: 1 addition & 1 deletion src/dsf/dsf.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

static constexpr uint8_t DSF_VERSION_MAJOR = 4;
static constexpr uint8_t DSF_VERSION_MINOR = 5;
static constexpr uint8_t DSF_VERSION_PATCH = 0;
static constexpr uint8_t DSF_VERSION_PATCH = 1;

static auto const DSF_VERSION =
std::format("{}.{}.{}", DSF_VERSION_MAJOR, DSF_VERSION_MINOR, DSF_VERSION_PATCH);
Expand Down
Loading