From e6652f96f195002b747ce858cb77108a4ee29219 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 11:46:04 -0400 Subject: [PATCH 001/113] fix: Rename hipopybind module file. --- src/{main.cpp => hipopybind_module.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{main.cpp => hipopybind_module.cpp} (100%) diff --git a/src/main.cpp b/src/hipopybind_module.cpp similarity index 100% rename from src/main.cpp rename to src/hipopybind_module.cpp From 0d1f593a65d3d47ec9bdbd0c9ed828df91d02017 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 11:46:19 -0400 Subject: [PATCH 002/113] feat: Add python requirements for build. --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c1d4a6b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pybind11 +ninja From 9bf0a5b8ed688e4a02d580c6c10b6d38a7a0a691 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 11:47:03 -0400 Subject: [PATCH 003/113] fix: Update .gitignore. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7563f8b..63e687d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ *CMakeFiles *cmake_install.cmake *Makefile -*build +build # Pip files *.egg-info/ From 0409f4d41d80c42f6ed5cb3f7332abc1ce04e834 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 11:47:29 -0400 Subject: [PATCH 004/113] fix: Switch to meson build. --- meson.build | 58 +++++++++++++++++++++++++++++++++++++++++++++++ meson_options.txt | 1 + 2 files changed, 59 insertions(+) create mode 100644 meson.build create mode 100644 meson_options.txt diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..7c39e66 --- /dev/null +++ b/meson.build @@ -0,0 +1,58 @@ +project( + 'hipopybind', + 'cpp', + version: '2.0.0', + license: 'MIT', + meson_version: '>= 1.2.0', + default_options: [ + 'cpp_std=c++17', + 'buildtype=release', + ], +) + +# meson modules +pkg = import('pkgconfig') + +#---------- Find python ----------# +py = import('python').find_installation(pure: false) + +# ---- Find Python and pybind11 ---- +python = import('python').find_installation() +pybind11_dep = dependency('pybind11', required: true) + +# ---- Try to find libhipo via pkg-config ---- +libhipo_dep = dependency('libhipo', method: 'pkg-config', required: false) + +if not libhipo_dep.found() + message('libhipo not found via pkg-config. Attempting to build from source...') + + libhipo_src_dir = meson.project_source_root() / 'hipo' + libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' + libhipo_install_dir = libhipo_build_dir / 'install' + + # Run meson setup + run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, + '--prefix=' + libhipo_install_dir, + check: true) + + # Compile and install + run_command('meson', 'compile', '-C', libhipo_build_dir, check: true) + run_command('meson', 'install', '-C', libhipo_build_dir, check: true) + + # Assume libhipo_install_dir is a Meson File object or string path + hipo_include_dir = 'hipo/hipo4' + hipo_lib_dir = libhipo_install_dir / 'lib' + hipo_lib_name = 'hipo' + libhipo_dep = declare_dependency( + include_directories: include_directories(hipo_include_dir), + link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] + ) +endif + +# ---- Build the Python extension ---- +pybind_module = python.extension_module('hipopybind', + 'src/hipopybind_module.cpp', + dependencies: [pybind11_dep, libhipo_dep], + install: true, + install_dir: python.get_install_dir() +) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..b1e29b5 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1 @@ +option('build_type', type: 'combo', choices: ['debug', 'release'], value: 'release') From 805b061dd1d4cb5e66128caae43b99df05820ab2 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 11:49:23 -0400 Subject: [PATCH 005/113] fix: Remove pybind11 submodule. --- .gitmodules | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index a363dd4..fb208c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "pybind11"] - path = pybind11 - url = https://github.com/pybind/pybind11.git [submodule "hipo"] path = hipo url = https://github.com/gavalian/hipo.git From a37f2ae70f4650cb4428eb7c8e36258dc0178c25 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 11:53:46 -0400 Subject: [PATCH 006/113] fix: Update python build and dependencies. --- pyproject.toml | 37 +++++++++++++++---------------------- requirements.txt | 2 -- 2 files changed, 15 insertions(+), 24 deletions(-) delete mode 100644 requirements.txt diff --git a/pyproject.toml b/pyproject.toml index ae13dad..93dd180 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,25 +1,18 @@ [build-system] -requires = [ - "setuptools>61.0", - "wheel", - "ninja", - "cmake>=3.15", -] -build-backend = "setuptools.build_meta" - -[tool.isort] -profile = "black" +requires = ["meson-python", "pybind11","ninja"] +build-backend = "mesonpy" -[tool.pytest.ini_options] -minversion = "6.0" -addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] -xfail_strict = true -filterwarnings = ["error"] -testpaths = ["tests"] +[project] +name = "hipopybind" +version = "2.0.0" +description = "Python bindings for hipo using pybind11" +authors = [ + { name = "Matthew F. McEneaney", email = "matthew.mceneaney@duke.edu" } +] +readme = "README.md" +license = { text = "MIT" } +classifiers = ["Programming Language :: Python :: 3"] +requires-python = ">=3.7" -[tool.cibuildwheel] -test-command = "pytest {project}/tests" -test-extras = ["test"] -test-skip = ["*universal2:arm64"] -# Setuptools bug causes collision between pypy and cpython artifacts -before-build = "rm -rf {project}/build" +[project.optional-dependencies] +dev = ["pytest"] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index c1d4a6b..0000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -pybind11 -ninja From d4100f5f96710753683a7a0b4e9bcb6aec1e5e79 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 15:15:45 -0400 Subject: [PATCH 007/113] fix: Fix build. --- meson.build | 2 +- src/hipopybind_module.cpp | 235 ++++++++++++++++++++++++++++++++------ 2 files changed, 204 insertions(+), 33 deletions(-) diff --git a/meson.build b/meson.build index 7c39e66..f46339f 100644 --- a/meson.build +++ b/meson.build @@ -42,7 +42,7 @@ if not libhipo_dep.found() # Assume libhipo_install_dir is a Meson File object or string path hipo_include_dir = 'hipo/hipo4' hipo_lib_dir = libhipo_install_dir / 'lib' - hipo_lib_name = 'hipo' + hipo_lib_name = 'hipo4' libhipo_dep = declare_dependency( include_directories: include_directories(hipo_include_dir), link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] diff --git a/src/hipopybind_module.cpp b/src/hipopybind_module.cpp index 0263112..a6ea943 100644 --- a/src/hipopybind_module.cpp +++ b/src/hipopybind_module.cpp @@ -31,6 +31,140 @@ // define classes to bind within this file and bind hipo // classes or classes from another cpp project. +//--------------------------------------------------// +// Get array functions - Matthew McEneaney + +std::vector _getInts(hipo::bank bank, const char *name) noexcept { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + std::vector arr(0); + if(bankSchema.getEntryType(item)==3) { + for (int index=0; index _getShorts(hipo::bank bank, const char *name) noexcept { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + std::vector arr(0); + if(bankSchema.getEntryType(item)==2) { + for (int index=0; index _getBytes(hipo::bank bank, const char *name) noexcept { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + std::vector arr(0); + if(bankSchema.getEntryType(item)==1) { + for (int index=0; index _getFloats(hipo::bank bank, const char *name) noexcept { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + std::vector arr(0); + if(bankSchema.getEntryType(item)==4) { + for (int index=0; index _getDoubles(hipo::bank bank, const char *name) noexcept { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + std::vector arr(0); + if(bankSchema.getEntryType(item)==5) { + for (int index=0; index _getLongs(hipo::bank bank, const char *name) noexcept { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + std::vector arr(0); + if(bankSchema.getEntryType(item)==8) { + for (int index=0; index arr) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + bank.putIntAt(offset,arr[index]); + } +} +void _putShorts(hipo::bank &bank, const char *name, std::vector arr) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + bank.putShortAt(offset,arr[index]); + } +} +void _putBytes(hipo::bank &bank, const char *name, std::vector arr) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + bank.putByteAt(offset,arr[index]); + } +} +void _putFloats(hipo::bank &bank, const char *name, std::vector arr) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + bank.putFloatAt(offset,arr[index]); + } +} +void _putDoubles(hipo::bank &bank, const char *name, std::vector arr) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + bank.putDoubleAt(offset,arr[index]); + } +} +void _putLongs(hipo::bank &bank, const char *name, std::vector arr) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + bank.putLongAt(offset,arr[index]); + } +} + +//--------------------------------------------------// + //--------------------------------------------------// // Custom classes @@ -137,7 +271,7 @@ class HipoFileIterator { * Open the next file in this.filenames if the end of this.filenames has not yet been reached. * @return bool */ - bool open() { //TODO: Check inline is beneficial here. + bool open() { index++; if (index>=filenames.size()) return false; const char * filename = filenames.at(index).c_str(); @@ -221,13 +355,13 @@ class HipoFileIterator { const char * name = entrynames.at(j).c_str(); int entryindex = item_index_map.at(bankname+separator+name); switch(type) { - case 1: vec_byte.at(entryindex).push_back(bank.getBytes(name)); break; //NOTE COULD INSERT INTO PREEXISTING VECTOR? AND THEN INITIALIZE VECTOR WITH CORRECT DIMENSIONS ON FIRST TWO AXES... - case 2: vec_short.at(entryindex).push_back(bank.getShorts(name)); break; //TODO: ALSO NEED TO DEAL WITH CASE WHERE SOME EVENTS DON'T HAVE ALL THE BANKS. - case 3: vec_int.at(entryindex).push_back(bank.getInts(name)); break; //TODO: Make sure this will modify in place. - case 4: vec_float.at(entryindex).push_back(bank.getFloats(name)); break; //TODO: Figure out how to add empty events for banks that don't occur in a given event... -> GetDoubles etc should return empty array if bank is empty in event and schema is still there so this should be fine, in principle. - case 5: vec_double.at(entryindex).push_back(bank.getDoubles(name)); break; - case 8: vec_long.at(entryindex).push_back(bank.getLongs(name)); break; - default: throw pybind11::type_error("HipoFileIterator: Invalid type int for entry: "+entrynames.at(j)+"\n"); + case 1: vec_byte.at(entryindex).push_back(_getBytes(bank,name)); break; //NOTE COULD INSERT INTO PREEXISTING VECTOR? AND THEN INITIALIZE VECTOR WITH CORRECT DIMENSIONS ON FIRST TWO AXES... + case 2: vec_short.at(entryindex).push_back(_getShorts(bank,name)); break; //TODO: ALSO NEED TO DEAL WITH CASE WHERE SOME EVENTS DON'T HAVE ALL THE BANKS. + case 3: vec_int.at(entryindex).push_back(_getInts(bank,name)); break; //TODO: Make sure this will modify in place. + case 4: vec_float.at(entryindex).push_back(_getFloats(bank,name)); break; //TODO: Figure out how to add empty events for banks that don't occur in a given event... -> GetDoubles etc should return empty array if bank is empty in event and schema is still there so this should be fine, in principle. + case 5: vec_double.at(entryindex).push_back(_getDoubles(bank,name)); break; + case 8: vec_long.at(entryindex).push_back(_getLongs(bank,name)); break; + default: throw pybind11::type_error("HipoFileIterator: Invalid type " + std::to_string(type) + " for entry: "+entrynames.at(j)+"\n"); } } // for (int j = 0; j> */ - std::vector> getDoubles(std::string bankname, std::string item) const noexcept { //TODO: Check speed with these methods as inline. + std::vector> getDoubles(std::string bankname, std::string item) const noexcept { int i = item_index_map.at(bankname+separator+item); return vec_double.at(i); } @@ -592,7 +726,8 @@ PYBIND11_MODULE(hipopybind, m) { schema.def("exists", &hipo::schema::exists); schema.def("getOffset", py::detail::overload_cast_impl()(&hipo::schema::getOffset, py::const_), "getOffset"); //NOTE: Need this syntax for const functions! schema.def("getOffset", py::detail::overload_cast_impl()(&hipo::schema::getOffset, py::const_), "getOffset"); //NOTE: Need this syntax for const functions! - schema.def("getEntryType", &hipo::schema::getEntryType); + schema.def("getEntryType", py::detail::overload_cast_impl()(&hipo::schema::getEntryType, py::const_), "getEntryType"); //NOTE: Need this syntax for const functions! + schema.def("getEntryType", py::detail::overload_cast_impl()(&hipo::schema::getEntryType, py::const_), "getEntryType"); //NOTE: Need this syntax for const functions! schema.def("getEntryName", &hipo::schema::getEntryName); schema.def("getSchemaString", &hipo::schema::getSchemaString); schema.def("getSchemaStringJson", &hipo::schema::getSchemaStringJson); @@ -718,14 +853,14 @@ PYBIND11_MODULE(hipopybind, m) { bank.def("getLong", py::detail::overload_cast_impl()(&hipo::bank::getLong, py::const_), "getLong"); bank.def("getLong", py::detail::overload_cast_impl()(&hipo::bank::getLong, py::const_), "getLong"); - bank.def("getInts", py::detail::overload_cast_impl()(&hipo::bank::getInts, py::const_), "getInts"); - bank.def("getShorts", py::detail::overload_cast_impl()(&hipo::bank::getShorts, py::const_), "getShorts"); - bank.def("getBytes", py::detail::overload_cast_impl()(&hipo::bank::getBytes, py::const_), "getBytes"); - bank.def("getFloats", py::detail::overload_cast_impl()(&hipo::bank::getFloats, py::const_), "getFloats"); - bank.def("getDoubles", py::detail::overload_cast_impl()(&hipo::bank::getDoubles, py::const_), "getDoubles"); - bank.def("getLongs", py::detail::overload_cast_impl()(&hipo::bank::getLongs, py::const_), "getLongs"); + // bank.def("getInts", py::detail::overload_cast_impl()(&hipo::bank::getInts, py::const_), "getInts"); + // bank.def("getShorts", py::detail::overload_cast_impl()(&hipo::bank::getShorts, py::const_), "getShorts"); + // bank.def("getBytes", py::detail::overload_cast_impl()(&hipo::bank::getBytes, py::const_), "getBytes"); + // bank.def("getFloats", py::detail::overload_cast_impl()(&hipo::bank::getFloats, py::const_), "getFloats"); + // bank.def("getDoubles", py::detail::overload_cast_impl()(&hipo::bank::getDoubles, py::const_), "getDoubles"); + // bank.def("getLongs", py::detail::overload_cast_impl()(&hipo::bank::getLongs, py::const_), "getLongs"); - bank.def("getDoubles", py::detail::overload_cast_impl()(&hipo::bank::getDoubles, py::const_), "getDoubles"); + // bank.def("getDoubles", py::detail::overload_cast_impl()(&hipo::bank::getDoubles, py::const_), "getDoubles"); bank.def("putInt", py::detail::overload_cast_impl()(&hipo::bank::putInt), "putInt"); bank.def("putInt", py::detail::overload_cast_impl()(&hipo::bank::putInt), "putInt"); @@ -740,14 +875,21 @@ PYBIND11_MODULE(hipopybind, m) { bank.def("putLong", py::detail::overload_cast_impl()(&hipo::bank::putLong), "putLong"); bank.def("putLong", py::detail::overload_cast_impl()(&hipo::bank::putLong), "putLong"); - bank.def("putInts", py::detail::overload_cast_impl>()(&hipo::bank::putInts), "putInts"); - bank.def("putShorts", py::detail::overload_cast_impl>()(&hipo::bank::putShorts), "putShorts"); - bank.def("putBytes", py::detail::overload_cast_impl>()(&hipo::bank::putBytes), "putBytes"); - bank.def("putFloats", py::detail::overload_cast_impl>()(&hipo::bank::putFloats), "putFloats"); - bank.def("putDoubles", py::detail::overload_cast_impl>()(&hipo::bank::putDoubles), "putDoubles"); - bank.def("putLongs", py::detail::overload_cast_impl>()(&hipo::bank::putLongs), "putLongs"); - - bank.def("show", &hipo::bank::show); + // bank.def("putInts", py::detail::overload_cast_impl>()(&hipo::bank::putInts), "putInts"); + // bank.def("putShorts", py::detail::overload_cast_impl>()(&hipo::bank::putShorts), "putShorts"); + // bank.def("putBytes", py::detail::overload_cast_impl>()(&hipo::bank::putBytes), "putBytes"); + // bank.def("putFloats", py::detail::overload_cast_impl>()(&hipo::bank::putFloats), "putFloats"); + // bank.def("putDoubles", py::detail::overload_cast_impl>()(&hipo::bank::putDoubles), "putDoubles"); + // bank.def("putLongs", py::detail::overload_cast_impl>()(&hipo::bank::putLongs), "putLongs"); + + bank.def("getRowList", &hipo::bank::getRowList); + bank.def("getFullRowList", &hipo::bank::getFullRowList); + bank.def("getMutableRowList", &hipo::bank::getMutableRowList); + bank.def("getRowListLinked", &hipo::bank::getRowListLinked); + + bank.def("show", py::detail::overload_cast_impl<>()(&hipo::bank::show, py::const_), "show"); //NOTE: Need this syntax for const functions! + bank.def("show", py::detail::overload_cast_impl()(&hipo::bank::show, py::const_), "show"); //NOTE: Need this syntax for const functions! + bank.def("printValue", &hipo::bank::printValue); bank.def("reset", &hipo::bank::reset); bank.def("notify", &hipo::bank::notify); @@ -796,17 +938,34 @@ PYBIND11_MODULE(hipopybind, m) { event.def("init", static_cast&)>(&hipo::event::init), "init"); event.def("init", static_cast(&hipo::event::init), "init"); event.def("getStructure", static_cast(&hipo::event::getStructure), "getStructure"); - event.def("getStructure", static_cast(&hipo::event::getStructure), "getStructure"); - // event.def_static("getStructure", static_cast(&hipo::event::getStructure), "getStructure"); //TODO: //NOTE: Not sure why this doesn't work right now... + event.def("getStructure4", &hipo::event::getStructure4); + event.def("getTag", &hipo::event::getTag); - event.def("read", &hipo::event::read); + event.def("setTag", &hipo::event::setTag); + event.def("getStructure", static_cast(&hipo::event::getStructure), "getStructure"); + event.def("read", static_cast(&hipo::event::read), "read"); event.def("addStructure", &hipo::event::addStructure); + event.def("override", &hipo::event::override); + event.def("remove", static_cast(&hipo::event::remove), "remove"); + event.def("remove", static_cast(&hipo::event::remove), "remove"); + event.def("replace", &hipo::event::replace); + + event.def("add", &hipo::event::add); + event.def("get", static_cast(&hipo::event::get), "get"); + event.def("getStructurePosition", static_cast (hipo::event::*)(int, int)>(&hipo::event::getStructurePosition), "getStructurePosition"); - // event.def_static("getStructurePosition", static_cast (hipo::event::*)(const char*, int, int)>(&hipo::event::getStructurePosition), "getStructurePosition"); //TODO: //NOTE: Not sure why this doesn't work right now... same as above is a static method maybe that is why... + event.def("getStructurePosition4", static_cast (hipo::event::*)(int, int)>(&hipo::event::getStructurePosition4), "getStructurePosition4"); + event.def("getEventBuffer", &hipo::event::getEventBuffer); event.def("getSize", &hipo::event::getSize); event.def("reset", &hipo::event::reset); - event.def("getStructureNoCopy", &hipo::event::getStructureNoCopy); + event.def("write", &hipo::event::write); + event.def("read", static_cast(&hipo::event::read), "read"); + + event.def_static("getStructurePosition", static_cast (*)(const char*, int, int)>(&hipo::event::getStructurePosition), "getStructurePosition"); + event.def_static("getStructure", static_cast(&hipo::event::getStructure), "getStructure"); + event.def_static("get", static_cast(&hipo::event::get), "get"); + event.def_static("getStructureNoCopy", &hipo::event::getStructureNoCopy); // event.def_property_readonly("databuffer", nullptr); //NOTE: Not really necessary. @@ -887,26 +1046,38 @@ PYBIND11_MODULE(hipopybind, m) { reader.def(py::init([](const hipo::reader &r) { return new hipo::reader(r); })); reader.def("about", &hipo::reader::about); + reader.def("rewind", &hipo::reader::rewind); reader.def("readDictionary", &hipo::reader::readDictionary); reader.def("getStructure", &hipo::reader::getStructure); reader.def("getStructureNoCopy", &hipo::reader::getStructureNoCopy); + + reader.def("readUserConfig", &hipo::reader::readUserConfig); + reader.def("open", &hipo::reader::open); + reader.def("is_open", &hipo::reader::is_open); reader.def("setTags", static_cast(&hipo::reader::setTags), "setTags"); reader.def("setTags", static_cast)>(&hipo::reader::setTags), "setTags"); reader.def("setVerbose", &hipo::reader::setVerbose); reader.def("hasNext", &hipo::reader::hasNext); reader.def("next", static_cast(&hipo::reader::next), "next"); - reader.def("next", static_cast(&hipo::reader::next), "next"); reader.def("gotoEvent", &hipo::reader::gotoEvent); reader.def("gotoRecord", &hipo::reader::gotoRecord); + reader.def("next", static_cast(&hipo::reader::next), "next"); + + reader.def("next", static_cast&)>(&hipo::reader::next), "next"); + reader.def("getBanks", &hipo::reader::getBanks); + reader.def("read", &hipo::reader::read); reader.def("printWarning", &hipo::reader::printWarning); reader.def("getNRecords", &hipo::reader::getNRecords); reader.def("nextInRecord", &hipo::reader::nextInRecord); - reader.def("loadRecord", &hipo::reader::loadRecord); + reader.def("loadRecord", static_cast(&hipo::reader::loadRecord), "loadRecord"); + reader.def("loadRecord", static_cast(&hipo::reader::loadRecord), "loadRecord"); reader.def("getEntries", &hipo::reader::getEntries); + reader.def("getInt", &hipo::reader::getInt); + reader.def("getFloat", &hipo::reader::getFloat); reader.def("__repr__", [](hipo::reader &r){ From 07b8718cb07b05b8ed669eab934d8fee58080d43 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 15:51:11 -0400 Subject: [PATCH 008/113] fix: Fix import linking errors. --- meson.build | 2 +- src/hipopybind_module.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index f46339f..c975098 100644 --- a/meson.build +++ b/meson.build @@ -28,7 +28,7 @@ if not libhipo_dep.found() libhipo_src_dir = meson.project_source_root() / 'hipo' libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' - libhipo_install_dir = libhipo_build_dir / 'install' + libhipo_install_dir = python.get_install_dir() / 'hipopybind' / 'libhipo' # Run meson setup run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, diff --git a/src/hipopybind_module.cpp b/src/hipopybind_module.cpp index a6ea943..e02caba 100644 --- a/src/hipopybind_module.cpp +++ b/src/hipopybind_module.cpp @@ -962,9 +962,9 @@ PYBIND11_MODULE(hipopybind, m) { event.def("write", &hipo::event::write); event.def("read", static_cast(&hipo::event::read), "read"); - event.def_static("getStructurePosition", static_cast (*)(const char*, int, int)>(&hipo::event::getStructurePosition), "getStructurePosition"); - event.def_static("getStructure", static_cast(&hipo::event::getStructure), "getStructure"); - event.def_static("get", static_cast(&hipo::event::get), "get"); + event.def_static("getStructurePosition_static", static_cast (*)(const char*, int, int)>(&hipo::event::getStructurePosition), "getStructurePosition"); + event.def_static("getStructure_static", static_cast(&hipo::event::getStructure), "getStructure"); + event.def_static("get_static", static_cast(&hipo::event::get), "get"); event.def_static("getStructureNoCopy", &hipo::event::getStructureNoCopy); // event.def_property_readonly("databuffer", nullptr); //NOTE: Not really necessary. From 0bb35c98cb073bf0163a4aa3826219306eea3b01 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 15:58:49 -0400 Subject: [PATCH 009/113] fix: Updated pyproject.toml --- pyproject.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 93dd180..c2b3084 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,10 @@ [build-system] -requires = ["meson-python", "pybind11","ninja"] +requires = [ + "meson", + "meson-python", + "pybind11", + "ninja" +] build-backend = "mesonpy" [project] From de3bbfd475bec17f4d6aee57fefe791a8101669c Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 16:09:56 -0400 Subject: [PATCH 010/113] fix: Configure as package. --- hipopybind/__init__.py | 0 pybind11 | 1 - 2 files changed, 1 deletion(-) create mode 100644 hipopybind/__init__.py delete mode 160000 pybind11 diff --git a/hipopybind/__init__.py b/hipopybind/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pybind11 b/pybind11 deleted file mode 160000 index 55b1357..0000000 --- a/pybind11 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 55b1357d8ed93faf65ef3925ee38dddf79d3842f From ca3cd9b3645c1d8078a46e345c453f4bd73ceb42 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 16:10:07 -0400 Subject: [PATCH 011/113] fix: Configure as package. --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index c2b3084..07528c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,3 +21,6 @@ requires-python = ">=3.7" [project.optional-dependencies] dev = ["pytest"] + +[[tool.poetry.packages]] +include = "hipopybind" From 462154acad6dd42ab23fe6d1ce851d738c89d050 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 16:13:42 -0400 Subject: [PATCH 012/113] fix: Fix python module install directory. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index c975098..d3b06fe 100644 --- a/meson.build +++ b/meson.build @@ -54,5 +54,5 @@ pybind_module = python.extension_module('hipopybind', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], install: true, - install_dir: python.get_install_dir() + install_dir: python.get_install_dir() / 'hipopybind' ) From 8106c19f3ed3f324a11393cd731b3805bc2fee74 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 16:14:02 -0400 Subject: [PATCH 013/113] fix: Update manifest. --- MANIFEST.in | 3 --- 1 file changed, 3 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index f444aae..389fe3f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,3 @@ include README.md LICENSE pybind11/LICENSE -graft pybind11/include -graft pybind11/tools graft hipo graft src -global-include CMakeLists.txt *.cmake From 1fa54f5607f44b995995bf7ae319a88c1ce0357e Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 17:29:37 -0400 Subject: [PATCH 014/113] fix: Update python init file. --- hipopybind/__init__.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hipopybind/__init__.py b/hipopybind/__init__.py index e69de29..3e4068f 100644 --- a/hipopybind/__init__.py +++ b/hipopybind/__init__.py @@ -0,0 +1,7 @@ +""" +Hipopybind - Python bindings for hipo using pybind11 +""" + +__version__ = '2.0.0' + +from .hipopybind import * From 0e5a25ff18256f33a335f02d37fcfb54e0360ba7 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 17:33:49 -0400 Subject: [PATCH 015/113] fix: Pass version info to cpp. --- meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/meson.build b/meson.build index d3b06fe..7977483 100644 --- a/meson.build +++ b/meson.build @@ -53,6 +53,7 @@ endif pybind_module = python.extension_module('hipopybind', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], + cpp_args: ['-DVERSION_INFO="@0@"'.format(meson.project_version())], install: true, install_dir: python.get_install_dir() / 'hipopybind' ) From 7e4983eff3fb82573e4c6351dfab258deea80755 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 18:13:18 -0400 Subject: [PATCH 016/113] fix: Fix import issues. --- hipopybind/__init__.py | 7 ------- meson.build | 18 +++++++++++++++--- pyproject.toml | 4 ++-- src/hipopybind_module.cpp | 2 +- 4 files changed, 18 insertions(+), 13 deletions(-) delete mode 100644 hipopybind/__init__.py diff --git a/hipopybind/__init__.py b/hipopybind/__init__.py deleted file mode 100644 index 3e4068f..0000000 --- a/hipopybind/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -Hipopybind - Python bindings for hipo using pybind11 -""" - -__version__ = '2.0.0' - -from .hipopybind import * diff --git a/meson.build b/meson.build index 7977483..0118dc8 100644 --- a/meson.build +++ b/meson.build @@ -23,6 +23,9 @@ pybind11_dep = dependency('pybind11', required: true) # ---- Try to find libhipo via pkg-config ---- libhipo_dep = dependency('libhipo', method: 'pkg-config', required: false) +# ---- Set python install directory ---- +hb_pkg_dir = python.get_install_dir() / 'hipopybind' + if not libhipo_dep.found() message('libhipo not found via pkg-config. Attempting to build from source...') @@ -41,8 +44,16 @@ if not libhipo_dep.found() # Assume libhipo_install_dir is a Meson File object or string path hipo_include_dir = 'hipo/hipo4' - hipo_lib_dir = libhipo_install_dir / 'lib' + hipo_lib_dir = hb_pkg_dir / 'lib' hipo_lib_name = 'hipo4' + install_subdir( + hipo_include_dir, + install_dir: hb_pkg_dir + ) + install_subdir( + libhipo_install_dir / 'lib', + install_dir: hb_pkg_dir + ) libhipo_dep = declare_dependency( include_directories: include_directories(hipo_include_dir), link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] @@ -50,10 +61,11 @@ if not libhipo_dep.found() endif # ---- Build the Python extension ---- -pybind_module = python.extension_module('hipopybind', +install_data('hipopybind/__init__.py', install_dir: hb_pkg_dir) +pybind_module = python.extension_module('_core', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], cpp_args: ['-DVERSION_INFO="@0@"'.format(meson.project_version())], install: true, - install_dir: python.get_install_dir() / 'hipopybind' + install_dir: hb_pkg_dir ) diff --git a/pyproject.toml b/pyproject.toml index 07528c6..e086519 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,5 +22,5 @@ requires-python = ">=3.7" [project.optional-dependencies] dev = ["pytest"] -[[tool.poetry.packages]] -include = "hipopybind" +[tool.poetry] +name = "hipopybind" diff --git a/src/hipopybind_module.cpp b/src/hipopybind_module.cpp index e02caba..1a165b3 100644 --- a/src/hipopybind_module.cpp +++ b/src/hipopybind_module.cpp @@ -540,7 +540,7 @@ template class PyWriter : public WriterBase { // Python Module Bindings namespace py = pybind11; -PYBIND11_MODULE(hipopybind, m) { +PYBIND11_MODULE(_core, m) { //ADDED BEGIN //----------------------------------------------------------------------// From aa56bfa5c21783574b9fa89fefc56867d57da126 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 18:23:41 -0400 Subject: [PATCH 017/113] fix: Add get/put functions to module. --- src/hipopybind_module.cpp | 14 ++++++++++++++ tutorials/write.py | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/hipopybind_module.cpp b/src/hipopybind_module.cpp index 1a165b3..6c2b654 100644 --- a/src/hipopybind_module.cpp +++ b/src/hipopybind_module.cpp @@ -542,6 +542,20 @@ template class PyWriter : public WriterBase { namespace py = pybind11; PYBIND11_MODULE(_core, m) { + // Add functions to module + m.def("getInts", &_getInts); + m.def("getShorts", &_getShorts); + m.def("getBytes", &_getBytes); + m.def("getFloats", &_getFloats); + m.def("getDoubles", &_getDoubles); + m.def("getLongs", &_getLongs); + m.def("putInts", &_putInts); + m.def("putShorts", &_putShorts); + m.def("putBytes", &_putBytes); + m.def("putFloats", &_putFloats); + m.def("putDoubles", &_putDoubles); + m.def("putLongs", &_putLongs); + //ADDED BEGIN //----------------------------------------------------------------------// // Bind HipoFileIterator diff --git a/tutorials/write.py b/tutorials/write.py index ba7a232..9952f41 100644 --- a/tutorials/write.py +++ b/tutorials/write.py @@ -60,7 +60,7 @@ b.setRows(nrows) for name in names: values = np.random.random(size=(nrows,)) - b.putDoubles(name,values) + hb.putDoubles(b,name,values) # Show bank data print("Iteration",i) From c18ed7c9c21c22431dc99ed917506240d3d28dfb Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 18:30:48 -0400 Subject: [PATCH 018/113] fix: Update README. --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6c0431a..04f785c 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,16 @@ # HipopyBind : HIPO PyBind11 Library +This project exposes in python the [hipo](https://github.com/gavalian/hipo) classes and a few +custom classes and functions from C++ via [pybind11](https://github.com/pybind/pybind11). + ## Prerequisites * Python >=3.7.3 -* A compiler with C++11 support -* Pip 10+ or CMake >= 3.15 (or 3.14+ on Windows, which was the first version to support VS 2019) +* A compiler with C++17 support * Ninja or Pip 10+ +* meson -## Installation +## :green_circle: Installation To install from PyPi run: @@ -20,8 +23,7 @@ To compile the library from source run the following: ```bash git clone --recurse-submodules https://github.com/mfmceneaney/hipopybind.git cd hipopybind -cmake . -make +meson setup build ``` And add the following to your startup script: @@ -30,11 +32,12 @@ And add the following to your startup script: export PYTHONPATH=$PYTHONPATH\:/path/to/hipopybind ``` -# Developer Note -For updating submodules run the following: +# :rocket: Getting Started +Run the tutorials via: ```bash -git submodule update --init --recursive +python3 tutorials/write.py +python3 tutorials/read.py ``` # From d07b3565bd3a85dc3f95a68b2c83adb9f3ec3c69 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 18:31:08 -0400 Subject: [PATCH 019/113] fix: Update version. --- tests/test_basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_basic.py b/tests/test_basic.py index b5f1a69..f642a26 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,4 +1,4 @@ import hipopybind as m def test_main(): - assert m.__version__ == "1.1.3" + assert m.__version__ == "2.0.0" From 6206c6da41741b32694f3cdb1b7a39ea7165f1d2 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 18:31:34 -0400 Subject: [PATCH 020/113] fix: Add init file. --- hipopybind/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 hipopybind/__init__.py diff --git a/hipopybind/__init__.py b/hipopybind/__init__.py new file mode 100644 index 0000000..6eb8646 --- /dev/null +++ b/hipopybind/__init__.py @@ -0,0 +1 @@ +from ._core import * From 9a3e40b26a430c55eeb2d981c86a3046c1abbfb0 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 22 Oct 2025 18:33:25 -0400 Subject: [PATCH 021/113] fix: Remove extraneous files. --- CMakeLists.txt | 41 -------------- MANIFEST.in | 3 - setup.py | 148 ------------------------------------------------- 3 files changed, 192 deletions(-) delete mode 100644 CMakeLists.txt delete mode 100644 MANIFEST.in delete mode 100644 setup.py diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index ca70ee9..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -cmake_minimum_required(VERSION 3.15...4.0) - -#-----------------------------------------# -project(hipopybind) - -#-----------------------------------------# -# Add LZ4 dependency -add_compile_definitions(__LZ4__) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/hipo/lz4/lib) - -#-----------------------------------------# -# Add HIPO dependency -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/hipo) - -#-----------------------------------------# -# Add pybind11 dependency and module -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/pybind11) - -#-----------------------------------------# -file (GLOB SOURCE_FILES "hipo/hipo4/*.cpp") -file (GLOB HEADER_FILES "hipo/hipo4/*.h") -file (GLOB PYTHON_FILES "src/*.cpp" "src/*.h") -file (GLOB LZ4SRC_FILES "hipo/lz4/lib/*.c") -file (GLOB LZ4HDR_FILES "hipo/lz4/lib/*.h") - -pybind11_add_module(hipopybind - ${SOURCE_FILES} - ${HEADER_FILES} - ${PYTHON_FILES} - ${LZ4SRC_FILES} - ${LZ4HDR_FILES} -) - -# EXAMPLE_VERSION_INFO is defined by setup.py and passed into the C++ code as a -# define (VERSION_INFO) here. -target_compile_definitions(hipopybind - PRIVATE VERSION_INFO=${EXAMPLE_VERSION_INFO}) - -#-----------------------------------------# -# Link header files from subdirectories -target_include_directories(hipopybind PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 389fe3f..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -include README.md LICENSE pybind11/LICENSE -graft hipo -graft src diff --git a/setup.py b/setup.py deleted file mode 100644 index 945edd6..0000000 --- a/setup.py +++ /dev/null @@ -1,148 +0,0 @@ -import os -import re -import subprocess -import sys -from pathlib import Path - -from setuptools import Extension, setup -from setuptools.command.build_ext import build_ext - -#NOTE: Build file based off the one in https://github.com/pybind/cmake_example.git - -# Convert distutils Windows platform specifiers to CMake -A arguments -PLAT_TO_CMAKE = { - "win32": "Win32", - "win-amd64": "x64", - "win-arm32": "ARM", - "win-arm64": "ARM64", -} - - -# A CMakeExtension needs a sourcedir instead of a file list. -# The name must be the _single_ output extension from the CMake build. -# If you need multiple extensions, see scikit-build. -class CMakeExtension(Extension): - def __init__(self, name: str, sourcedir: str = "") -> None: - super().__init__(name, sources=[]) - self.sourcedir = os.fspath(Path(sourcedir).resolve()) - - -class CMakeBuild(build_ext): - def build_extension(self, ext: CMakeExtension) -> None: - # Must be in this form due to bug in .resolve() only fixed in Python 3.10+ - ext_fullpath = Path.cwd() / self.get_ext_fullpath(ext.name) - extdir = ext_fullpath.parent.resolve() - - # Using this requires trailing slash for auto-detection & inclusion of - # auxiliary "native" libs - - debug = int(os.environ.get("DEBUG", 0)) if self.debug is None else self.debug - cfg = "Debug" if debug else "Release" - - # CMake lets you override the generator - we need to check this. - # Can be set with Conda-Build, for example. - cmake_generator = os.environ.get("CMAKE_GENERATOR", "") - - # Set Python_EXECUTABLE instead if you use PYBIND11_FINDPYTHON - # EXAMPLE_VERSION_INFO shows you how to pass a value into the C++ code - # from Python. - cmake_args = [ - f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={extdir}{os.sep}", - f"-DPYTHON_EXECUTABLE={sys.executable}", - f"-DCMAKE_BUILD_TYPE={cfg}", # not used on MSVC, but no harm - ] - build_args = [] - # Adding CMake arguments set as environment variable - # (needed e.g. to build for ARM OSx on conda-forge) - if "CMAKE_ARGS" in os.environ: - cmake_args += [item for item in os.environ["CMAKE_ARGS"].split(" ") if item] - - # In this example, we pass in the version to C++. You might not need to. - cmake_args += [f"-DEXAMPLE_VERSION_INFO={self.distribution.get_version()}"] - - if self.compiler.compiler_type != "msvc": - # Using Ninja-build since it a) is available as a wheel and b) - # multithreads automatically. MSVC would require all variables be - # exported for Ninja to pick it up, which is a little tricky to do. - # Users can override the generator with CMAKE_GENERATOR in CMake - # 3.15+. - if (not cmake_generator or cmake_generator == "Ninja") and not sys.platform.startswith('linux'): #NOTE: #DEBUGGING: ADDED FOR BUILD TO WORK ON IFARM - try: - import ninja - - ninja_executable_path = Path(ninja.BIN_DIR) / "ninja" - cmake_args += [ - "-GNinja", - f"-DCMAKE_MAKE_PROGRAM:FILEPATH={ninja_executable_path}", - ] - except ImportError: - pass - - else: - # Single config generators are handled "normally" - single_config = any(x in cmake_generator for x in {"NMake", "Ninja"}) - - # CMake allows an arch-in-generator style for backward compatibility - contains_arch = any(x in cmake_generator for x in {"ARM", "Win64"}) - - # Specify the arch if using MSVC generator, but only if it doesn't - # contain a backward-compatibility arch spec already in the - # generator name. - if not single_config and not contains_arch: - cmake_args += ["-A", PLAT_TO_CMAKE[self.plat_name]] - - # Multi-config generators have a different way to specify configs - if not single_config: - cmake_args += [ - f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{cfg.upper()}={extdir}" - ] - build_args += ["--config", cfg] - - if sys.platform.startswith("darwin"): - # Cross-compile support for macOS - respect ARCHFLAGS if set - archs = re.findall(r"-arch (\S+)", os.environ.get("ARCHFLAGS", "")) - if archs: - cmake_args += ["-DCMAKE_OSX_ARCHITECTURES={}".format(";".join(archs))] - - # Set CMAKE_BUILD_PARALLEL_LEVEL to control the parallel build level - # across all generators. - if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ: - # self.parallel is a Python 3 only way to set parallel jobs by hand - # using -j in the build_ext call, not supported by pip or PyPA-build. - if hasattr(self, "parallel") and self.parallel: - # CMake 3.12+ only. - build_args += [f"-j{self.parallel}"] - - build_temp = Path(self.build_temp) / ext.name - if not build_temp.exists(): - build_temp.mkdir(parents=True) - - subprocess.run( - ["cmake", ext.sourcedir, *cmake_args], cwd=build_temp, check=True - ) - subprocess.run( - ["cmake", "--build", ".", *build_args], cwd=build_temp, check=True - ) - -#NOTE: Define function for reading README file into long description -def read(fname): - return open(os.path.join(os.path.dirname(__file__), fname)).read() - -# The information here can also be placed in setup.cfg - better separation of -# logic and declaration, and simpler if you include description/version in a file. -setup( - name="hipopybind", - version="1.1.3", - author="Matthew McEneaney", - author_email="matthew.mceneaney@duke.edu", - license="MIT", - url="https://github.com/mfmceneaney/hipopybind.git", - description="A HIPO python library using PyBind11 and CMake", - long_description=read('README.md'), - long_description_content_type='text/markdown', - ext_modules=[CMakeExtension("hipopybind")], - cmdclass={"build_ext": CMakeBuild}, - zip_safe=False, - extras_require={"test": ["pytest>=6.0"]}, - python_requires=">=3.7", -) From 5b7d1f5dad2d66633d3137e2212bfab0ea74e15f Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 00:04:39 -0400 Subject: [PATCH 022/113] fix: Update dependencies. --- poetry.lock | 702 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 11 +- 2 files changed, 709 insertions(+), 4 deletions(-) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..3b346d3 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,702 @@ +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. + +[[package]] +name = "certifi" +version = "2025.10.5" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, + {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, +] + +[[package]] +name = "clang-format" +version = "17.0.6" +description = "Clang-Format is an LLVM-based code formatting tool" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "clang-format-17.0.6.tar.gz", hash = "sha256:50f082840d2e013160355ed63add4502884344371dda5af12ec0abe68cbc5a36"}, + {file = "clang_format-17.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:2c7364a50c4fdb8ce9acc4e0c21627e52f4eebee98ff2d8a19b6d4302d0be23b"}, + {file = "clang_format-17.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:195014a589fde9e2bec447ee1f2efd31f8c9f773b10aa66b510beae6997e6bc5"}, + {file = "clang_format-17.0.6-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cda40badfb01818ece739509d9cde678fc02660180cc1a55156782ef203704d"}, + {file = "clang_format-17.0.6-py2.py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:879e831c58a25a9b7527155032a6dc4758716ded69590911468a37629acb13d1"}, + {file = "clang_format-17.0.6-py2.py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:393f896db6155d6b8401ebae40df1f9a8cdf15d494d13fb775657c9ec609b586"}, + {file = "clang_format-17.0.6-py2.py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccb6f5ce90f24ed0bb314d041a8edcc94d1279c1469669d5855be004d9d6caff"}, + {file = "clang_format-17.0.6-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a1323ca5322e0dead521223155fe2ae1ba81d50abab8e20aaac28f6a94f23b9"}, + {file = "clang_format-17.0.6-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:5476f8fba40e4330a4704681386d78751ced0ecbd050bd0687817cca01d4e167"}, + {file = "clang_format-17.0.6-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:a0f744b056cb1595efdb7d2b83a7d73370e506e17fcaa68cd884c2ed029ae0fd"}, + {file = "clang_format-17.0.6-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:2ddc8b6237520d26d78489e3bb876243d87c3629eb3cd40e1df0c8c6e355d949"}, + {file = "clang_format-17.0.6-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:afc29c4413b5f2f885347f4bdbb7fe81f595faeceafa640c9e67a2d9aa2c7134"}, + {file = "clang_format-17.0.6-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:33c4f1975a6a0a76e5b85165c510c46ae1155f82477a5730e29799e43d78c83a"}, + {file = "clang_format-17.0.6-py2.py3-none-win32.whl", hash = "sha256:edd55b840fa6edcdafb1651c3c24c6ea8d911e73be30373e7e8e5741cb585464"}, + {file = "clang_format-17.0.6-py2.py3-none-win_amd64.whl", hash = "sha256:9407f0f4cb5a26b96af38bb2261f1c4015127f4d87ce46a61bb3a3c2a3d4f3cc"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.6.1" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "cpp-linter" +version = "1.10.6" +description = "Run clang-format and clang-tidy on a batch of files." +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "cpp_linter-1.10.6-py3-none-any.whl", hash = "sha256:bbe566a8d4eeb3dfc11a841f5570f3d465e60734c7968ef85bee27c7f407be9d"}, +] + +[package.dependencies] +pygit2 = "*" +pyyaml = "*" +requests = "*" + +[[package]] +name = "exceptiongroup" +version = "1.3.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" +files = [ + {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, + {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "idna" +version = "3.11" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycparser" +version = "2.23" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, + {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, +] + +[[package]] +name = "pygit2" +version = "1.13.3" +description = "Python bindings for libgit2." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pygit2-1.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a3053850e29c1e102b1ab759d90b0dcc6402d7a434cbe810cfd2792294cf0ba6"}, + {file = "pygit2-1.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d2461db082c27231e2565e24e7ec3d6a60c7ceea5cda7364cb6eb81a6aedebd"}, + {file = "pygit2-1.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2216dc34edbe44e37c5cabc5f1530266445b87c66038fc8b3e0e7be64b3d4edb"}, + {file = "pygit2-1.13.3-cp310-cp310-win32.whl", hash = "sha256:5bc8c173ead087a4200e8763fad92105b4c9d40d03e007b9d9bbe47793716d31"}, + {file = "pygit2-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:c305adf3a86e02db8bcd89bb92e33e896a2ff36f58a5ad7ff15675491ab6a751"}, + {file = "pygit2-1.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8de720ca137624d8f98c8b8d57cdb1e461034adf3e158762ee5c3085620c8075"}, + {file = "pygit2-1.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a85521b8e218afd4111d5bd4e106d77ffaac7ecd9a1ed8c1eea9f8d9568d287"}, + {file = "pygit2-1.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c5cb78cc0a88f5cb2910e85996f33fcac99994251117f00f2e344f84d2616a"}, + {file = "pygit2-1.13.3-cp311-cp311-win32.whl", hash = "sha256:81686e3e06132f23eab32c6718c21930e8adda795c2ca76617f7562bff7b6b66"}, + {file = "pygit2-1.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:93cc7ffb403688c2ec3e169096f34b2b99bc709adc54487e9d11165cfd070948"}, + {file = "pygit2-1.13.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:07b17f766c88ce1d05d264b5819e75ad261f3b60e33e4105a71f02467d0f6d39"}, + {file = "pygit2-1.13.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81bfe9ca394cdc896b632f18cd5f9c656a5f6c03c61deb1570b9081f2406776b"}, + {file = "pygit2-1.13.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c83e6e5ac357a9e87698c1eb25f430846f208bce12362d2209e7c9ac214e00c"}, + {file = "pygit2-1.13.3-cp312-cp312-win32.whl", hash = "sha256:de481a2cee7ef98143109bd9d2b30690022aeb8ba849feeba082a3b48a53c214"}, + {file = "pygit2-1.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:0353b55f8bed1742dab15083ee9ee508ed91feb5c2563e2a612af277317030c6"}, + {file = "pygit2-1.13.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:60152bb30bc2ab880d3c82f113be33aac7ced571d1148c51720ccefff9dfc9ce"}, + {file = "pygit2-1.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcf827ebe392e2181a50ebaf724947e30a1da076a74d8a6f9cec784158faced1"}, + {file = "pygit2-1.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73cb821acc5cc8ad62a96154d030ff47127073b56f71157e7c65b2e7ebb4d52f"}, + {file = "pygit2-1.13.3-cp38-cp38-win32.whl", hash = "sha256:112c4efd421c3c8b4bb4406d3cd4a3a6a18a925c1f8b08d8a6dd0b591c6c6049"}, + {file = "pygit2-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:21f73fd2863b6b21b4fbfed11a42af0ac1036472bb3716944b42a9719beaf07e"}, + {file = "pygit2-1.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e94f2598bdf68340609bb21fd4d21213812913b40b73e5fcba67f4fb01f4fba4"}, + {file = "pygit2-1.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5846aadb7b72802b3e4cb981f956965e92bc1692e7514ff4491bd7e24b20b358"}, + {file = "pygit2-1.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2823d097b103740d52e600ef2079e23966583edbde08ac122279f1ab3b2c3979"}, + {file = "pygit2-1.13.3-cp39-cp39-win32.whl", hash = "sha256:72fda35f88a3f5549eb9683c47ac73a6b674df943fc2490d93d539b46f518cbd"}, + {file = "pygit2-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:2087fd130181e4ba6b8599fcd406920781555a52a3f142bd1dec4de21b9c5792"}, + {file = "pygit2-1.13.3.tar.gz", hash = "sha256:0257c626011e4afb99bdb20875443f706f84201d4c92637f02215b98eac13ded"}, +] + +[package.dependencies] +cffi = ">=1.16.0" +setuptools = {version = "*", markers = "python_version >= \"3.12\""} + +[[package]] +name = "pytest" +version = "8.3.5" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, + {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "5.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pyyaml" +version = "6.0.3" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, +] + +[[package]] +name = "requests" +version = "2.32.4" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "80.9.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version >= \"3.12\"" +files = [ + {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, + {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +markers = "python_full_version <= \"3.11.0a6\"" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.8" +content-hash = "87e3408d5b9af27bd9ddb1dfbad44b91eabf3f8984f9c25b4a1f18f844811673" diff --git a/pyproject.toml b/pyproject.toml index e086519..1a031ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,10 +17,13 @@ authors = [ readme = "README.md" license = { text = "MIT" } classifiers = ["Programming Language :: Python :: 3"] -requires-python = ">=3.7" - -[project.optional-dependencies] -dev = ["pytest"] +requires-python = ">=3.8" [tool.poetry] name = "hipopybind" + +[tool.poetry.group.dev.dependencies] +pytest = "^8.0.0" +pytest-cov = "^5.0.0" # optional, for coverage reports +clang-format = "^17.0.0" # For local C++ formatting +cpp-linter = "^1.10.0" # For local C++ linting From 5b404eb3472cda2caa15243ded5543e69d55c0b5 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 00:04:59 -0400 Subject: [PATCH 023/113] fix: Format code. --- src/hipopybind_module.cpp | 2468 ++++++++++++++++++++----------------- 1 file changed, 1314 insertions(+), 1154 deletions(-) diff --git a/src/hipopybind_module.cpp b/src/hipopybind_module.cpp index 6c2b654..cd2fb54 100644 --- a/src/hipopybind_module.cpp +++ b/src/hipopybind_module.cpp @@ -1,166 +1,166 @@ -#include -#include #include -#include +#include #include #include +#include +#include -#include -#include +#include #include #include -#include -#include #include +#include +#include +#include -#include +#include #include #include -#include #include +#include #include #include #include +#include #include -#include #define STRINGIFY(x) #x #define MACRO_STRINGIFY(x) STRINGIFY(x) -//NOTE: Shared object will not load if you simultaneously -// define classes to bind within this file and bind hipo -// classes or classes from another cpp project. +// NOTE: Shared object will not load if you simultaneously +// define classes to bind within this file and bind hipo +// classes or classes from another cpp project. //--------------------------------------------------// // Get array functions - Matthew McEneaney std::vector _getInts(hipo::bank bank, const char *name) noexcept { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - std::vector arr(0); - if(bankSchema.getEntryType(item)==3) { - for (int index=0; index arr(0); + if (bankSchema.getEntryType(item) == 3) { + for (int index = 0; index < bank.getRows(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + arr.push_back((int)bank.getIntAt(offset)); } - return arr; + } + return arr; } std::vector _getShorts(hipo::bank bank, const char *name) noexcept { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - std::vector arr(0); - if(bankSchema.getEntryType(item)==2) { - for (int index=0; index arr(0); + if (bankSchema.getEntryType(item) == 2) { + for (int index = 0; index < bank.getRows(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + arr.push_back((int)bank.getShortAt(offset)); } - return arr; + } + return arr; } std::vector _getBytes(hipo::bank bank, const char *name) noexcept { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - std::vector arr(0); - if(bankSchema.getEntryType(item)==1) { - for (int index=0; index arr(0); + if (bankSchema.getEntryType(item) == 1) { + for (int index = 0; index < bank.getRows(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + arr.push_back((int)bank.getByteAt(offset)); } - } - return arr; + } + return arr; } std::vector _getFloats(hipo::bank bank, const char *name) noexcept { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - std::vector arr(0); - if(bankSchema.getEntryType(item)==4) { - for (int index=0; index arr(0); + if (bankSchema.getEntryType(item) == 4) { + for (int index = 0; index < bank.getRows(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + arr.push_back(bank.getFloatAt(offset)); } - return arr; + } + return arr; } std::vector _getDoubles(hipo::bank bank, const char *name) noexcept { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - std::vector arr(0); - if(bankSchema.getEntryType(item)==5) { - for (int index=0; index arr(0); + if (bankSchema.getEntryType(item) == 5) { + for (int index = 0; index < bank.getRows(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + arr.push_back(bank.getDoubleAt(offset)); } - } - return arr; + } + return arr; } std::vector _getLongs(hipo::bank bank, const char *name) noexcept { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - std::vector arr(0); - if(bankSchema.getEntryType(item)==8) { - for (int index=0; index arr(0); + if (bankSchema.getEntryType(item) == 8) { + for (int index = 0; index < bank.getRows(); index++) { + int offset = bankSchema.getOffset(item, index, bank.getRows()); + arr.push_back(bank.getLongAt(offset)); } - return arr; + } + return arr; } //--------------------------------------------------// void _putInts(hipo::bank &bank, const char *name, std::vector arr) { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - for (std::size_t index = 0; index < arr.size(); index++) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { int offset = bankSchema.getOffset(item, index, bank.getRows()); - bank.putIntAt(offset,arr[index]); - } + bank.putIntAt(offset, arr[index]); + } } void _putShorts(hipo::bank &bank, const char *name, std::vector arr) { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - for (std::size_t index = 0; index < arr.size(); index++) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { int offset = bankSchema.getOffset(item, index, bank.getRows()); - bank.putShortAt(offset,arr[index]); - } + bank.putShortAt(offset, arr[index]); + } } void _putBytes(hipo::bank &bank, const char *name, std::vector arr) { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - for (std::size_t index = 0; index < arr.size(); index++) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { int offset = bankSchema.getOffset(item, index, bank.getRows()); - bank.putByteAt(offset,arr[index]); - } + bank.putByteAt(offset, arr[index]); + } } void _putFloats(hipo::bank &bank, const char *name, std::vector arr) { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - for (std::size_t index = 0; index < arr.size(); index++) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { int offset = bankSchema.getOffset(item, index, bank.getRows()); - bank.putFloatAt(offset,arr[index]); - } + bank.putFloatAt(offset, arr[index]); + } } void _putDoubles(hipo::bank &bank, const char *name, std::vector arr) { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - for (std::size_t index = 0; index < arr.size(); index++) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { int offset = bankSchema.getOffset(item, index, bank.getRows()); - bank.putDoubleAt(offset,arr[index]); - } + bank.putDoubleAt(offset, arr[index]); + } } void _putLongs(hipo::bank &bank, const char *name, std::vector arr) { - hipo::schema &bankSchema = bank.getSchema(); - int item = bankSchema.getEntryOrder(name); - for (std::size_t index = 0; index < arr.size(); index++) { + hipo::schema &bankSchema = bank.getSchema(); + int item = bankSchema.getEntryOrder(name); + for (std::size_t index = 0; index < arr.size(); index++) { int offset = bankSchema.getOffset(item, index, bank.getRows()); - bank.putLongAt(offset,arr[index]); - } + bank.putLongAt(offset, arr[index]); + } } //--------------------------------------------------// @@ -170,370 +170,437 @@ void _putLongs(hipo::bank &bank, const char *name, std::vector arr) { class HipoFileIterator { - private: - int batchsize; - int nbanks; - int index; - std::vector filenames; - std::vector banknames; - std::vector banklist; - std::vector> typelist; - std::vector> itemlist; - hipo::reader reader; - // hipo::writer writer; - hipo::dictionary dict; - hipo::event event; - - std::vector>> vec_double; - std::vector>> vec_float; - std::vector>> vec_int; - std::vector>> vec_long; - std::vector>> vec_short; - std::vector>> vec_byte; - - std::map item_index_map; - std::map item_type_map; - std::string separator; - std::vector item_indices; - std::vector tags; - - protected: - void protected_method(); - - public: - HipoFileIterator( - std::vector &__filenames__, - std::vector &__banknames__, - int __batchsize__, - std::vector &__tags__ - ){ - filenames = __filenames__; - banknames = __banknames__; - nbanks = banknames.size(); - batchsize = __batchsize__; - separator = "_"; - item_indices = std::vector(9); //NOTE: Only 6 types, but they only go up to 8 and it's easier to use the type int as the index. - tags = __tags__; - - // Check length of filenames - if (filenames.size()==0) throw std::invalid_argument("HipoFileIterator: length of filenames must be > 0"); - - // Check batchsize - if (batchsize<=0) throw std::invalid_argument("HipoFileIterator: batch_size must be > 0"); - - index = -1; - - // Set tags before opening files - for (int i=0; i>(0); - itemlist = std::vector>(0); - for (int i = 0; i vec_entrytype = std::vector(0); - std::vector vec_entryname = std::vector(0); //NOTE: IMPORTANT THAT THIS IS ZERO. IF YOU SET TO NENTRIES YOU MESS UP PUSHBACK AND GET A VECTOR TWICE AS LONG AS YOU WANT. - for (int j = 0; j=filenames.size()) return false; - const char * filename = filenames.at(index).c_str(); - reader.open(filename); - reader.readDictionary(dict); //TODO: Figure out how to check file here.... - return true; - } +private: + int batchsize; + int nbanks; + int index; + std::vector filenames; + std::vector banknames; + std::vector banklist; + std::vector> typelist; + std::vector> itemlist; + hipo::reader reader; + // hipo::writer writer; + hipo::dictionary dict; + hipo::event event; + + std::vector>> vec_double; + std::vector>> vec_float; + std::vector>> vec_int; + std::vector>> vec_long; + std::vector>> vec_short; + std::vector>> vec_byte; + + std::map item_index_map; + std::map item_type_map; + std::string separator; + std::vector item_indices; + std::vector tags; + +protected: + void protected_method(); - /** - * Resets the vectors used for storing batch data of all available types. - * @exception std::out_of_range - */ - void reset() { - try { - vec_double = std::vector>>(item_indices.at(5)); - vec_float = std::vector>>(item_indices.at(4)); - vec_int = std::vector>>(item_indices.at(3)); - vec_long = std::vector>>(item_indices.at(8)); - vec_short = std::vector>>(item_indices.at(2)); - vec_byte = std::vector>>(item_indices.at(1)); - } catch(const std::out_of_range &e) { - std::cout << e.what() < tags - */ - std::vector getTags() { - return tags; - } - - /** - * Recursive function which loops file(s) to read data into next batch. - * @param int __counter__ - * @return bool - */ - bool next(int __counter__ = 0) { - - int counter = __counter__; - - // Loop events - while (reader.next()) { - reader.read(event); - - // Loop banks - for (int i = 0; i entrytypes = typelist.at(i); - std::vector entrynames = itemlist.at(i); //TODO: COULD ALSO COMPARE TIME WITH SCHEMALIST... - int nentries = entrytypes.size(); - - // Loop entries - for (int j = 0; j GetDoubles etc should return empty array if bank is empty in event and schema is still there so this should be fine, in principle. - case 5: vec_double.at(entryindex).push_back(_getDoubles(bank,name)); break; - case 8: vec_long.at(entryindex).push_back(_getLongs(bank,name)); break; - default: throw pybind11::type_error("HipoFileIterator: Invalid type " + std::to_string(type) + " for entry: "+entrynames.at(j)+"\n"); - } - } // for (int j = 0; j=batchsize) { - if (!reader.hasNext() && index>=filenames.size()-1) return false; - return true; - } - } - // Move on to next file if batch is not yet complete - if (open()) { - return next(counter); //NOTE: Recursive function //NOTE: If you do not return here, the original function keeps going after the recursive call and returns false and so ends iteration. - } - //TODO: NOTE: THIS SHOULD NOT RAISE A STOP ITERATION BECAUSE YOU STILL NEED TO GET THE BATCH DATA IN PYTHON - return false; //NOTE: Only happens if you've reached the end of all files. - } - - /** - * Get type int for given bank name and entry name. - * @param std::string bankname - * @param std::string item - * @return int i - */ - int getType(std::string bankname, std::string item) { - return item_type_map.at(bankname+separator+item); //NOTE: //TODO: COULD ADD pybind11::attribute_error here and try block. - } - - /** - * Get batch array of doubles for given bank name and entry name. - * @param std::string bankname - * @param std::string item - * @return std::vector> - */ - std::vector> getDoubles(std::string bankname, std::string item) const noexcept { - int i = item_index_map.at(bankname+separator+item); - return vec_double.at(i); - } - - /** - * Get batch array of floats for given bank name and entry name. - * @param std::string bankname - * @param std::string item - * @return std::vector> - */ - std::vector> getFloats(std::string bankname, std::string item) const noexcept { - int i = item_index_map.at(bankname+separator+item); - return vec_float.at(i); - } - - /** - * Get batch array of ints for given bank name and entry name. - * @param std::string bankname - * @param std::string item - * @return std::vector> - */ - std::vector> getInts(std::string bankname, std::string item) const noexcept { - int i = item_index_map.at(bankname+separator+item); - return vec_int.at(i); - } - - /** - * Get batch array of longs for given bank name and entry name. - * @param std::string bankname - * @param std::string item - * @return std::vector> - */ - std::vector> getLongs(std::string bankname, std::string item) const noexcept { - int i = item_index_map.at(bankname+separator+item); - return vec_long.at(i); - } - - /** - * Get batch array of shorts for given bank name and entry name. - * @param std::string bankname - * @param std::string item - * @return std::vector> - */ - std::vector> getShorts(std::string bankname, std::string item) const noexcept { - int i = item_index_map.at(bankname+separator+item); - return vec_short.at(i); - } +public: + HipoFileIterator(std::vector &__filenames__, + std::vector &__banknames__, int __batchsize__, + std::vector &__tags__) { + filenames = __filenames__; + banknames = __banknames__; + nbanks = banknames.size(); + batchsize = __batchsize__; + separator = "_"; + item_indices = + std::vector(9); // NOTE: Only 6 types, but they only go up to 8 and + // it's easier to use the type int as the index. + tags = __tags__; + + // Check length of filenames + if (filenames.size() == 0) + throw std::invalid_argument( + "HipoFileIterator: length of filenames must be > 0"); + + // Check batchsize + if (batchsize <= 0) + throw std::invalid_argument("HipoFileIterator: batch_size must be > 0"); + + index = -1; + + // Set tags before opening files + for (int i = 0; i < tags.size(); i++) { + reader.setTags(tags.at(i)); + } - /** - * Get batch array of bytes for given bank name and entry name. - * @param std::string bankname - * @param std::string item - * @return std::vector> - */ - std::vector> getBytes(std::string bankname, std::string item) const noexcept { - int i = item_index_map.at(bankname+separator+item); - return vec_byte.at(i); - } + // Open first file and set bank names to all banks if none specified + open(); + if (nbanks == 0) { + banknames = dict.getSchemaList(); + nbanks = banknames.size(); + } - /* - * Get methods for class attributes - */ - int getBatchsize() { return batchsize; } - int getNBanks() { return nbanks; } - int getIndex() { return index; } - std::vector getFilenames() { return filenames; } - std::vector getBanknames() { return banknames; } - std::vector getBanklist() { return banklist; } - std::vector> getTypelist() { return typelist; } - std::vector> getItemlist() { return itemlist; } - hipo::reader getReader() { return reader; } - // hipo::writer getWriter() { return writer; } - hipo::dictionary getDict() { return dict; } - hipo::event getEvent() { return event; } - - }; // class HipoFileIterator + // Loop bank names and create banks and get entry names and types + typelist = std::vector>(0); + itemlist = std::vector>(0); + for (int i = 0; i < nbanks; i++) { + const char *bankname = banknames.at(i).c_str(); + hipo::schema &schema = dict.getSchema(bankname); + hipo::bank bank = hipo::bank(schema); + banklist.push_back(bank); + event.getStructure(bank); + + // Loop bank entries and get names and types + int nentries = schema.getEntries(); + std::vector vec_entrytype = std::vector(0); + std::vector vec_entryname = std::vector( + 0); // NOTE: IMPORTANT THAT THIS IS ZERO. IF YOU SET TO NENTRIES YOU + // MESS UP PUSHBACK AND GET A VECTOR TWICE AS LONG AS YOU WANT. + for (int j = 0; j < nentries; j++) { + int entrytype = schema.getEntryType(j); + std::string entryname = schema.getEntryName(j); + vec_entrytype.push_back(entrytype); + vec_entryname.push_back(entryname); + + // Update bank+item to index map + item_index_map.insert(std::make_pair(bankname + separator + entryname, + item_indices[entrytype])); + item_type_map.insert( + std::make_pair(bankname + separator + entryname, entrytype)); + item_indices.at(entrytype) = item_indices.at(entrytype) + 1; + } + typelist.push_back(vec_entrytype); + itemlist.push_back(vec_entryname); + } + reset(); + + } // HipoFileIterator() //NOTE: //TODO: Could also define a init method where + // you specify bank entries and then parse in python... and could also + // figure out how to include cuts.... + + virtual ~HipoFileIterator() = default; + + /** + * Open the next file in this.filenames if the end of this.filenames has not + * yet been reached. + * @return bool + */ + bool open() { + index++; + if (index >= filenames.size()) + return false; + const char *filename = filenames.at(index).c_str(); + reader.open(filename); + reader.readDictionary(dict); // TODO: Figure out how to check file here.... + return true; + } + + /** + * Resets the vectors used for storing batch data of all available types. + * @exception std::out_of_range + */ + void reset() { + try { + vec_double = + std::vector>>(item_indices.at(5)); + vec_float = + std::vector>>(item_indices.at(4)); + vec_int = std::vector>>(item_indices.at(3)); + vec_long = + std::vector>>(item_indices.at(8)); + vec_short = + std::vector>>(item_indices.at(2)); + vec_byte = std::vector>>(item_indices.at(1)); + } catch (const std::out_of_range &e) { + std::cout << e.what() << std::endl; // DEBUGGING + } + return; + } + + /** + * Move reader to given event number in file. + * @param int n + * @return bool + */ + bool gotoEvent(int n) { // TODO: CHECK THIS METHOD AND DO A REWIND METHOD TOO. + return reader.gotoEvent(n); + } + + /** + * Add a reader tag. + * @param int tag + */ + void setTags(int tag) { reader.setTags(tag); } + + /** + * Get reader tags. + * @return std::vector tags + */ + std::vector getTags() { return tags; } + + /** + * Recursive function which loops file(s) to read data into next batch. + * @param int __counter__ + * @return bool + */ + bool next(int __counter__ = 0) { + + int counter = __counter__; + + // Loop events + while (reader.next()) { + reader.read(event); + + // Loop banks + for (int i = 0; i < nbanks; i++) { + + // Read bank + std::string bankname = banknames.at(i); + hipo::bank bank = banklist.at(i); + event.getStructure(bank); + + // Get entry names and types + std::vector entrytypes = typelist.at(i); + std::vector entrynames = + itemlist.at(i); // TODO: COULD ALSO COMPARE TIME WITH SCHEMALIST... + int nentries = entrytypes.size(); + + // Loop entries + for (int j = 0; j < nentries; j++) { + int type = entrytypes.at(j); + const char *name = entrynames.at(j).c_str(); + int entryindex = item_index_map.at(bankname + separator + name); + switch (type) { + case 1: + vec_byte.at(entryindex).push_back(_getBytes(bank, name)); + break; // NOTE COULD INSERT INTO PREEXISTING VECTOR? AND THEN + // INITIALIZE VECTOR WITH CORRECT DIMENSIONS ON FIRST TWO + // AXES... + case 2: + vec_short.at(entryindex).push_back(_getShorts(bank, name)); + break; // TODO: ALSO NEED TO DEAL WITH CASE WHERE SOME EVENTS DON'T + // HAVE ALL THE BANKS. + case 3: + vec_int.at(entryindex).push_back(_getInts(bank, name)); + break; // TODO: Make sure this will modify in place. + case 4: + vec_float.at(entryindex).push_back(_getFloats(bank, name)); + break; // TODO: Figure out how to add empty events for banks that + // don't occur in a given event... -> GetDoubles etc should + // return empty array if bank is empty in event and schema is + // still there so this should be fine, in principle. + case 5: + vec_double.at(entryindex).push_back(_getDoubles(bank, name)); + break; + case 8: + vec_long.at(entryindex).push_back(_getLongs(bank, name)); + break; + default: + throw pybind11::type_error( + "HipoFileIterator: Invalid type " + std::to_string(type) + + " for entry: " + entrynames.at(j) + "\n"); + } + } // for (int j = 0; j= batchsize) { + if (!reader.hasNext() && index >= filenames.size() - 1) + return false; + return true; + } + } + // Move on to next file if batch is not yet complete + if (open()) { + return next( + counter); // NOTE: Recursive function //NOTE: If you do not return + // here, the original function keeps going after the + // recursive call and returns false and so ends iteration. + } + // TODO: NOTE: THIS SHOULD NOT RAISE A STOP ITERATION BECAUSE YOU STILL NEED + // TO GET THE BATCH DATA IN PYTHON + return false; // NOTE: Only happens if you've reached the end of all files. + } + + /** + * Get type int for given bank name and entry name. + * @param std::string bankname + * @param std::string item + * @return int i + */ + int getType(std::string bankname, std::string item) { + return item_type_map.at( + bankname + separator + + item); // NOTE: //TODO: COULD ADD pybind11::attribute_error here and try + // block. + } + + /** + * Get batch array of doubles for given bank name and entry name. + * @param std::string bankname + * @param std::string item + * @return std::vector> + */ + std::vector> getDoubles(std::string bankname, + std::string item) const noexcept { + int i = item_index_map.at(bankname + separator + item); + return vec_double.at(i); + } + + /** + * Get batch array of floats for given bank name and entry name. + * @param std::string bankname + * @param std::string item + * @return std::vector> + */ + std::vector> getFloats(std::string bankname, + std::string item) const noexcept { + int i = item_index_map.at(bankname + separator + item); + return vec_float.at(i); + } + + /** + * Get batch array of ints for given bank name and entry name. + * @param std::string bankname + * @param std::string item + * @return std::vector> + */ + std::vector> getInts(std::string bankname, + std::string item) const noexcept { + int i = item_index_map.at(bankname + separator + item); + return vec_int.at(i); + } + + /** + * Get batch array of longs for given bank name and entry name. + * @param std::string bankname + * @param std::string item + * @return std::vector> + */ + std::vector> getLongs(std::string bankname, + std::string item) const noexcept { + int i = item_index_map.at(bankname + separator + item); + return vec_long.at(i); + } + + /** + * Get batch array of shorts for given bank name and entry name. + * @param std::string bankname + * @param std::string item + * @return std::vector> + */ + std::vector> getShorts(std::string bankname, + std::string item) const noexcept { + int i = item_index_map.at(bankname + separator + item); + return vec_short.at(i); + } + + /** + * Get batch array of bytes for given bank name and entry name. + * @param std::string bankname + * @param std::string item + * @return std::vector> + */ + std::vector> getBytes(std::string bankname, + std::string item) const noexcept { + int i = item_index_map.at(bankname + separator + item); + return vec_byte.at(i); + } + + /* + * Get methods for class attributes + */ + int getBatchsize() { return batchsize; } + int getNBanks() { return nbanks; } + int getIndex() { return index; } + std::vector getFilenames() { return filenames; } + std::vector getBanknames() { return banknames; } + std::vector getBanklist() { return banklist; } + std::vector> getTypelist() { return typelist; } + std::vector> getItemlist() { return itemlist; } + hipo::reader getReader() { return reader; } + // hipo::writer getWriter() { return writer; } + hipo::dictionary getDict() { return dict; } + hipo::event getEvent() { return event; } + +}; // class HipoFileIterator //--------------------------------------------------// // HipoFileIterator Trampoline class -template class PyHipoFileIterator : public HipoFileIteratorBase { +template +class PyHipoFileIterator : public HipoFileIteratorBase { public: - using HipoFileIteratorBase::HipoFileIteratorBase; // Inherit constructors + using HipoFileIteratorBase::HipoFileIteratorBase; // Inherit constructors }; //--------------------------------------------------// // HIPO Trampoline classes -//NOTE: utils, benchmark classes throw compilation error if you try to use trampoline class. +// NOTE: utils, benchmark classes throw compilation error if you try to use +// trampoline class. -template class PyDatastream : public DatastreamBase { +template +class PyDatastream : public DatastreamBase { public: - using DatastreamBase::DatastreamBase; // Inherit constructors - long size() override { PYBIND11_OVERRIDE_PURE(long, DatastreamBase, size, ); } - long position() override { PYBIND11_OVERRIDE_PURE(long, DatastreamBase, position, ); } - long position(long pos) override { PYBIND11_OVERRIDE_PURE(long, DatastreamBase, position, pos); } - void open(const char *filename) override { PYBIND11_OVERRIDE_PURE(void, DatastreamBase, open, filename ); } - int read(char *s, int size) override { PYBIND11_OVERRIDE_PURE(int, DatastreamBase, read, s, size); } + using DatastreamBase::DatastreamBase; // Inherit constructors + long size() override { PYBIND11_OVERRIDE_PURE(long, DatastreamBase, size, ); } + long position() override { + PYBIND11_OVERRIDE_PURE(long, DatastreamBase, position, ); + } + long position(long pos) override { + PYBIND11_OVERRIDE_PURE(long, DatastreamBase, position, pos); + } + void open(const char *filename) override { + PYBIND11_OVERRIDE_PURE(void, DatastreamBase, open, filename); + } + int read(char *s, int size) override { + PYBIND11_OVERRIDE_PURE(int, DatastreamBase, read, s, size); + } }; -//NOTE: datastreamLocalFile, datastreamXrootd classes thorw compilation error if you try to use trampoline class. +// NOTE: datastreamLocalFile, datastreamXrootd classes thorw compilation error +// if you try to use trampoline class. template class PySchema : public SchemaBase { public: - using SchemaBase::SchemaBase; // Inherit constructors + using SchemaBase::SchemaBase; // Inherit constructors }; -template class PyDictionary : public DictionaryBase { +template +class PyDictionary : public DictionaryBase { public: - using DictionaryBase::DictionaryBase; // Inherit constructors + using DictionaryBase::DictionaryBase; // Inherit constructors }; -template class PyStructure : public StructureBase { +template +class PyStructure : public StructureBase { public: - using StructureBase::StructureBase; // Inherit constructors - void notify() override { PYBIND11_OVERRIDE_PURE(void, StructureBase, notify, ); } + using StructureBase::StructureBase; // Inherit constructors + void notify() override { + PYBIND11_OVERRIDE_PURE(void, StructureBase, notify, ); + } }; -template class PyBank : public PyStructure { +template +class PyBank : public PyStructure { public: - using PyStructure::PyStructure; // Inherit constructors + using PyStructure::PyStructure; // Inherit constructors }; template class PyEvent : public EventBase { public: - using EventBase::EventBase; // Inherit constructors + using EventBase::EventBase; // Inherit constructors }; -//NOTE: readerIndex, reader, data, record classes throw compilation error if you try to use trampoline class. +// NOTE: readerIndex, reader, data, record classes throw compilation error if +// you try to use trampoline class. -template class PyRecordBuilder : public RecordBuilderBase { +template +class PyRecordBuilder : public RecordBuilderBase { public: - using RecordBuilderBase::RecordBuilderBase; // Inherit constructors + using RecordBuilderBase::RecordBuilderBase; // Inherit constructors }; template class PyWriter : public WriterBase { public: - using WriterBase::WriterBase; // Inherit constructors + using WriterBase::WriterBase; // Inherit constructors }; //--------------------------------------------------// @@ -542,741 +609,834 @@ template class PyWriter : public WriterBase { namespace py = pybind11; PYBIND11_MODULE(_core, m) { - // Add functions to module - m.def("getInts", &_getInts); - m.def("getShorts", &_getShorts); - m.def("getBytes", &_getBytes); - m.def("getFloats", &_getFloats); - m.def("getDoubles", &_getDoubles); - m.def("getLongs", &_getLongs); - m.def("putInts", &_putInts); - m.def("putShorts", &_putShorts); - m.def("putBytes", &_putBytes); - m.def("putFloats", &_putFloats); - m.def("putDoubles", &_putDoubles); - m.def("putLongs", &_putLongs); - - //ADDED BEGIN - //----------------------------------------------------------------------// - // Bind HipoFileIterator - py::class_> hipofileiterator(m, "HipoFileIterator"); - hipofileiterator.def(py::init([](std::vector & filenames, std::vector & banknames, int batchsize, std::vector & tags) { return new HipoFileIterator(filenames,banknames,batchsize,tags); })); - hipofileiterator.def("open", &HipoFileIterator::open); - hipofileiterator.def("reset", &HipoFileIterator::reset); - hipofileiterator.def("next", &HipoFileIterator::next); - hipofileiterator.def("gotoEvent", &HipoFileIterator::gotoEvent); - hipofileiterator.def("setTags", &HipoFileIterator::setTags); //TODO: ADD OPTION IN INIT TO SET TAGS... - hipofileiterator.def("getType", &HipoFileIterator::getType); - hipofileiterator.def("getDoubles", &HipoFileIterator::getDoubles); - hipofileiterator.def("getFloats", &HipoFileIterator::getFloats); - hipofileiterator.def("getInts", &HipoFileIterator::getInts); - hipofileiterator.def("getLongs", &HipoFileIterator::getLongs); - hipofileiterator.def("getShorts", &HipoFileIterator::getShorts); - hipofileiterator.def("getBytes", &HipoFileIterator::getBytes); - - hipofileiterator.def_property_readonly("batchsize",&HipoFileIterator::getBatchsize); - hipofileiterator.def_property_readonly("nbanks",&HipoFileIterator::getNBanks); - hipofileiterator.def_property_readonly("index",&HipoFileIterator::getIndex); - hipofileiterator.def_property_readonly("filenames",&HipoFileIterator::getFilenames); - hipofileiterator.def_property_readonly("banknames",&HipoFileIterator::getBanknames); - hipofileiterator.def_property_readonly("banks",&HipoFileIterator::getBanklist); - hipofileiterator.def_property_readonly("types",&HipoFileIterator::getTypelist); - hipofileiterator.def_property_readonly("items",&HipoFileIterator::getItemlist); - hipofileiterator.def_property_readonly("reader",&HipoFileIterator::getReader); - hipofileiterator.def_property_readonly("dict",&HipoFileIterator::getDict); - hipofileiterator.def_property_readonly("event",&HipoFileIterator::getEvent); - hipofileiterator.def_property_readonly("tags",&HipoFileIterator::getTags); - - hipofileiterator.def("__repr__", //TODO: Test this function in python - [](HipoFileIterator &hfi) { std::string r("HipoFileIterator"); return r; } - ); - hipofileiterator.def("__eq__", //TODO: Test this function in python - [](HipoFileIterator *hfi1, HipoFileIterator *hfi2) { return hfi1 == hfi2; } - ); - hipofileiterator.def("__next__", //TODO: Test this function in python - [](HipoFileIterator &hfi) { hfi.reset(); return hfi.next(); } - ); - - // * DONE *: TODO: ADD METHOD TO GET TYPE OF KEY AND THEN GET ARRAY? -> Can then use __get__ method - // * DONE *: TODO: ADD RAISE STOP_ITERATION IN __NEXT__ - // * DONE *: TODO: ADD GET SET METHOD AND ADD def.property for accessible attributes like reader and banklist and filenames and banknames and entry names and batch size and index and so on.... - //TODO: HOW TO LINK AWKWARD / NUMPY ARRAYS DIRECTLY TO RETURNED VECTORS - //TODO: LONGTERM: HipoFileWriter -> Handles reading and writing simultaneously. - //TODO: LONGTERM: Writing to file with [] operator accessor. - - - // hipofileiterator.def("__get__", //NOTE: THIS WILL NOT WORK SINCE THE LAMBDA NEEDS TO HAVE THE SAME RETURN TYPE EVERY TIME... - // [](HipoFileIterator &hfi,std::string bankname, std::string item) { - // int type = hfi.getType(bankname,item); - // switch (type) { - // case 3: return hfi.getInts(bankname,item); - // case 4: return hfi.getFloats(bankname,item); - // case 5: return hfi.getDoubles(bankname,item); - // case 8: return hfi.getLongs(bankname,item); - // case 1: return hfi.getBytes(bankname,item); - // case 2: return hfi.getShorts(bankname,item); - // default: throw pybind11::type_error("HipoFileIterator: Invalid type int for entry: "+bankname+" "+item+"\n"); - // } - // } - // ); - //ADDED END - - //----------------------------------------------------------------------// - // Bind HIPO utils - py::class_ utils(m, "Utils"); - utils.def(py::init<>()); - - utils.def("tokenize", &hipo::utils::tokenize); - utils.def("substring", &hipo::utils::substring); - utils.def("findposition", &hipo::utils::findposition); - utils.def("ltrim", &hipo::utils::ltrim); - utils.def("rtrim", &hipo::utils::rtrim); - utils.def("trim", &hipo::utils::trim); - - utils.def("printLogo", &hipo::utils::printLogo); - - utils.def("getHeader", &hipo::utils::getHeader); - utils.def("getFileHeader", &hipo::utils::getFileHeader); - utils.def("getFileTrailer", &hipo::utils::getFileTrailer); - utils.def("getSConstruct", &hipo::utils::getSConstruct); - - utils.def("writeInt", &hipo::utils::writeInt); - utils.def("writeLong", &hipo::utils::writeLong); - utils.def("writeByte", &hipo::utils::writeByte); - - //----------------------------------------------------------------------// - // Bind HIPO benchmark - py::class_ benchmark(m, "Benchmark"); - benchmark.def(py::init<>()); - benchmark.def(py::init([](const char *name) { return new hipo::benchmark(name); })); - benchmark.def(py::init([](int freq) { return new hipo::benchmark(freq); })); - - benchmark.def("setName", &hipo::benchmark::setName); - benchmark.def("resume", &hipo::benchmark::resume); - benchmark.def("pause", &hipo::benchmark::pause); - benchmark.def("getTime", &hipo::benchmark::getTime); - benchmark.def("getTimeSec", &hipo::benchmark::getTimeSec); - benchmark.def("getCounter", &hipo::benchmark::getCounter); - benchmark.def("show", &hipo::benchmark::show); - -// class benchmark { -// private: - -// std::chrono::high_resolution_clock clock; -// std::chrono::time_point first, second; -// std::string benchmarkName; - -// long running_time; -// int counter; -// int printoutFrequency; - - // //----------------------------------------------------------------------// //NOTE: Ran into flat namespace error again when loading this in python after compilation - // // Bind HIPO datastream - // py::class_> datastream(m, "Datastream"); - // datastream.def(py::init<>()); - - // datastream.def("size", &hipo::datastream::size); //TODO: These are virtual methods... need to override above... - // datastream.def("position", static_cast(&hipo::datastream::position), "position"); - // datastream.def("position", static_cast(&hipo::datastream::position), "position"); - // datastream.def("open", &hipo::datastream::open); - // datastream.def("read", &hipo::datastream::read); - -// class datastream { -// private: -// std::ifstream inputStream; -// std::string remoteAddress; -// int streamType = 1; - - // //----------------------------------------------------------------------// //NOTE: Ran into flat namespace error again when loading this in python after compilation - // // Bind HIPO datastreamLocalFile - // py::class_ datastreamLocalFile(m, "DatastreamLocalFile"); - // datastreamLocalFile.def(py::init<>()); - - // datastreamLocalFile.def("size", &hipo::datastreamLocalFile::size); //TODO: These are virtual methods... need to override above... - // datastreamLocalFile.def("position", static_cast(&hipo::datastreamLocalFile::position), "position"); - // datastreamLocalFile.def("position", static_cast(&hipo::datastreamLocalFile::position), "position"); - // datastreamLocalFile.def("open", &hipo::datastreamLocalFile::open); - // datastreamLocalFile.def("read", &hipo::datastreamLocalFile::read); - -// class datastreamLocalFile { - -// private: -// std::ifstream inputStream; - - // //----------------------------------------------------------------------// //NOTE: Ran into flat namespace error again when loading this in python after compilation - // // Bind HIPO datastreamXrootd - // py::class_ datastreamXrootd(m, "DatastreamXrootd"); - // datastreamXrootd.def(py::init<>()); - - // datastreamXrootd.def("size", &hipo::datastreamXrootd::size); //TODO: These are virtual methods... need to override above... - // datastreamXrootd.def("position", static_cast(&hipo::datastreamXrootd::position), "position"); - // datastreamXrootd.def("position", static_cast(&hipo::datastreamXrootd::position), "position"); - // datastreamXrootd.def("open", &hipo::datastreamXrootd::open); - // datastreamXrootd.def("read", &hipo::datastreamXrootd::read); - -// class datastreamXrootd { -// private: -// #ifdef __XrootD__ -// kXR_unt16 open_mode = (kXR_ur); -// kXR_unt16 open_opts = (1); -// XrdClient *cli = NULL; -// #endif -// long streamPosition = 0; - - //----------------------------------------------------------------------// - // Bind HIPO schema - py::class_> schema(m, "Schema"); - schema.def(py::init<>()); - schema.def(py::init([](const char *name, int __groupid, int __itemid) { return new hipo::schema(name, __groupid, __itemid); })); - schema.def(py::init([](const hipo::schema &s) { return new hipo::schema(s); })); - - schema.def("parse", &hipo::schema::parse); - schema.def("getName", &hipo::schema::getName); - schema.def("getGroup", &hipo::schema::getGroup); - schema.def("getItem", &hipo::schema::getItem); - schema.def("getSizeForRows", &hipo::schema::getSizeForRows); - schema.def("getRowLength", &hipo::schema::getRowLength); - schema.def("getEntryOrder", &hipo::schema::getEntryOrder); - schema.def("exists", &hipo::schema::exists); - schema.def("getOffset", py::detail::overload_cast_impl()(&hipo::schema::getOffset, py::const_), "getOffset"); //NOTE: Need this syntax for const functions! - schema.def("getOffset", py::detail::overload_cast_impl()(&hipo::schema::getOffset, py::const_), "getOffset"); //NOTE: Need this syntax for const functions! - schema.def("getEntryType", py::detail::overload_cast_impl()(&hipo::schema::getEntryType, py::const_), "getEntryType"); //NOTE: Need this syntax for const functions! - schema.def("getEntryType", py::detail::overload_cast_impl()(&hipo::schema::getEntryType, py::const_), "getEntryType"); //NOTE: Need this syntax for const functions! - schema.def("getEntryName", &hipo::schema::getEntryName); - schema.def("getSchemaString", &hipo::schema::getSchemaString); - schema.def("getSchemaStringJson", &hipo::schema::getSchemaStringJson); - - schema.def_property_readonly("schemaEntriesMap", nullptr); - schema.def_property_readonly("schemaEntries", nullptr); - schema.def_property_readonly("groupid", &hipo::schema::getGroup); - schema.def_property_readonly("itemid", &hipo::schema::getItem); - schema.def_property_readonly("rowLength", &hipo::schema::getRowLength); - schema.def_property_readonly("warningCount", nullptr); - schema.def_property_readonly("schemaName", &hipo::schema::getName); - - schema.def("__repr__", //TODO: Test this function in python - [](hipo::schema &s) { std::string r("Schema : name = "+s.getName()+" , schemaString = "+s.getSchemaString()+"\n"); return r; } - ); - schema.def("__eq__", //TODO: Test this function in python - [](hipo::schema *s1, hipo::schema *s2) { return s1 == s2; } - ); - schema.def("__len__", //TODO: Test this function in python - [](hipo::schema &s) { return s.getRowLength(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO dictionary - py::class_> dictionary(m, "Dictionary"); - dictionary.def(py::init<>()); - - dictionary.def("getSchemaList", &hipo::dictionary::getSchemaList); - dictionary.def("addSchema", &hipo::dictionary::addSchema); - dictionary.def("hasSchema", &hipo::dictionary::hasSchema); - dictionary.def("getSchema", &hipo::dictionary::getSchema); - dictionary.def("parse", &hipo::dictionary::parse); - dictionary.def("show", &hipo::dictionary::show); - - // schema.def_property_readonly("factory", nullptr); - - dictionary.def("__repr__", //TODO: Test this function in python - [](hipo::dictionary &d) { - std::vector schemaList = d.getSchemaList(); - std::string r("Dictionary :\n"); - for(int idx = 0; idx> structure(m, "Structure"); - structure.def(py::init<>()); - structure.def(py::init([](int size) { return new hipo::structure(size); })); - structure.def(py::init([](int __group, int __item, std::string &str) { return new hipo::structure(__group, __item, str); })); - - structure.def("allocate", &hipo::structure::allocate); - structure.def("getSize", &hipo::structure::getSize); - structure.def("getType", &hipo::structure::getType); - structure.def("getGroup", &hipo::structure::getGroup); - structure.def("getItem", &hipo::structure::getItem); - structure.def("init", &hipo::structure::init); - structure.def("initNoCopy", &hipo::structure::initNoCopy); - structure.def("getAddress", &hipo::structure::getAddress); - structure.def("show", &hipo::structure::show); - structure.def("setSize", &hipo::structure::setSize); - structure.def("getIntAt", &hipo::structure::getIntAt); - structure.def("getShortAt", &hipo::structure::getShortAt); - structure.def("getByteAt", &hipo::structure::getByteAt); - structure.def("getFloatAt", &hipo::structure::getFloatAt); - structure.def("getDoubleAt", &hipo::structure::getDoubleAt); - structure.def("getLongAt", &hipo::structure::getLongAt); - structure.def("getStringAt", &hipo::structure::getStringAt); - structure.def("putIntAt", &hipo::structure::putIntAt); - structure.def("putShortAt", &hipo::structure::putShortAt); - structure.def("putByteAt", &hipo::structure::putByteAt); - structure.def("putFloatAt", &hipo::structure::putFloatAt); - structure.def("putDoubleAt", &hipo::structure::putDoubleAt); - structure.def("putLongAt", &hipo::structure::putLongAt); - structure.def("putStringAt", &hipo::structure::putStringAt); - structure.def("notify", &hipo::structure::notify); - - structure.def("__repr__", //TODO: Test this function in python - [](hipo::structure &s) { - std::string r("Structure : group = "); r += std::to_string(s.getGroup())+" , item = "+std::to_string(s.getItem())+" , type = "+std::to_string(s.getType())+" , length = "+std::to_string(s.getSize())+"\n"; - return r; - } - ); - structure.def("__eq__", //TODO: Test this function in python - [](hipo::structure *s1, hipo::structure *s2) { return s1 == s2; } - ); - structure.def("__len__", //TODO: Test this function in python - [](hipo::structure &s) { return s.getSize(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO bank - py::class_> bank(m, "Bank"); - bank.def(py::init<>()); - bank.def(py::init([](const hipo::schema& __schema) { return new hipo::bank(__schema); })); - bank.def(py::init([](const hipo::schema& __schema, int __rows) { return new hipo::bank(__schema, __rows); })); - - bank.def("getSchema", &hipo::bank::getSchema); - bank.def("getRows", &hipo::bank::getRows); - bank.def("setRows", &hipo::bank::setRows); - - bank.def("getInt", py::detail::overload_cast_impl()(&hipo::bank::getInt, py::const_), "getInt"); - bank.def("getInt", py::detail::overload_cast_impl()(&hipo::bank::getInt, py::const_), "getInt"); - bank.def("getShort", py::detail::overload_cast_impl()(&hipo::bank::getShort, py::const_), "getShort"); - bank.def("getShort", py::detail::overload_cast_impl()(&hipo::bank::getShort, py::const_), "getShort"); - bank.def("getByte", py::detail::overload_cast_impl()(&hipo::bank::getByte, py::const_), "getByte"); - bank.def("getByte", py::detail::overload_cast_impl()(&hipo::bank::getByte, py::const_), "getByte"); - bank.def("getFloat", py::detail::overload_cast_impl()(&hipo::bank::getFloat, py::const_), "getFloat"); - bank.def("getFloat", py::detail::overload_cast_impl()(&hipo::bank::getFloat, py::const_), "getFloat"); - bank.def("getDouble", py::detail::overload_cast_impl()(&hipo::bank::getDouble, py::const_), "getDouble"); - bank.def("getDouble", py::detail::overload_cast_impl()(&hipo::bank::getDouble, py::const_), "getDouble"); - bank.def("getLong", py::detail::overload_cast_impl()(&hipo::bank::getLong, py::const_), "getLong"); - bank.def("getLong", py::detail::overload_cast_impl()(&hipo::bank::getLong, py::const_), "getLong"); - - // bank.def("getInts", py::detail::overload_cast_impl()(&hipo::bank::getInts, py::const_), "getInts"); - // bank.def("getShorts", py::detail::overload_cast_impl()(&hipo::bank::getShorts, py::const_), "getShorts"); - // bank.def("getBytes", py::detail::overload_cast_impl()(&hipo::bank::getBytes, py::const_), "getBytes"); - // bank.def("getFloats", py::detail::overload_cast_impl()(&hipo::bank::getFloats, py::const_), "getFloats"); - // bank.def("getDoubles", py::detail::overload_cast_impl()(&hipo::bank::getDoubles, py::const_), "getDoubles"); - // bank.def("getLongs", py::detail::overload_cast_impl()(&hipo::bank::getLongs, py::const_), "getLongs"); - - // bank.def("getDoubles", py::detail::overload_cast_impl()(&hipo::bank::getDoubles, py::const_), "getDoubles"); - - bank.def("putInt", py::detail::overload_cast_impl()(&hipo::bank::putInt), "putInt"); - bank.def("putInt", py::detail::overload_cast_impl()(&hipo::bank::putInt), "putInt"); - bank.def("putShort", py::detail::overload_cast_impl()(&hipo::bank::putShort), "putShort"); - bank.def("putShort", py::detail::overload_cast_impl()(&hipo::bank::putShort), "putShort"); - bank.def("putByte", py::detail::overload_cast_impl()(&hipo::bank::putByte), "putByte"); - bank.def("putByte", py::detail::overload_cast_impl()(&hipo::bank::putByte), "putByte"); - bank.def("putFloat", py::detail::overload_cast_impl()(&hipo::bank::putFloat), "putFloat"); - bank.def("putFloat", py::detail::overload_cast_impl()(&hipo::bank::putFloat), "putFloat"); - bank.def("putDouble", py::detail::overload_cast_impl()(&hipo::bank::putDouble), "putDouble"); - bank.def("putDouble", py::detail::overload_cast_impl()(&hipo::bank::putDouble), "putDouble"); - bank.def("putLong", py::detail::overload_cast_impl()(&hipo::bank::putLong), "putLong"); - bank.def("putLong", py::detail::overload_cast_impl()(&hipo::bank::putLong), "putLong"); - - // bank.def("putInts", py::detail::overload_cast_impl>()(&hipo::bank::putInts), "putInts"); - // bank.def("putShorts", py::detail::overload_cast_impl>()(&hipo::bank::putShorts), "putShorts"); - // bank.def("putBytes", py::detail::overload_cast_impl>()(&hipo::bank::putBytes), "putBytes"); - // bank.def("putFloats", py::detail::overload_cast_impl>()(&hipo::bank::putFloats), "putFloats"); - // bank.def("putDoubles", py::detail::overload_cast_impl>()(&hipo::bank::putDoubles), "putDoubles"); - // bank.def("putLongs", py::detail::overload_cast_impl>()(&hipo::bank::putLongs), "putLongs"); - - bank.def("getRowList", &hipo::bank::getRowList); - bank.def("getFullRowList", &hipo::bank::getFullRowList); - bank.def("getMutableRowList", &hipo::bank::getMutableRowList); - bank.def("getRowListLinked", &hipo::bank::getRowListLinked); - - bank.def("show", py::detail::overload_cast_impl<>()(&hipo::bank::show, py::const_), "show"); //NOTE: Need this syntax for const functions! - bank.def("show", py::detail::overload_cast_impl()(&hipo::bank::show, py::const_), "show"); //NOTE: Need this syntax for const functions! - bank.def("printValue", &hipo::bank::printValue); - bank.def("reset", &hipo::bank::reset); - bank.def("notify", &hipo::bank::notify); - - bank.def_property_readonly("bankSchema", &hipo::bank::getSchema); //NOTE: Not really necessary. - bank.def_property_readonly("bankRows", &hipo::bank::getRows); - - bank.def("__repr__", //TODO: Test this function in python - [](hipo::bank &b) { - std::string r("Bank : name = "); r += b.getSchema().getName()+" , rows = "+std::to_string(b.getRows())+"\n"; - for (int i = 0; i < b.getSchema().getEntries(); i++) { - std::string x("\t"); x += b.getSchema().getEntryName(i)+" : "; r += x; - for (int k = 0; k < b.getRows(); k++) { - if (b.getSchema().getEntryType(i) < 4) { - r += std::to_string(b.getInt(i,k))+" "; // std::string y("%8d ", b.getInt(i,k)); r += y; // %8d - } else { - if (b.getSchema().getEntryType(i)==4) { - r += std::to_string(b.getFloat(i,k))+" "; // std::string y("%8.5f ",b.getFloat(i,k)); r += y; // %8.5f - } - if (b.getSchema().getEntryType(i)==5) { - r += std::to_string(b.getDouble(i,k))+" "; // std::string y("%8.5f ",b.getDouble(i,k)); r += y; // %8.5f - } - if (b.getSchema().getEntryType(i)==8) { - r += std::to_string(b.getLong(i,k))+" "; // std::string y("%14ld ", b.getLong(i,k)); r += y; // %14ld - } - } // else - } // for(int k = 0; k < b.getRows(); k++) - r += "\n"; - } // for(int i = 0; i < b.getSchema().getEntries(); i++) - return r; - } // [](hipo::bank &b) - ); - bank.def("__eq__", //TODO: Test this function in python - [](hipo::bank *b1, hipo::bank *b2) { return b1 == b2; } - ); - bank.def("__len__", //TODO: Test this function in python - [](hipo::bank &b) { return b.getRows(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO event - py::class_> event(m, "Event"); - event.def(py::init<>()); - event.def(py::init([](int size) { return new hipo::event(size); })); - - event.def("show", &hipo::event::show); - event.def("init", static_cast&)>(&hipo::event::init), "init"); - event.def("init", static_cast(&hipo::event::init), "init"); - event.def("getStructure", static_cast(&hipo::event::getStructure), "getStructure"); - event.def("getStructure4", &hipo::event::getStructure4); - - event.def("getTag", &hipo::event::getTag); - event.def("setTag", &hipo::event::setTag); - event.def("getStructure", static_cast(&hipo::event::getStructure), "getStructure"); - event.def("read", static_cast(&hipo::event::read), "read"); - event.def("addStructure", &hipo::event::addStructure); - event.def("override", &hipo::event::override); - event.def("remove", static_cast(&hipo::event::remove), "remove"); - event.def("remove", static_cast(&hipo::event::remove), "remove"); - event.def("replace", &hipo::event::replace); - - event.def("add", &hipo::event::add); - event.def("get", static_cast(&hipo::event::get), "get"); - - event.def("getStructurePosition", static_cast (hipo::event::*)(int, int)>(&hipo::event::getStructurePosition), "getStructurePosition"); - event.def("getStructurePosition4", static_cast (hipo::event::*)(int, int)>(&hipo::event::getStructurePosition4), "getStructurePosition4"); - - event.def("getEventBuffer", &hipo::event::getEventBuffer); - event.def("getSize", &hipo::event::getSize); - event.def("reset", &hipo::event::reset); - event.def("write", &hipo::event::write); - event.def("read", static_cast(&hipo::event::read), "read"); - - event.def_static("getStructurePosition_static", static_cast (*)(const char*, int, int)>(&hipo::event::getStructurePosition), "getStructurePosition"); - event.def_static("getStructure_static", static_cast(&hipo::event::getStructure), "getStructure"); - event.def_static("get_static", static_cast(&hipo::event::get), "get"); - event.def_static("getStructureNoCopy", &hipo::event::getStructureNoCopy); - - // event.def_property_readonly("databuffer", nullptr); //NOTE: Not really necessary. - - event.def("__repr__", //TODO: Test this function in python - [](hipo::event &e) { - std::string r("Event : size = "); r += std::to_string(e.getSize())+"\n"; - int position = 16; - int eventSize = *(reinterpret_cast(&e.getEventBuffer()[4])); - while(position+8(&e.getEventBuffer()[position])); - uint8_t iid = *(reinterpret_cast(&e.getEventBuffer()[position+2])); - uint8_t type = *(reinterpret_cast(&e.getEventBuffer()[position+3])); - int length = *(reinterpret_cast(&e.getEventBuffer()[position+4])); - r += "\tgroup = "+std::to_string(gid)+" , item = "+std::to_string(iid)+" , type = "+std::to_string(type)+" , length = "+std::to_string(length)+"\n"; - position += (length + 8); - } - return r; - } // [](hipo::event &e) - ); - event.def("__eq__", //TODO: Test this function in python - [](hipo::event *e1, hipo::event *e2) { return e1 == e2; } - ); - event.def("__len__", //TODO: Test this function in python - [](hipo::event &e) { return e.getSize(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO readerIndex - py::class_ readerIndex(m, "ReaderIndex"); //NOTE: Can't use trampoline class because you get this error: "Cannot use an alias class with a non-polymorphic type" - readerIndex.def(py::init<>([]() { return new hipo::readerIndex(); })); - - readerIndex.def("canAdvance", &hipo::readerIndex::canAdvance); - readerIndex.def("advance", &hipo::readerIndex::advance); - - readerIndex.def("canAdvanceInRecord", &hipo::readerIndex::canAdvanceInRecord); - readerIndex.def("loadRecord", &hipo::readerIndex::loadRecord); - readerIndex.def("gotoEvent", &hipo::readerIndex::gotoEvent); - readerIndex.def("gotoRecord", &hipo::readerIndex::gotoRecord); - - readerIndex.def("getEventNumber", &hipo::readerIndex::getEventNumber); - readerIndex.def("getRecordNumber", &hipo::readerIndex::getRecordNumber); - readerIndex.def("getRecordEventNumber", &hipo::readerIndex::getRecordEventNumber); - readerIndex.def("getMaxEvents", &hipo::readerIndex::getMaxEvents); - readerIndex.def("addSize", &hipo::readerIndex::addSize); - readerIndex.def("addPosition", &hipo::readerIndex::addPosition); - readerIndex.def("getPosition", &hipo::readerIndex::getPosition); - - readerIndex.def("getNRecords", &hipo::readerIndex::getNRecords); - readerIndex.def("rewind", &hipo::readerIndex::rewind); - readerIndex.def("clear", &hipo::readerIndex::clear); - readerIndex.def("reset", &hipo::readerIndex::reset); - - // readerIndex.def_property_readonly("recordEvents", nullptr); //NOTE: Not really necessary. - // readerIndex.def_property_readonly("recordPosition", nullptr); - readerIndex.def_property_readonly("currentRecord", &hipo::readerIndex::getRecordNumber); - readerIndex.def_property_readonly("currentEvent", &hipo::readerIndex::getEventNumber); - readerIndex.def_property_readonly("currentRecordEvent", &hipo::readerIndex::getRecordEventNumber); - - readerIndex.def("__repr__", - [](hipo::readerIndex &r){ - std::string x("Reader Index : "); - x += "nrecords = "+std::to_string(r.getNRecords())+" , record number = "+std::to_string(r.getRecordNumber())+" , event number = "+std::to_string(r.getEventNumber())+"\n"; - return x; - } - ); - - readerIndex.def("__eq__", //TODO: Test this function in python - [](hipo::readerIndex *r1, hipo::readerIndex *r2) { return r1 == r2; } - ); - readerIndex.def("__len__", //TODO: Test this function in python - [](hipo::readerIndex &r) { return r.getNRecords(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO reader - py::class_ reader(m, "Reader"); - reader.def(py::init<>([]() { return new hipo::reader(); })); - reader.def(py::init([](const hipo::reader &r) { return new hipo::reader(r); })); - - reader.def("about", &hipo::reader::about); - reader.def("rewind", &hipo::reader::rewind); - reader.def("readDictionary", &hipo::reader::readDictionary); - reader.def("getStructure", &hipo::reader::getStructure); - reader.def("getStructureNoCopy", &hipo::reader::getStructureNoCopy); - - reader.def("readUserConfig", &hipo::reader::readUserConfig); - - reader.def("open", &hipo::reader::open); - reader.def("is_open", &hipo::reader::is_open); - reader.def("setTags", static_cast(&hipo::reader::setTags), "setTags"); - reader.def("setTags", static_cast)>(&hipo::reader::setTags), "setTags"); - reader.def("setVerbose", &hipo::reader::setVerbose); - - reader.def("hasNext", &hipo::reader::hasNext); - reader.def("next", static_cast(&hipo::reader::next), "next"); - reader.def("gotoEvent", &hipo::reader::gotoEvent); - reader.def("gotoRecord", &hipo::reader::gotoRecord); - reader.def("next", static_cast(&hipo::reader::next), "next"); - - reader.def("next", static_cast&)>(&hipo::reader::next), "next"); - reader.def("getBanks", &hipo::reader::getBanks); - - reader.def("read", &hipo::reader::read); - reader.def("printWarning", &hipo::reader::printWarning); - - reader.def("getNRecords", &hipo::reader::getNRecords); - reader.def("nextInRecord", &hipo::reader::nextInRecord); - reader.def("loadRecord", static_cast(&hipo::reader::loadRecord), "loadRecord"); - reader.def("loadRecord", static_cast(&hipo::reader::loadRecord), "loadRecord"); - reader.def("getEntries", &hipo::reader::getEntries); - reader.def("getInt", &hipo::reader::getInt); - reader.def("getFloat", &hipo::reader::getFloat); - - reader.def("__repr__", - [](hipo::reader &r){ - std::string x("Reader : "); - x += "nrecords = "+std::to_string(r.getNRecords())+" , entries = "+std::to_string(r.getEntries())+"\n"; - return x; - } - ); - reader.def("__eq__", //TODO: Test this function in python - [](hipo::reader *r1, hipo::reader *r2) { return r1 == r2; } - ); - reader.def("__len__", //TODO: Test this function in python - [](hipo::reader &r) { return r.getNRecords(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO data - py::class_ data(m, "Data"); - data.def(py::init<>()); - - data.def("setDataPtr", &hipo::data::setDataPtr); - data.def("setDataSize", &hipo::data::setDataSize); - data.def("setDataOffset", &hipo::data::setDataOffset); - data.def("setDataEndianness", &hipo::data::setDataEndianness); - - data.def("getEvioPtr", &hipo::data::getEvioPtr); - data.def("getEvioSize", &hipo::data::getEvioSize); - data.def("getDataPtr", &hipo::data::getDataPtr); - data.def("getDataSize", &hipo::data::getDataSize); - data.def("getDataOffset", &hipo::data::getDataOffset); - data.def("getDataEndianness", &hipo::data::getDataEndianness); - - data.def_property_readonly("data_ptr", &hipo::data::getDataPtr); - data.def_property_readonly("data_size", &hipo::data::getDataSize); - data.def_property_readonly("data_endianness", &hipo::data::getDataEndianness); - data.def_property_readonly("data_offset", &hipo::data::getDataOffset); - - data.def("__repr__", - [](hipo::data &d){ - std::string r("Data : "); - r += "size = "+std::to_string(d.getDataSize())+"\n"; - return r; - } - ); - data.def("__eq__", //TODO: Test this function in python - [](hipo::data *d1, hipo::data *d2) { return d1 == d2; } - ); - data.def("__len__", //TODO: Test this function in python - [](hipo::data &d) { return d.getDataSize(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO record - py::class_ record(m, "Record"); - record.def(py::init<>()); - - record.def("readRecord", static_cast(&hipo::record::readRecord), "readRecord"); - record.def("readRecord", static_cast(&hipo::record::readRecord), "readRecord"); - record.def("readRecord__", &hipo::record::readRecord__); - record.def("getEventCount", &hipo::record::getEventCount); - record.def("getRecordSizeCompressed", &hipo::record::getRecordSizeCompressed); - - record.def("readEvent", &hipo::record::readEvent); - record.def("readHipoEvent", &hipo::record::readHipoEvent); - record.def("getData", &hipo::record::getData); - - record.def("getReadBenchmark", &hipo::record::getReadBenchmark); - record.def("getUnzipBenchmark", &hipo::record::getUnzipBenchmark); - record.def("getIndexBenchmark", &hipo::record::getIndexBenchmark); - - record.def_property_readonly("readBenchmark", &hipo::record::getReadBenchmark); - record.def_property_readonly("unzipBenchmark", &hipo::record::getUnzipBenchmark); - record.def_property_readonly("indexBenchmark", &hipo::record::getIndexBenchmark); - - record.def("__repr__", - [](hipo::record &r){ - std::string x("Record : "); - x += "event count = "+std::to_string(r.getEventCount())+"\n"; - return x; - } - ); - record.def("__eq__", //TODO: Test this function in python - [](hipo::record *r1, hipo::record *r2) { return r1 == r2; } - ); - record.def("__len__", //TODO: Test this function in python - [](hipo::record &r) { return r.getEventCount(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO recordbuilder - py::class_> recordbuilder(m, "RecordBuilder"); - recordbuilder.def(py::init<>([]() { return new hipo::recordbuilder(); })); - recordbuilder.def(py::init<>([](int maxEvents, int maxLength) { return new hipo::recordbuilder(maxEvents,maxLength); })); - - recordbuilder.def("addEvent", static_cast(&hipo::recordbuilder::addEvent), "addEvent"); - recordbuilder.def("addEvent", static_cast&, int, int)>(&hipo::recordbuilder::addEvent), "addEvent"); - - recordbuilder.def("getUserWordOne", &hipo::recordbuilder::getUserWordOne); - recordbuilder.def("getUserWordTwo", &hipo::recordbuilder::getUserWordTwo); - recordbuilder.def("setUserWordOne", &hipo::recordbuilder::setUserWordOne); - recordbuilder.def("setUserWordTwo", &hipo::recordbuilder::setUserWordTwo); - - recordbuilder.def("getRecordSize", &hipo::recordbuilder::getRecordSize); - recordbuilder.def("getEntries", &hipo::recordbuilder::getEntries); - recordbuilder.def("getRecordBuffer", &hipo::recordbuilder::getRecordBuffer); - recordbuilder.def("reset", &hipo::recordbuilder::reset); - recordbuilder.def("build", &hipo::recordbuilder::build); - - recordbuilder.def_property_readonly("bufferUserWordOne", &hipo::recordbuilder::getUserWordOne); - recordbuilder.def_property_readonly("bufferUserWordTwo", &hipo::recordbuilder::getUserWordTwo); - - recordbuilder.def("__repr__", - [](hipo::recordbuilder &r){ - std::string x("Recordbuilder : "); - x += "entries = "+std::to_string(r.getEntries())+" , userWordOne = "+std::to_string(r.getUserWordOne())+" , userWordTwo = "+std::to_string(r.getUserWordTwo())+"\n"; - return x; + // Add functions to module + m.def("getInts", &_getInts); + m.def("getShorts", &_getShorts); + m.def("getBytes", &_getBytes); + m.def("getFloats", &_getFloats); + m.def("getDoubles", &_getDoubles); + m.def("getLongs", &_getLongs); + m.def("putInts", &_putInts); + m.def("putShorts", &_putShorts); + m.def("putBytes", &_putBytes); + m.def("putFloats", &_putFloats); + m.def("putDoubles", &_putDoubles); + m.def("putLongs", &_putLongs); + + // ADDED BEGIN + //----------------------------------------------------------------------// + // Bind HipoFileIterator + py::class_> hipofileiterator( + m, "HipoFileIterator"); + hipofileiterator.def(py::init([](std::vector &filenames, + std::vector &banknames, + int batchsize, std::vector &tags) { + return new HipoFileIterator(filenames, banknames, batchsize, tags); + })); + hipofileiterator.def("open", &HipoFileIterator::open); + hipofileiterator.def("reset", &HipoFileIterator::reset); + hipofileiterator.def("next", &HipoFileIterator::next); + hipofileiterator.def("gotoEvent", &HipoFileIterator::gotoEvent); + hipofileiterator.def( + "setTags", + &HipoFileIterator::setTags); // TODO: ADD OPTION IN INIT TO SET TAGS... + hipofileiterator.def("getType", &HipoFileIterator::getType); + hipofileiterator.def("getDoubles", &HipoFileIterator::getDoubles); + hipofileiterator.def("getFloats", &HipoFileIterator::getFloats); + hipofileiterator.def("getInts", &HipoFileIterator::getInts); + hipofileiterator.def("getLongs", &HipoFileIterator::getLongs); + hipofileiterator.def("getShorts", &HipoFileIterator::getShorts); + hipofileiterator.def("getBytes", &HipoFileIterator::getBytes); + + hipofileiterator.def_property_readonly("batchsize", + &HipoFileIterator::getBatchsize); + hipofileiterator.def_property_readonly("nbanks", + &HipoFileIterator::getNBanks); + hipofileiterator.def_property_readonly("index", &HipoFileIterator::getIndex); + hipofileiterator.def_property_readonly("filenames", + &HipoFileIterator::getFilenames); + hipofileiterator.def_property_readonly("banknames", + &HipoFileIterator::getBanknames); + hipofileiterator.def_property_readonly("banks", + &HipoFileIterator::getBanklist); + hipofileiterator.def_property_readonly("types", + &HipoFileIterator::getTypelist); + hipofileiterator.def_property_readonly("items", + &HipoFileIterator::getItemlist); + hipofileiterator.def_property_readonly("reader", + &HipoFileIterator::getReader); + hipofileiterator.def_property_readonly("dict", &HipoFileIterator::getDict); + hipofileiterator.def_property_readonly("event", &HipoFileIterator::getEvent); + hipofileiterator.def_property_readonly("tags", &HipoFileIterator::getTags); + + hipofileiterator.def("__repr__", // TODO: Test this function in python + [](HipoFileIterator &hfi) { + std::string r("HipoFileIterator"); + return r; + }); + hipofileiterator.def("__eq__", // TODO: Test this function in python + [](HipoFileIterator *hfi1, HipoFileIterator *hfi2) { + return hfi1 == hfi2; + }); + hipofileiterator.def("__next__", // TODO: Test this function in python + [](HipoFileIterator &hfi) { + hfi.reset(); + return hfi.next(); + }); + + //----------------------------------------------------------------------// + // Bind HIPO utils + py::class_ utils(m, "Utils"); + utils.def(py::init<>()); + + utils.def("tokenize", &hipo::utils::tokenize); + utils.def("substring", &hipo::utils::substring); + utils.def("findposition", &hipo::utils::findposition); + utils.def("ltrim", &hipo::utils::ltrim); + utils.def("rtrim", &hipo::utils::rtrim); + utils.def("trim", &hipo::utils::trim); + + utils.def("printLogo", &hipo::utils::printLogo); + + utils.def("getHeader", &hipo::utils::getHeader); + utils.def("getFileHeader", &hipo::utils::getFileHeader); + utils.def("getFileTrailer", &hipo::utils::getFileTrailer); + utils.def("getSConstruct", &hipo::utils::getSConstruct); + + utils.def("writeInt", &hipo::utils::writeInt); + utils.def("writeLong", &hipo::utils::writeLong); + utils.def("writeByte", &hipo::utils::writeByte); + + //----------------------------------------------------------------------// + // Bind HIPO benchmark + py::class_ benchmark(m, "Benchmark"); + benchmark.def(py::init<>()); + benchmark.def( + py::init([](const char *name) { return new hipo::benchmark(name); })); + benchmark.def(py::init([](int freq) { return new hipo::benchmark(freq); })); + + benchmark.def("setName", &hipo::benchmark::setName); + benchmark.def("resume", &hipo::benchmark::resume); + benchmark.def("pause", &hipo::benchmark::pause); + benchmark.def("getTime", &hipo::benchmark::getTime); + benchmark.def("getTimeSec", &hipo::benchmark::getTimeSec); + benchmark.def("getCounter", &hipo::benchmark::getCounter); + benchmark.def("show", &hipo::benchmark::show); + + //----------------------------------------------------------------------// + // Bind HIPO schema + py::class_> schema(m, "Schema"); + schema.def(py::init<>()); + schema.def(py::init([](const char *name, int __groupid, int __itemid) { + return new hipo::schema(name, __groupid, __itemid); + })); + schema.def( + py::init([](const hipo::schema &s) { return new hipo::schema(s); })); + + schema.def("parse", &hipo::schema::parse); + schema.def("getName", &hipo::schema::getName); + schema.def("getGroup", &hipo::schema::getGroup); + schema.def("getItem", &hipo::schema::getItem); + schema.def("getSizeForRows", &hipo::schema::getSizeForRows); + schema.def("getRowLength", &hipo::schema::getRowLength); + schema.def("getEntryOrder", &hipo::schema::getEntryOrder); + schema.def("exists", &hipo::schema::exists); + schema.def("getOffset", + py::detail::overload_cast_impl()( + &hipo::schema::getOffset, py::const_), + "getOffset"); // NOTE: Need this syntax for const functions! + schema.def("getOffset", + py::detail::overload_cast_impl()( + &hipo::schema::getOffset, py::const_), + "getOffset"); // NOTE: Need this syntax for const functions! + schema.def("getEntryType", + py::detail::overload_cast_impl()(&hipo::schema::getEntryType, + py::const_), + "getEntryType"); // NOTE: Need this syntax for const functions! + schema.def("getEntryType", + py::detail::overload_cast_impl()( + &hipo::schema::getEntryType, py::const_), + "getEntryType"); // NOTE: Need this syntax for const functions! + schema.def("getEntryName", &hipo::schema::getEntryName); + schema.def("getSchemaString", &hipo::schema::getSchemaString); + schema.def("getSchemaStringJson", &hipo::schema::getSchemaStringJson); + + schema.def_property_readonly("schemaEntriesMap", nullptr); + schema.def_property_readonly("schemaEntries", nullptr); + schema.def_property_readonly("groupid", &hipo::schema::getGroup); + schema.def_property_readonly("itemid", &hipo::schema::getItem); + schema.def_property_readonly("rowLength", &hipo::schema::getRowLength); + schema.def_property_readonly("warningCount", nullptr); + schema.def_property_readonly("schemaName", &hipo::schema::getName); + + schema.def("__repr__", // TODO: Test this function in python + [](hipo::schema &s) { + std::string r("Schema : name = " + s.getName() + + " , schemaString = " + s.getSchemaString() + "\n"); + return r; + }); + schema.def("__eq__", // TODO: Test this function in python + [](hipo::schema *s1, hipo::schema *s2) { return s1 == s2; }); + schema.def("__len__", // TODO: Test this function in python + [](hipo::schema &s) { return s.getRowLength(); }); + + //----------------------------------------------------------------------// + // Bind HIPO dictionary + py::class_> dictionary(m, "Dictionary"); + dictionary.def(py::init<>()); + + dictionary.def("getSchemaList", &hipo::dictionary::getSchemaList); + dictionary.def("addSchema", &hipo::dictionary::addSchema); + dictionary.def("hasSchema", &hipo::dictionary::hasSchema); + dictionary.def("getSchema", &hipo::dictionary::getSchema); + dictionary.def("parse", &hipo::dictionary::parse); + dictionary.def("show", &hipo::dictionary::show); + + // schema.def_property_readonly("factory", nullptr); + + dictionary.def("__repr__", // TODO: Test this function in python + [](hipo::dictionary &d) { + std::vector schemaList = d.getSchemaList(); + std::string r("Dictionary :\n"); + for (int idx = 0; idx < schemaList.size(); idx++) { + const char *buffer = schemaList[idx].c_str(); + hipo::schema s = d.getSchema(buffer); + r += "\tSchema : name = " + s.getName() + + " , schemaString = " + s.getSchemaString() + "\n"; + } + return r; + }); + dictionary.def( + "__eq__", // TODO: Test this function in python + [](hipo::dictionary *d1, hipo::dictionary *d2) { return d1 == d2; }); + dictionary.def("__len__", // TODO: Test this function in python + [](hipo::dictionary &d) { return d.getSchemaList().size(); }); + + //----------------------------------------------------------------------// + // Bind HIPO structure + py::class_> structure(m, "Structure"); + structure.def(py::init<>()); + structure.def(py::init([](int size) { return new hipo::structure(size); })); + structure.def(py::init([](int __group, int __item, std::string &str) { + return new hipo::structure(__group, __item, str); + })); + + structure.def("allocate", &hipo::structure::allocate); + structure.def("getSize", &hipo::structure::getSize); + structure.def("getType", &hipo::structure::getType); + structure.def("getGroup", &hipo::structure::getGroup); + structure.def("getItem", &hipo::structure::getItem); + structure.def("init", &hipo::structure::init); + structure.def("initNoCopy", &hipo::structure::initNoCopy); + structure.def("getAddress", &hipo::structure::getAddress); + structure.def("show", &hipo::structure::show); + structure.def("setSize", &hipo::structure::setSize); + structure.def("getIntAt", &hipo::structure::getIntAt); + structure.def("getShortAt", &hipo::structure::getShortAt); + structure.def("getByteAt", &hipo::structure::getByteAt); + structure.def("getFloatAt", &hipo::structure::getFloatAt); + structure.def("getDoubleAt", &hipo::structure::getDoubleAt); + structure.def("getLongAt", &hipo::structure::getLongAt); + structure.def("getStringAt", &hipo::structure::getStringAt); + structure.def("putIntAt", &hipo::structure::putIntAt); + structure.def("putShortAt", &hipo::structure::putShortAt); + structure.def("putByteAt", &hipo::structure::putByteAt); + structure.def("putFloatAt", &hipo::structure::putFloatAt); + structure.def("putDoubleAt", &hipo::structure::putDoubleAt); + structure.def("putLongAt", &hipo::structure::putLongAt); + structure.def("putStringAt", &hipo::structure::putStringAt); + structure.def("notify", &hipo::structure::notify); + + structure.def("__repr__", // TODO: Test this function in python + [](hipo::structure &s) { + std::string r("Structure : group = "); + r += std::to_string(s.getGroup()) + + " , item = " + std::to_string(s.getItem()) + + " , type = " + std::to_string(s.getType()) + + " , length = " + std::to_string(s.getSize()) + "\n"; + return r; + }); + structure.def( + "__eq__", // TODO: Test this function in python + [](hipo::structure *s1, hipo::structure *s2) { return s1 == s2; }); + structure.def("__len__", // TODO: Test this function in python + [](hipo::structure &s) { return s.getSize(); }); + + //----------------------------------------------------------------------// + // Bind HIPO bank + py::class_> bank(m, "Bank"); + bank.def(py::init<>()); + bank.def(py::init( + [](const hipo::schema &__schema) { return new hipo::bank(__schema); })); + bank.def(py::init([](const hipo::schema &__schema, int __rows) { + return new hipo::bank(__schema, __rows); + })); + + bank.def("getSchema", &hipo::bank::getSchema); + bank.def("getRows", &hipo::bank::getRows); + bank.def("setRows", &hipo::bank::setRows); + + bank.def("getInt", + py::detail::overload_cast_impl()(&hipo::bank::getInt, + py::const_), + "getInt"); + bank.def("getInt", + py::detail::overload_cast_impl()( + &hipo::bank::getInt, py::const_), + "getInt"); + bank.def("getShort", + py::detail::overload_cast_impl()(&hipo::bank::getShort, + py::const_), + "getShort"); + bank.def("getShort", + py::detail::overload_cast_impl()( + &hipo::bank::getShort, py::const_), + "getShort"); + bank.def("getByte", + py::detail::overload_cast_impl()(&hipo::bank::getByte, + py::const_), + "getByte"); + bank.def("getByte", + py::detail::overload_cast_impl()( + &hipo::bank::getByte, py::const_), + "getByte"); + bank.def("getFloat", + py::detail::overload_cast_impl()(&hipo::bank::getFloat, + py::const_), + "getFloat"); + bank.def("getFloat", + py::detail::overload_cast_impl()( + &hipo::bank::getFloat, py::const_), + "getFloat"); + bank.def("getDouble", + py::detail::overload_cast_impl()(&hipo::bank::getDouble, + py::const_), + "getDouble"); + bank.def("getDouble", + py::detail::overload_cast_impl()( + &hipo::bank::getDouble, py::const_), + "getDouble"); + bank.def("getLong", + py::detail::overload_cast_impl()(&hipo::bank::getLong, + py::const_), + "getLong"); + bank.def("getLong", + py::detail::overload_cast_impl()( + &hipo::bank::getLong, py::const_), + "getLong"); + + bank.def( + "putInt", + py::detail::overload_cast_impl()(&hipo::bank::putInt), + "putInt"); + bank.def("putInt", + py::detail::overload_cast_impl()( + &hipo::bank::putInt), + "putInt"); + bank.def("putShort", + py::detail::overload_cast_impl()( + &hipo::bank::putShort), + "putShort"); + bank.def("putShort", + py::detail::overload_cast_impl()( + &hipo::bank::putShort), + "putShort"); + bank.def( + "putByte", + py::detail::overload_cast_impl()(&hipo::bank::putByte), + "putByte"); + bank.def("putByte", + py::detail::overload_cast_impl()( + &hipo::bank::putByte), + "putByte"); + bank.def( + "putFloat", + py::detail::overload_cast_impl()(&hipo::bank::putFloat), + "putFloat"); + bank.def("putFloat", + py::detail::overload_cast_impl()( + &hipo::bank::putFloat), + "putFloat"); + bank.def("putDouble", + py::detail::overload_cast_impl()( + &hipo::bank::putDouble), + "putDouble"); + bank.def("putDouble", + py::detail::overload_cast_impl()( + &hipo::bank::putDouble), + "putDouble"); + bank.def( + "putLong", + py::detail::overload_cast_impl()(&hipo::bank::putLong), + "putLong"); + bank.def("putLong", + py::detail::overload_cast_impl()( + &hipo::bank::putLong), + "putLong"); + + bank.def("getRowList", &hipo::bank::getRowList); + bank.def("getFullRowList", &hipo::bank::getFullRowList); + bank.def("getMutableRowList", &hipo::bank::getMutableRowList); + bank.def("getRowListLinked", &hipo::bank::getRowListLinked); + + bank.def("show", + py::detail::overload_cast_impl<>()(&hipo::bank::show, py::const_), + "show"); // NOTE: Need this syntax for const functions! + bank.def( + "show", + py::detail::overload_cast_impl()(&hipo::bank::show, py::const_), + "show"); // NOTE: Need this syntax for const functions! + bank.def("printValue", &hipo::bank::printValue); + bank.def("reset", &hipo::bank::reset); + bank.def("notify", &hipo::bank::notify); + + bank.def_property_readonly( + "bankSchema", &hipo::bank::getSchema); // NOTE: Not really necessary. + bank.def_property_readonly("bankRows", &hipo::bank::getRows); + + bank.def( + "__repr__", // TODO: Test this function in python + [](hipo::bank &b) { + std::string r("Bank : name = "); + r += b.getSchema().getName() + + " , rows = " + std::to_string(b.getRows()) + "\n"; + for (int i = 0; i < b.getSchema().getEntries(); i++) { + std::string x("\t"); + x += b.getSchema().getEntryName(i) + " : "; + r += x; + for (int k = 0; k < b.getRows(); k++) { + if (b.getSchema().getEntryType(i) < 4) { + r += std::to_string(b.getInt(i, k)) + + " "; // std::string y("%8d ", b.getInt(i,k)); r += y; // %8d + } else { + if (b.getSchema().getEntryType(i) == 4) { + r += std::to_string(b.getFloat(i, k)) + + " "; // std::string y("%8.5f ",b.getFloat(i,k)); r += y; // + // %8.5f + } + if (b.getSchema().getEntryType(i) == 5) { + r += std::to_string(b.getDouble(i, k)) + + " "; // std::string y("%8.5f ",b.getDouble(i,k)); r += y; + // // %8.5f + } + if (b.getSchema().getEntryType(i) == 8) { + r += std::to_string(b.getLong(i, k)) + + " "; // std::string y("%14ld ", b.getLong(i,k)); r += y; // + // %14ld + } + } // else + } // for(int k = 0; k < b.getRows(); k++) + r += "\n"; + } // for(int i = 0; i < b.getSchema().getEntries(); i++) + return r; + } // [](hipo::bank &b) + ); + bank.def("__eq__", // TODO: Test this function in python + [](hipo::bank *b1, hipo::bank *b2) { return b1 == b2; }); + bank.def("__len__", // TODO: Test this function in python + [](hipo::bank &b) { return b.getRows(); }); + + //----------------------------------------------------------------------// + // Bind HIPO event + py::class_> event(m, "Event"); + event.def(py::init<>()); + event.def(py::init([](int size) { return new hipo::event(size); })); + + event.def("show", &hipo::event::show); + event.def("init", + static_cast &)>( + &hipo::event::init), + "init"); + event.def( + "init", + static_cast(&hipo::event::init), + "init"); + event.def("getStructure", + static_cast( + &hipo::event::getStructure), + "getStructure"); + event.def("getStructure4", &hipo::event::getStructure4); + + event.def("getTag", &hipo::event::getTag); + event.def("setTag", &hipo::event::setTag); + event.def("getStructure", + static_cast( + &hipo::event::getStructure), + "getStructure"); + event.def( + "read", + static_cast(&hipo::event::read), + "read"); + event.def("addStructure", &hipo::event::addStructure); + event.def("override", &hipo::event::override); + event.def( + "remove", + static_cast(&hipo::event::remove), + "remove"); + event.def("remove", + static_cast(&hipo::event::remove), + "remove"); + event.def("replace", &hipo::event::replace); + + event.def("add", &hipo::event::add); + event.def("get", + static_cast( + &hipo::event::get), + "get"); + + event.def("getStructurePosition", + static_cast (hipo::event::*)(int, int)>( + &hipo::event::getStructurePosition), + "getStructurePosition"); + event.def("getStructurePosition4", + static_cast (hipo::event::*)(int, int)>( + &hipo::event::getStructurePosition4), + "getStructurePosition4"); + + event.def("getEventBuffer", &hipo::event::getEventBuffer); + event.def("getSize", &hipo::event::getSize); + event.def("reset", &hipo::event::reset); + event.def("write", &hipo::event::write); + event.def("read", + static_cast( + &hipo::event::read), + "read"); + + event.def_static("getStructurePosition_static", + static_cast (*)(const char *, int, int)>( + &hipo::event::getStructurePosition), + "getStructurePosition"); + event.def_static( + "getStructure_static", + static_cast( + &hipo::event::getStructure), + "getStructure"); + event.def_static("get_static", + static_cast( + &hipo::event::get), + "get"); + event.def_static("getStructureNoCopy", &hipo::event::getStructureNoCopy); + + // event.def_property_readonly("databuffer", nullptr); //NOTE: Not really + // necessary. + + event.def( + "__repr__", // TODO: Test this function in python + [](hipo::event &e) { + std::string r("Event : size = "); + r += std::to_string(e.getSize()) + "\n"; + int position = 16; + int eventSize = *(reinterpret_cast(&e.getEventBuffer()[4])); + while (position + 8 < eventSize) { + uint16_t gid = + *(reinterpret_cast(&e.getEventBuffer()[position])); + uint8_t iid = + *(reinterpret_cast(&e.getEventBuffer()[position + 2])); + uint8_t type = + *(reinterpret_cast(&e.getEventBuffer()[position + 3])); + int length = + *(reinterpret_cast(&e.getEventBuffer()[position + 4])); + r += "\tgroup = " + std::to_string(gid) + + " , item = " + std::to_string(iid) + + " , type = " + std::to_string(type) + + " , length = " + std::to_string(length) + "\n"; + position += (length + 8); } - ); - recordbuilder.def("__eq__", //TODO: Test this function in python - [](hipo::recordbuilder *r1, hipo::recordbuilder *r2) { return r1 == r2; } - ); - recordbuilder.def("__len__", //TODO: Test this function in python - [](hipo::recordbuilder &r) { return r.getEntries(); } - ); - - //----------------------------------------------------------------------// - // Bind HIPO writer - py::class_> writer(m, "Writer"); - writer.def(py::init<>([]() { return new hipo::writer(); })); - - writer.def("addEvent", static_cast(&hipo::writer::addEvent), "addEvent"); - writer.def("addEvent", static_cast&, int)>(&hipo::writer::addEvent), "addEvent"); - writer.def("writeRecord", &hipo::writer::writeRecord); - writer.def("open", &hipo::writer::open); - writer.def("close", &hipo::writer::close); - writer.def("showSummary", &hipo::writer::showSummary); - writer.def("addDictionary", &hipo::writer::addDictionary); - writer.def("getDictionary", &hipo::writer::getDictionary); - writer.def("setUserIntegerOne", &hipo::writer::setUserIntegerOne); - writer.def("setUserIntegerTwo", &hipo::writer::setUserIntegerTwo); - writer.def("flush", &hipo::writer::flush); - - writer.def_property_readonly("writerDictionary", &hipo::writer::getDictionary); - - writer.def("__repr__", - [](hipo::writer &w){ - std::string r("Writer : "); - return r+"\n"; - } - ); - writer.def("__eq__", //TODO: Test this function in python - [](hipo::writer *w1, hipo::writer *w2) { return w1 == w2; } - ); - - //----------------------------------------------------------------------// - // Documentation - - // m.doc() = R"pbdoc( - // HipopyBind plugin - // ----------------- - - // .. currentmodule:: hipopybind - - // .. autosummary:: - // :toctree: _generate - - // add - // subtract - // )pbdoc"; - - // m.def("add", &add, R"pbdoc( - // Add two numbers - - // Some other explanation about the add function. - // )pbdoc"); - - // m.def("subtract", [](int i, int j) { return i - j; }, R"pbdoc( - // Subtract two numbers - - // Some other explanation about the subtract function. - // )pbdoc"); + return r; + } // [](hipo::event &e) + ); + event.def("__eq__", // TODO: Test this function in python + [](hipo::event *e1, hipo::event *e2) { return e1 == e2; }); + event.def("__len__", // TODO: Test this function in python + [](hipo::event &e) { return e.getSize(); }); + + //----------------------------------------------------------------------// + // Bind HIPO readerIndex + py::class_ readerIndex( + m, "ReaderIndex"); // NOTE: Can't use trampoline class because you get + // this error: "Cannot use an alias class with a + // non-polymorphic type" + readerIndex.def(py::init<>([]() { return new hipo::readerIndex(); })); + + readerIndex.def("canAdvance", &hipo::readerIndex::canAdvance); + readerIndex.def("advance", &hipo::readerIndex::advance); + + readerIndex.def("canAdvanceInRecord", &hipo::readerIndex::canAdvanceInRecord); + readerIndex.def("loadRecord", &hipo::readerIndex::loadRecord); + readerIndex.def("gotoEvent", &hipo::readerIndex::gotoEvent); + readerIndex.def("gotoRecord", &hipo::readerIndex::gotoRecord); + + readerIndex.def("getEventNumber", &hipo::readerIndex::getEventNumber); + readerIndex.def("getRecordNumber", &hipo::readerIndex::getRecordNumber); + readerIndex.def("getRecordEventNumber", + &hipo::readerIndex::getRecordEventNumber); + readerIndex.def("getMaxEvents", &hipo::readerIndex::getMaxEvents); + readerIndex.def("addSize", &hipo::readerIndex::addSize); + readerIndex.def("addPosition", &hipo::readerIndex::addPosition); + readerIndex.def("getPosition", &hipo::readerIndex::getPosition); + + readerIndex.def("getNRecords", &hipo::readerIndex::getNRecords); + readerIndex.def("rewind", &hipo::readerIndex::rewind); + readerIndex.def("clear", &hipo::readerIndex::clear); + readerIndex.def("reset", &hipo::readerIndex::reset); + + // readerIndex.def_property_readonly("recordEvents", nullptr); //NOTE: Not + // really necessary. readerIndex.def_property_readonly("recordPosition", + // nullptr); + readerIndex.def_property_readonly("currentRecord", + &hipo::readerIndex::getRecordNumber); + readerIndex.def_property_readonly("currentEvent", + &hipo::readerIndex::getEventNumber); + readerIndex.def_property_readonly("currentRecordEvent", + &hipo::readerIndex::getRecordEventNumber); + + readerIndex.def("__repr__", [](hipo::readerIndex &r) { + std::string x("Reader Index : "); + x += "nrecords = " + std::to_string(r.getNRecords()) + + " , record number = " + std::to_string(r.getRecordNumber()) + + " , event number = " + std::to_string(r.getEventNumber()) + "\n"; + return x; + }); + + readerIndex.def( + "__eq__", // TODO: Test this function in python + [](hipo::readerIndex *r1, hipo::readerIndex *r2) { return r1 == r2; }); + readerIndex.def("__len__", // TODO: Test this function in python + [](hipo::readerIndex &r) { return r.getNRecords(); }); + + //----------------------------------------------------------------------// + // Bind HIPO reader + py::class_ reader(m, "Reader"); + reader.def(py::init<>([]() { return new hipo::reader(); })); + reader.def( + py::init([](const hipo::reader &r) { return new hipo::reader(r); })); + + reader.def("about", &hipo::reader::about); + reader.def("rewind", &hipo::reader::rewind); + reader.def("readDictionary", &hipo::reader::readDictionary); + reader.def("getStructure", &hipo::reader::getStructure); + reader.def("getStructureNoCopy", &hipo::reader::getStructureNoCopy); + + reader.def("readUserConfig", &hipo::reader::readUserConfig); + + reader.def("open", &hipo::reader::open); + reader.def("is_open", &hipo::reader::is_open); + reader.def("setTags", + static_cast(&hipo::reader::setTags), + "setTags"); + reader.def("setTags", + static_cast)>( + &hipo::reader::setTags), + "setTags"); + reader.def("setVerbose", &hipo::reader::setVerbose); + + reader.def("hasNext", &hipo::reader::hasNext); + reader.def("next", static_cast(&hipo::reader::next), + "next"); + reader.def("gotoEvent", &hipo::reader::gotoEvent); + reader.def("gotoRecord", &hipo::reader::gotoRecord); + reader.def( + "next", + static_cast(&hipo::reader::next), + "next"); + + reader.def("next", + static_cast &)>( + &hipo::reader::next), + "next"); + reader.def("getBanks", &hipo::reader::getBanks); + + reader.def("read", &hipo::reader::read); + reader.def("printWarning", &hipo::reader::printWarning); + + reader.def("getNRecords", &hipo::reader::getNRecords); + reader.def("nextInRecord", &hipo::reader::nextInRecord); + reader.def( + "loadRecord", + static_cast(&hipo::reader::loadRecord), + "loadRecord"); + reader.def("loadRecord", + static_cast( + &hipo::reader::loadRecord), + "loadRecord"); + reader.def("getEntries", &hipo::reader::getEntries); + reader.def("getInt", &hipo::reader::getInt); + reader.def("getFloat", &hipo::reader::getFloat); + + reader.def("__repr__", [](hipo::reader &r) { + std::string x("Reader : "); + x += "nrecords = " + std::to_string(r.getNRecords()) + + " , entries = " + std::to_string(r.getEntries()) + "\n"; + return x; + }); + reader.def("__eq__", // TODO: Test this function in python + [](hipo::reader *r1, hipo::reader *r2) { return r1 == r2; }); + reader.def("__len__", // TODO: Test this function in python + [](hipo::reader &r) { return r.getNRecords(); }); + + //----------------------------------------------------------------------// + // Bind HIPO data + py::class_ data(m, "Data"); + data.def(py::init<>()); + + data.def("setDataPtr", &hipo::data::setDataPtr); + data.def("setDataSize", &hipo::data::setDataSize); + data.def("setDataOffset", &hipo::data::setDataOffset); + data.def("setDataEndianness", &hipo::data::setDataEndianness); + + data.def("getEvioPtr", &hipo::data::getEvioPtr); + data.def("getEvioSize", &hipo::data::getEvioSize); + data.def("getDataPtr", &hipo::data::getDataPtr); + data.def("getDataSize", &hipo::data::getDataSize); + data.def("getDataOffset", &hipo::data::getDataOffset); + data.def("getDataEndianness", &hipo::data::getDataEndianness); + + data.def_property_readonly("data_ptr", &hipo::data::getDataPtr); + data.def_property_readonly("data_size", &hipo::data::getDataSize); + data.def_property_readonly("data_endianness", &hipo::data::getDataEndianness); + data.def_property_readonly("data_offset", &hipo::data::getDataOffset); + + data.def("__repr__", [](hipo::data &d) { + std::string r("Data : "); + r += "size = " + std::to_string(d.getDataSize()) + "\n"; + return r; + }); + data.def("__eq__", // TODO: Test this function in python + [](hipo::data *d1, hipo::data *d2) { return d1 == d2; }); + data.def("__len__", // TODO: Test this function in python + [](hipo::data &d) { return d.getDataSize(); }); + + //----------------------------------------------------------------------// + // Bind HIPO record + py::class_ record(m, "Record"); + record.def(py::init<>()); + + record.def("readRecord", + static_cast( + &hipo::record::readRecord), + "readRecord"); + record.def( + "readRecord", + static_cast( + &hipo::record::readRecord), + "readRecord"); + record.def("readRecord__", &hipo::record::readRecord__); + record.def("getEventCount", &hipo::record::getEventCount); + record.def("getRecordSizeCompressed", &hipo::record::getRecordSizeCompressed); + + record.def("readEvent", &hipo::record::readEvent); + record.def("readHipoEvent", &hipo::record::readHipoEvent); + record.def("getData", &hipo::record::getData); + + record.def("getReadBenchmark", &hipo::record::getReadBenchmark); + record.def("getUnzipBenchmark", &hipo::record::getUnzipBenchmark); + record.def("getIndexBenchmark", &hipo::record::getIndexBenchmark); + + record.def_property_readonly("readBenchmark", + &hipo::record::getReadBenchmark); + record.def_property_readonly("unzipBenchmark", + &hipo::record::getUnzipBenchmark); + record.def_property_readonly("indexBenchmark", + &hipo::record::getIndexBenchmark); + + record.def("__repr__", [](hipo::record &r) { + std::string x("Record : "); + x += "event count = " + std::to_string(r.getEventCount()) + "\n"; + return x; + }); + record.def("__eq__", // TODO: Test this function in python + [](hipo::record *r1, hipo::record *r2) { return r1 == r2; }); + record.def("__len__", // TODO: Test this function in python + [](hipo::record &r) { return r.getEventCount(); }); + + //----------------------------------------------------------------------// + // Bind HIPO recordbuilder + py::class_> recordbuilder( + m, "RecordBuilder"); + recordbuilder.def(py::init<>([]() { return new hipo::recordbuilder(); })); + recordbuilder.def(py::init<>([](int maxEvents, int maxLength) { + return new hipo::recordbuilder(maxEvents, maxLength); + })); + + recordbuilder.def("addEvent", + static_cast( + &hipo::recordbuilder::addEvent), + "addEvent"); + recordbuilder.def( + "addEvent", + static_cast &, int, int)>( + &hipo::recordbuilder::addEvent), + "addEvent"); + + recordbuilder.def("getUserWordOne", &hipo::recordbuilder::getUserWordOne); + recordbuilder.def("getUserWordTwo", &hipo::recordbuilder::getUserWordTwo); + recordbuilder.def("setUserWordOne", &hipo::recordbuilder::setUserWordOne); + recordbuilder.def("setUserWordTwo", &hipo::recordbuilder::setUserWordTwo); + + recordbuilder.def("getRecordSize", &hipo::recordbuilder::getRecordSize); + recordbuilder.def("getEntries", &hipo::recordbuilder::getEntries); + recordbuilder.def("getRecordBuffer", &hipo::recordbuilder::getRecordBuffer); + recordbuilder.def("reset", &hipo::recordbuilder::reset); + recordbuilder.def("build", &hipo::recordbuilder::build); + + recordbuilder.def_property_readonly("bufferUserWordOne", + &hipo::recordbuilder::getUserWordOne); + recordbuilder.def_property_readonly("bufferUserWordTwo", + &hipo::recordbuilder::getUserWordTwo); + + recordbuilder.def("__repr__", [](hipo::recordbuilder &r) { + std::string x("Recordbuilder : "); + x += "entries = " + std::to_string(r.getEntries()) + + " , userWordOne = " + std::to_string(r.getUserWordOne()) + + " , userWordTwo = " + std::to_string(r.getUserWordTwo()) + "\n"; + return x; + }); + recordbuilder.def("__eq__", // TODO: Test this function in python + [](hipo::recordbuilder *r1, hipo::recordbuilder *r2) { + return r1 == r2; + }); + recordbuilder.def("__len__", // TODO: Test this function in python + [](hipo::recordbuilder &r) { return r.getEntries(); }); + + //----------------------------------------------------------------------// + // Bind HIPO writer + py::class_> writer(m, "Writer"); + writer.def(py::init<>([]() { return new hipo::writer(); })); + + writer.def("addEvent", + static_cast( + &hipo::writer::addEvent), + "addEvent"); + writer.def("addEvent", + static_cast &, int)>( + &hipo::writer::addEvent), + "addEvent"); + writer.def("writeRecord", &hipo::writer::writeRecord); + writer.def("open", &hipo::writer::open); + writer.def("close", &hipo::writer::close); + writer.def("showSummary", &hipo::writer::showSummary); + writer.def("addDictionary", &hipo::writer::addDictionary); + writer.def("getDictionary", &hipo::writer::getDictionary); + writer.def("setUserIntegerOne", &hipo::writer::setUserIntegerOne); + writer.def("setUserIntegerTwo", &hipo::writer::setUserIntegerTwo); + writer.def("flush", &hipo::writer::flush); + + writer.def_property_readonly("writerDictionary", + &hipo::writer::getDictionary); + + writer.def("__repr__", [](hipo::writer &w) { + std::string r("Writer : "); + return r + "\n"; + }); + writer.def("__eq__", // TODO: Test this function in python + [](hipo::writer *w1, hipo::writer *w2) { return w1 == w2; }); + + //----------------------------------------------------------------------// + // Versioning #ifdef VERSION_INFO - m.attr("__version__") = MACRO_STRINGIFY(VERSION_INFO); + m.attr("__version__") = MACRO_STRINGIFY(VERSION_INFO); #else - m.attr("__version__") = "dev"; + m.attr("__version__") = "dev"; #endif -} //PYBIND11_MODULE +} // PYBIND11_MODULE From 4e51a3141cb1d306a8ca60b1929a7225dc920e1c Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 00:14:57 -0400 Subject: [PATCH 024/113] fix: Update dependencies. --- poetry.lock | 554 +------------------------------------------------ pyproject.toml | 2 - 2 files changed, 2 insertions(+), 554 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3b346d3..438800f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,220 +1,5 @@ # This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. -[[package]] -name = "certifi" -version = "2025.10.5" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, - {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, -] - -[[package]] -name = "cffi" -version = "1.17.1" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.4.4" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, - {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, - {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, -] - [[package]] name = "clang-format" version = "17.0.6" @@ -253,110 +38,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "coverage" -version = "7.6.1" -description = "Code coverage measurement for Python" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, -] - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - -[package.extras] -toml = ["tomli ; python_full_version <= \"3.11.0a6\""] - -[[package]] -name = "cpp-linter" -version = "1.10.6" -description = "Run clang-format and clang-tidy on a batch of files." -optional = false -python-versions = "*" -groups = ["dev"] -files = [ - {file = "cpp_linter-1.10.6-py3-none-any.whl", hash = "sha256:bbe566a8d4eeb3dfc11a841f5570f3d465e60734c7968ef85bee27c7f407be9d"}, -] - -[package.dependencies] -pygit2 = "*" -pyyaml = "*" -requests = "*" - [[package]] name = "exceptiongroup" version = "1.3.0" @@ -376,21 +57,6 @@ typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} [package.extras] test = ["pytest (>=6)"] -[[package]] -name = "idna" -version = "3.11" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, - {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - [[package]] name = "iniconfig" version = "2.0.0" @@ -431,58 +97,6 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pycparser" -version = "2.23" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, - {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, -] - -[[package]] -name = "pygit2" -version = "1.13.3" -description = "Python bindings for libgit2." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pygit2-1.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a3053850e29c1e102b1ab759d90b0dcc6402d7a434cbe810cfd2792294cf0ba6"}, - {file = "pygit2-1.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d2461db082c27231e2565e24e7ec3d6a60c7ceea5cda7364cb6eb81a6aedebd"}, - {file = "pygit2-1.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2216dc34edbe44e37c5cabc5f1530266445b87c66038fc8b3e0e7be64b3d4edb"}, - {file = "pygit2-1.13.3-cp310-cp310-win32.whl", hash = "sha256:5bc8c173ead087a4200e8763fad92105b4c9d40d03e007b9d9bbe47793716d31"}, - {file = "pygit2-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:c305adf3a86e02db8bcd89bb92e33e896a2ff36f58a5ad7ff15675491ab6a751"}, - {file = "pygit2-1.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8de720ca137624d8f98c8b8d57cdb1e461034adf3e158762ee5c3085620c8075"}, - {file = "pygit2-1.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a85521b8e218afd4111d5bd4e106d77ffaac7ecd9a1ed8c1eea9f8d9568d287"}, - {file = "pygit2-1.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c5cb78cc0a88f5cb2910e85996f33fcac99994251117f00f2e344f84d2616a"}, - {file = "pygit2-1.13.3-cp311-cp311-win32.whl", hash = "sha256:81686e3e06132f23eab32c6718c21930e8adda795c2ca76617f7562bff7b6b66"}, - {file = "pygit2-1.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:93cc7ffb403688c2ec3e169096f34b2b99bc709adc54487e9d11165cfd070948"}, - {file = "pygit2-1.13.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:07b17f766c88ce1d05d264b5819e75ad261f3b60e33e4105a71f02467d0f6d39"}, - {file = "pygit2-1.13.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81bfe9ca394cdc896b632f18cd5f9c656a5f6c03c61deb1570b9081f2406776b"}, - {file = "pygit2-1.13.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c83e6e5ac357a9e87698c1eb25f430846f208bce12362d2209e7c9ac214e00c"}, - {file = "pygit2-1.13.3-cp312-cp312-win32.whl", hash = "sha256:de481a2cee7ef98143109bd9d2b30690022aeb8ba849feeba082a3b48a53c214"}, - {file = "pygit2-1.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:0353b55f8bed1742dab15083ee9ee508ed91feb5c2563e2a612af277317030c6"}, - {file = "pygit2-1.13.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:60152bb30bc2ab880d3c82f113be33aac7ced571d1148c51720ccefff9dfc9ce"}, - {file = "pygit2-1.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcf827ebe392e2181a50ebaf724947e30a1da076a74d8a6f9cec784158faced1"}, - {file = "pygit2-1.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73cb821acc5cc8ad62a96154d030ff47127073b56f71157e7c65b2e7ebb4d52f"}, - {file = "pygit2-1.13.3-cp38-cp38-win32.whl", hash = "sha256:112c4efd421c3c8b4bb4406d3cd4a3a6a18a925c1f8b08d8a6dd0b591c6c6049"}, - {file = "pygit2-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:21f73fd2863b6b21b4fbfed11a42af0ac1036472bb3716944b42a9719beaf07e"}, - {file = "pygit2-1.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e94f2598bdf68340609bb21fd4d21213812913b40b73e5fcba67f4fb01f4fba4"}, - {file = "pygit2-1.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5846aadb7b72802b3e4cb981f956965e92bc1692e7514ff4491bd7e24b20b358"}, - {file = "pygit2-1.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2823d097b103740d52e600ef2079e23966583edbde08ac122279f1ab3b2c3979"}, - {file = "pygit2-1.13.3-cp39-cp39-win32.whl", hash = "sha256:72fda35f88a3f5549eb9683c47ac73a6b674df943fc2490d93d539b46f518cbd"}, - {file = "pygit2-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:2087fd130181e4ba6b8599fcd406920781555a52a3f142bd1dec4de21b9c5792"}, - {file = "pygit2-1.13.3.tar.gz", hash = "sha256:0257c626011e4afb99bdb20875443f706f84201d4c92637f02215b98eac13ded"}, -] - -[package.dependencies] -cffi = ">=1.16.0" -setuptools = {version = "*", markers = "python_version >= \"3.12\""} - [[package]] name = "pytest" version = "8.3.5" @@ -506,152 +120,6 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] -[[package]] -name = "pytest-cov" -version = "5.0.0" -description = "Pytest plugin for measuring coverage." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, - {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, -] - -[package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} -pytest = ">=4.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] - -[[package]] -name = "pyyaml" -version = "6.0.3" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, - {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, - {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, - {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, - {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, - {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, - {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, - {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, - {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, - {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, - {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, - {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, - {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, - {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, - {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, - {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, - {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, - {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, - {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, - {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, - {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, - {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, - {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, - {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, - {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, - {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, - {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, - {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, - {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, - {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, - {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, - {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, - {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, - {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, - {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, - {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, - {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, - {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, - {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, - {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, - {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, - {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, - {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, - {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, - {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, - {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, - {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, - {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, - {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, - {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, - {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, - {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, - {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, - {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, - {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, - {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, - {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, - {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, - {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, - {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, - {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, - {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, - {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, - {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, -] - -[[package]] -name = "requests" -version = "2.32.4" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset_normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "setuptools" -version = "80.9.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version >= \"3.12\"" -files = [ - {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, - {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] - [[package]] name = "tomli" version = "2.0.1" @@ -659,7 +127,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_full_version <= \"3.11.0a6\"" +markers = "python_version < \"3.11\"" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, @@ -678,25 +146,7 @@ files = [ {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] -[[package]] -name = "urllib3" -version = "2.2.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - [metadata] lock-version = "2.1" python-versions = ">=3.8" -content-hash = "87e3408d5b9af27bd9ddb1dfbad44b91eabf3f8984f9c25b4a1f18f844811673" +content-hash = "0240ed4fa88a3163f3391b975c7899838bcaa81354b220d523214f53b6dd49b9" diff --git a/pyproject.toml b/pyproject.toml index 1a031ce..7c9d695 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,4 @@ name = "hipopybind" [tool.poetry.group.dev.dependencies] pytest = "^8.0.0" -pytest-cov = "^5.0.0" # optional, for coverage reports clang-format = "^17.0.0" # For local C++ formatting -cpp-linter = "^1.10.0" # For local C++ linting From b0b501649c4510100b1f34bd94046294a49c8bee Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 00:30:25 -0400 Subject: [PATCH 025/113] fix: Remove comment causing formatting error. --- src/hipopybind_module.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hipopybind_module.cpp b/src/hipopybind_module.cpp index cd2fb54..619bc06 100644 --- a/src/hipopybind_module.cpp +++ b/src/hipopybind_module.cpp @@ -1025,7 +1025,7 @@ PYBIND11_MODULE(_core, m) { // %14ld } } // else - } // for(int k = 0; k < b.getRows(); k++) + } r += "\n"; } // for(int i = 0; i < b.getSchema().getEntries(); i++) return r; From e0aad8a7183c35177fe8cf5f0330b45650754045 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 01:36:15 -0400 Subject: [PATCH 026/113] fix: Update dependencies. --- poetry.lock | 70 ++++++++++++++++++++++++++++++++++++++++++++++---- pyproject.toml | 5 ++-- 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 438800f..72e27e5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -69,16 +69,57 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "meson" +version = "1.9.1" +description = "A high performance build system" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "meson-1.9.1-py3-none-any.whl", hash = "sha256:f824ab770c041a202f532f69e114c971918ed2daff7ea56583d80642564598d0"}, +] + +[package.extras] +ninja = ["ninja (>=1.8.2)"] +progress = ["tqdm"] +typing = ["mypy", "typing_extensions ; python_version < \"3.8\""] + +[[package]] +name = "meson-python" +version = "0.18.0" +description = "Meson Python build backend (PEP 517)" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "meson_python-0.18.0-py3-none-any.whl", hash = "sha256:3b0fe051551cc238f5febb873247c0949cd60ded556efa130aa57021804868e2"}, + {file = "meson_python-0.18.0.tar.gz", hash = "sha256:c56a99ec9df669a40662fe46960321af6e4b14106c14db228709c1628e23848d"}, +] + +[package.dependencies] +meson = [ + {version = ">=0.64.0", markers = "python_version < \"3.12\""}, + {version = ">=1.2.3", markers = "python_version >= \"3.12\""}, +] +packaging = ">=23.2" +pyproject-metadata = ">=0.9.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2024.08.06)", "sphinx (>=8.1.0,<8.2.0)", "sphinx-copybutton (>=0.5.0)", "sphinx-design (>=0.1.0)", "sphinxext-opengraph (>=0.7.0)"] +test = ["build", "cython (>=3.0.3)", "pytest (>=6.0)", "pytest-cov[toml]", "pytest-mock", "typing-extensions (>=3.7.4) ; python_version < \"3.11\"", "wheel"] + [[package]] name = "packaging" -version = "24.0" +version = "25.0" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] @@ -97,6 +138,25 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pyproject-metadata" +version = "0.9.1" +description = "PEP 621 metadata parsing" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "pyproject_metadata-0.9.1-py3-none-any.whl", hash = "sha256:ee5efde548c3ed9b75a354fc319d5afd25e9585fa918a34f62f904cc731973ad"}, + {file = "pyproject_metadata-0.9.1.tar.gz", hash = "sha256:b8b2253dd1b7062b78cf949a115f02ba7fa4114aabe63fa10528e9e1a954a816"}, +] + +[package.dependencies] +packaging = ">=19.0" + +[package.extras] +docs = ["furo (>=2023.9.10)", "myst-parser", "sphinx (>=7.0)", "sphinx-autodoc-typehints", "sphinx-autodoc-typehints (>=1.10.0)"] +test = ["exceptiongroup ; python_version < \"3.11\"", "pytest (>=6.2.4)", "pytest-cov[toml] (>=2)", "tomli (>=1.0.0) ; python_version < \"3.11\""] + [[package]] name = "pytest" version = "8.3.5" @@ -149,4 +209,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = ">=3.8" -content-hash = "0240ed4fa88a3163f3391b975c7899838bcaa81354b220d523214f53b6dd49b9" +content-hash = "a296d2b565883e181b58312dd3b74103181ed1af19ffcfba284f78cb0ac7651e" diff --git a/pyproject.toml b/pyproject.toml index 7c9d695..c4ecc06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,11 +1,11 @@ [build-system] requires = [ - "meson", + "meson>=1.0.0", "meson-python", "pybind11", "ninja" ] -build-backend = "mesonpy" +build-backend = 'mesonpy' [project] name = "hipopybind" @@ -25,3 +25,4 @@ name = "hipopybind" [tool.poetry.group.dev.dependencies] pytest = "^8.0.0" clang-format = "^17.0.0" # For local C++ formatting +meson-python = "^0.18.0" From 112f18b694616ac3d56583daf5a1da104865c3dd Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 01:51:39 -0400 Subject: [PATCH 027/113] feat: Add workflows. --- .github/workflows/python.yml | 51 ++++++++++++++++++++++++++++ .github/workflows/release.yml | 62 +++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 .github/workflows/python.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml new file mode 100644 index 0000000..1855510 --- /dev/null +++ b/.github/workflows/python.yml @@ -0,0 +1,51 @@ +name: Build and Install (Python Matrix) + +on: + push: + branches: [ main ] + pull_request: + +jobs: + test: + name: python-${{ matrix.python-version }} + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Poetry + run: | + python -m pip install --upgrade pip + pip install poetry + + - name: Configure Poetry + run: poetry config virtualenvs.create true + + - name: Install dependencies + run: poetry install --no-interaction --no-root + + - name: Check C++ formatting + run: | + echo "Checking C++ code formatting..." + poetry run clang-format --dry-run --Werror $(find src/ -name '*.cpp' -o -name '*.hpp') + + - name: Build package + run: poetry build + + - name: Install package wheel + run: pip install dist/*.whl + + - name: Run tests + run: | + poetry run pytest --maxfail=1 --disable-warnings -q diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..e28c578 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,62 @@ +name: Publish to PyPI (Tag Release) + +on: + push: + tags: + - 'v*' # Runs when a tag like v1.2.3 is pushed + +permissions: + contents: read + +jobs: + publish: + name: publish-pypi + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + + - name: Install Poetry + run: | + python -m pip install --upgrade pip + pip install poetry + + - name: Configure Poetry + run: poetry config virtualenvs.create false + + # --- Set version from Git tag --- + - name: Extract version from tag + id: version + run: | + VERSION=${GITHUB_REF#refs/tags/v} + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Detected version: $VERSION" + + - name: Set Poetry version + run: | + poetry version ${{ steps.version.outputs.version }} + + # --- Optional: Update version in C++ / build files --- + - name: Update version in source files + run: | + VERSION=${{ steps.version.outputs.version }} + echo "Updating version strings in source files..." + # Example: adjust the regex below for your project + find . -type f \( -name "src/*.cpp" -o -name "src/*.h" -o -name "*.py" -o -name "meson.build" \) \ + -exec sed -i -E "s/[0-9]+\.[0-9]+\.[0-9]+/${VERSION}/g" {} + + + # --- Build & Publish to PyPI --- + - name: Build package + run: poetry build + + - name: Publish to PyPI + env: + POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_API_TOKEN }} + run: | + poetry publish --no-interaction --username __token__ --password $POETRY_PYPI_TOKEN_PYPI From f8b9143d940c4144dced86511a29b30198e2c268 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 01:51:53 -0400 Subject: [PATCH 028/113] feat: Add badges to README. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 04f785c..e4c3459 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # HipopyBind : HIPO PyBind11 Library +[![PyPI](https://img.shields.io/pypi/v/hipopybind.svg)](https://pypi.org/project/hipopybind/) +[![Python](https://github.com/mfmceneaney/hipopybind/actions/workflows/python.yml/badge.svg)](https://github.com/mfmceneaney/hipopybind/actions/workflows/python.yml) This project exposes in python the [hipo](https://github.com/gavalian/hipo) classes and a few custom classes and functions from C++ via [pybind11](https://github.com/pybind/pybind11). From 9cec336d391d1c4f1b8deb91af98b36fba7f70d6 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 01:58:54 -0400 Subject: [PATCH 029/113] fix: Use recursive checkouts. --- .github/workflows/python.yml | 2 ++ .github/workflows/release.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 1855510..b48b166 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -18,6 +18,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + submodules: recursive - name: Set up Python uses: actions/setup-python@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e28c578..24c300d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,6 +16,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + submodules: recursive - name: Set up Python uses: actions/setup-python@v5 From 9a10dcf50353240e6b8b49dfbabb72a26132382d Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 02:05:42 -0400 Subject: [PATCH 030/113] fix: Update `pyproject.toml`. --- poetry.lock | 4 ++-- pyproject.toml | 14 ++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index 72e27e5..5c7d39f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -208,5 +208,5 @@ files = [ [metadata] lock-version = "2.1" -python-versions = ">=3.8" -content-hash = "a296d2b565883e181b58312dd3b74103181ed1af19ffcfba284f78cb0ac7651e" +python-versions = "^3.8.0" +content-hash = "79008cd4e7e729960e724a4327ba8124ce157d3878459519a85a29ef479e3aa6" diff --git a/pyproject.toml b/pyproject.toml index c4ecc06..e8c3fcd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,20 +7,18 @@ requires = [ ] build-backend = 'mesonpy' -[project] +[tool.poetry] name = "hipopybind" version = "2.0.0" description = "Python bindings for hipo using pybind11" -authors = [ - { name = "Matthew F. McEneaney", email = "matthew.mceneaney@duke.edu" } -] +authors = ["Matthew McEneaney "] +repository = "https://github.com/mfmceneaney/hipopybind.git" readme = "README.md" -license = { text = "MIT" } +license = "MIT" classifiers = ["Programming Language :: Python :: 3"] -requires-python = ">=3.8" -[tool.poetry] -name = "hipopybind" +[tool.poetry.dependencies] +python = "^3.8.0" [tool.poetry.group.dev.dependencies] pytest = "^8.0.0" From c6652a128421145f1be19b1b5f0cd4b069fd163b Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 02:30:35 -0400 Subject: [PATCH 031/113] fix: Fix versioning and workflow. --- .github/workflows/python.yml | 5 +++-- hipopybind/__init__.py | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index b48b166..7691f12 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -32,7 +32,7 @@ jobs: pip install poetry - name: Configure Poetry - run: poetry config virtualenvs.create true + run: poetry config virtualenvs.create true && poetry lock - name: Install dependencies run: poetry install --no-interaction --no-root @@ -46,7 +46,8 @@ jobs: run: poetry build - name: Install package wheel - run: pip install dist/*.whl + run: | + pip install dist/*.whl - name: Run tests run: | diff --git a/hipopybind/__init__.py b/hipopybind/__init__.py index 6eb8646..16610d0 100644 --- a/hipopybind/__init__.py +++ b/hipopybind/__init__.py @@ -1 +1,2 @@ +__version__="2.0.0" from ._core import * From b65ace5e7fc4e9b9f781275d9c45f275bf51ca07 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 02:47:15 -0400 Subject: [PATCH 032/113] fix: Remove extra python matrix version for now and set DESTDIR for poetry build so meson installs locally. --- .github/workflows/python.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 7691f12..867b791 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.13"] steps: - name: Checkout repository @@ -43,6 +43,8 @@ jobs: poetry run clang-format --dry-run --Werror $(find src/ -name '*.cpp' -o -name '*.hpp') - name: Build package + env: + DESTDIR: ${{ runner.temp }}/meson_install run: poetry build - name: Install package wheel From 191f03d4116b7eef57a2882ecbd0ce33f837b3c3 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 23 Oct 2025 16:32:18 -0400 Subject: [PATCH 033/113] fix: Update build... --- meson.build | 37 ++++++++++++++++++--------------- poetry.lock | 4 ++-- pyproject.toml | 2 +- {hipopybind => src}/__init__.py | 0 src/hipopybind_module.cpp | 12 +++++++---- 5 files changed, 31 insertions(+), 24 deletions(-) rename {hipopybind => src}/__init__.py (100%) diff --git a/meson.build b/meson.build index 0118dc8..4373b48 100644 --- a/meson.build +++ b/meson.build @@ -7,6 +7,7 @@ project( default_options: [ 'cpp_std=c++17', 'buildtype=release', + 'python.install_env=auto', ], ) @@ -14,10 +15,9 @@ project( pkg = import('pkgconfig') #---------- Find python ----------# -py = import('python').find_installation(pure: false) +python = import('python').find_installation(pure: false) # ---- Find Python and pybind11 ---- -python = import('python').find_installation() pybind11_dep = dependency('pybind11', required: true) # ---- Try to find libhipo via pkg-config ---- @@ -29,9 +29,10 @@ hb_pkg_dir = python.get_install_dir() / 'hipopybind' if not libhipo_dep.found() message('libhipo not found via pkg-config. Attempting to build from source...') - libhipo_src_dir = meson.project_source_root() / 'hipo' - libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' - libhipo_install_dir = python.get_install_dir() / 'hipopybind' / 'libhipo' + # Set paths for meson + libhipo_src_dir = meson.project_source_root() / 'hipo' + libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' + libhipo_install_dir = hb_pkg_dir # Run meson setup run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, @@ -43,29 +44,31 @@ if not libhipo_dep.found() run_command('meson', 'install', '-C', libhipo_build_dir, check: true) # Assume libhipo_install_dir is a Meson File object or string path - hipo_include_dir = 'hipo/hipo4' - hipo_lib_dir = hb_pkg_dir / 'lib' hipo_lib_name = 'hipo4' - install_subdir( - hipo_include_dir, - install_dir: hb_pkg_dir - ) - install_subdir( - libhipo_install_dir / 'lib', - install_dir: hb_pkg_dir - ) + hipo_include_dir = 'hipo' / hipo_lib_name + hipo_lib_dir = libhipo_install_dir / 'lib' + libhipo_dep = declare_dependency( include_directories: include_directories(hipo_include_dir), link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] ) + endif # ---- Build the Python extension ---- -install_data('hipopybind/__init__.py', install_dir: hb_pkg_dir) +host_os = host_machine.system() +if host_os == 'darwin' + pybind_rpath = '@loader_path/lib' +else + # Linux and others + pybind_rpath = '$ORIGIN/lib' +endif +install_data('src/__init__.py', install_dir: hb_pkg_dir) pybind_module = python.extension_module('_core', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], cpp_args: ['-DVERSION_INFO="@0@"'.format(meson.project_version())], install: true, - install_dir: hb_pkg_dir + install_dir: hb_pkg_dir, + install_rpath: pybind_rpath, ) diff --git a/poetry.lock b/poetry.lock index 5c7d39f..447751c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -208,5 +208,5 @@ files = [ [metadata] lock-version = "2.1" -python-versions = "^3.8.0" -content-hash = "79008cd4e7e729960e724a4327ba8124ce157d3878459519a85a29ef479e3aa6" +python-versions = ">=3.8.0" +content-hash = "fe015034a549f3c761105471a35347a1210bfb263af9ccf794a0338b00829255" diff --git a/pyproject.toml b/pyproject.toml index e8c3fcd..c2d02d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ license = "MIT" classifiers = ["Programming Language :: Python :: 3"] [tool.poetry.dependencies] -python = "^3.8.0" +python = ">=3.8.0" [tool.poetry.group.dev.dependencies] pytest = "^8.0.0" diff --git a/hipopybind/__init__.py b/src/__init__.py similarity index 100% rename from hipopybind/__init__.py rename to src/__init__.py diff --git a/src/hipopybind_module.cpp b/src/hipopybind_module.cpp index 619bc06..55e5c48 100644 --- a/src/hipopybind_module.cpp +++ b/src/hipopybind_module.cpp @@ -226,7 +226,8 @@ class HipoFileIterator { index = -1; // Set tags before opening files - for (int i = 0; i < tags.size(); i++) { + int tags_size = tags.size(); + for (int i = 0; i < tags_size; i++) { reader.setTags(tags.at(i)); } @@ -284,7 +285,8 @@ class HipoFileIterator { */ bool open() { index++; - if (index >= filenames.size()) + int filenames_size = filenames.size(); + if (index >= filenames_size) return false; const char *filename = filenames.at(index).c_str(); reader.open(filename); @@ -402,7 +404,8 @@ class HipoFileIterator { } // for (int i = 0; i= batchsize) { - if (!reader.hasNext() && index >= filenames.size() - 1) + int filenames_size = filenames.size(); + if (!reader.hasNext() && index >= filenames_size - 1) return false; return true; } @@ -798,7 +801,8 @@ PYBIND11_MODULE(_core, m) { [](hipo::dictionary &d) { std::vector schemaList = d.getSchemaList(); std::string r("Dictionary :\n"); - for (int idx = 0; idx < schemaList.size(); idx++) { + int schemalist_size = schemaList.size(); + for (int idx = 0; idx < schemalist_size; idx++) { const char *buffer = schemaList[idx].c_str(); hipo::schema s = d.getSchema(buffer); r += "\tSchema : name = " + s.getName() + From 9efe89e6307662dfb42c494227f0350706af768e Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 13:44:25 -0400 Subject: [PATCH 034/113] fix: Repaired rpaths and install hipo first. --- .github/workflows/python.yml | 58 ++++++++++++++++++++++++++++++++---- README.md | 4 ++- install_hipo.sh | 14 +++++++++ meson.build | 57 +++++++++++++++++++---------------- poetry.lock | 48 +++++++++++++++++++++++++++-- pyproject.toml | 5 +++- 6 files changed, 152 insertions(+), 34 deletions(-) create mode 100755 install_hipo.sh diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 867b791..ea04dee 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -42,14 +42,62 @@ jobs: echo "Checking C++ code formatting..." poetry run clang-format --dry-run --Werror $(find src/ -name '*.cpp' -o -name '*.hpp') - - name: Build package - env: - DESTDIR: ${{ runner.temp }}/meson_install - run: poetry build + - name: Install patchelf (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y patchelf binutils + + - name: Ensure install_name_tool is available (macOS only) + if: runner.os == 'macOS' + run: | + # Make sure Xcode Command Line Tools are installed + xcode-select --install 2>/dev/null || true + + # Verify install_name_tool and otool exist + which install_name_tool + which otool + + - name: Install hipo + run: | + poetry run ./install_hipo.sh + + - name: Build package wheel + run: | + poetry build + + - name: Patch RPATHs in wheel + run: | + WHEEL=$(ls dist/*.whl) + TMPDIR=dist_tmp + mkdir $TMPDIR + unzip "$WHEEL" -d "$TMPDIR" + + if [[ "$RUNNER_OS" == "Linux" ]]; then + find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ + while IFS= read -r -d '' f; do + patchelf --print-rpath "$f" + patchelf --force-rpath --set-rpath '$ORIGIN/lib' "$f" + patchelf --print-rpath "$f" + done + elif [[ "$RUNNER_OS" == "macOS" ]]; then + find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ + while IFS= read -r -d '' f; do + otool -L "$f" + install_name_tool -add_rpath "@loader_path/lib" "$f" + otool -L "$f" + done + fi + + cd "$TMPDIR" + zip -r "../$WHEEL" . + cd .. + rm -rf $TPMDIR - name: Install package wheel run: | - pip install dist/*.whl + ls -lrth dist + poetry run pip install dist/*.whl - name: Run tests run: | diff --git a/README.md b/README.md index e4c3459..ad2e331 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,9 @@ To compile the library from source run the following: ```bash git clone --recurse-submodules https://github.com/mfmceneaney/hipopybind.git cd hipopybind -meson setup build +pip install poetry +poetry run ./install_hipo.sh +pip install . ``` And add the following to your startup script: diff --git a/install_hipo.sh b/install_hipo.sh new file mode 100755 index 0000000..1f46242 --- /dev/null +++ b/install_hipo.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +cd hipo + +# Copy from the hipo README +echo "meson setup build --prefix=`dirname $PWD` --reconfigure" +meson setup build --prefix=`dirname $PWD` --reconfigure +cd build +ninja # compiles +ninja install # installs to your specified prefix (../install/, in the example) +ninja test # runs the tests +ninja clean # clean the build directory, if you need to start over + +cd - diff --git a/meson.build b/meson.build index 4373b48..23c55d2 100644 --- a/meson.build +++ b/meson.build @@ -21,48 +21,47 @@ python = import('python').find_installation(pure: false) pybind11_dep = dependency('pybind11', required: true) # ---- Try to find libhipo via pkg-config ---- -libhipo_dep = dependency('libhipo', method: 'pkg-config', required: false) +libhipo_dep = dependency('libhipo4', method: 'pkg-config', required: false) # ---- Set python install directory ---- hb_pkg_dir = python.get_install_dir() / 'hipopybind' -if not libhipo_dep.found() - message('libhipo not found via pkg-config. Attempting to build from source...') - - # Set paths for meson - libhipo_src_dir = meson.project_source_root() / 'hipo' - libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' - libhipo_install_dir = hb_pkg_dir - - # Run meson setup - run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, - '--prefix=' + libhipo_install_dir, - check: true) +# Set loader path +host_os = host_machine.system() +if host_os == 'darwin' + pybind_rpath = '@loader_path/lib' +else + # Linux and others + pybind_rpath = '$ORIGIN/lib' +endif - # Compile and install - run_command('meson', 'compile', '-C', libhipo_build_dir, check: true) - run_command('meson', 'install', '-C', libhipo_build_dir, check: true) +# If no pkg-config is found +if not libhipo_dep.found() + message('libhipo not found via pkg-config. Assuming ./install_hipo.sh has already been run...') - # Assume libhipo_install_dir is a Meson File object or string path + # Assume hipo is already installed locally in the source project hipo_lib_name = 'hipo4' hipo_include_dir = 'hipo' / hipo_lib_name - hipo_lib_dir = libhipo_install_dir / 'lib' + hipo_lib_dir = meson.project_source_root() / 'lib' libhipo_dep = declare_dependency( include_directories: include_directories(hipo_include_dir), link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] ) + # Install arbitrary data directory into the Python package + install_subdir( + 'lib', + install_dir: hb_pkg_dir + ) + install_subdir( + 'include', + install_dir: hb_pkg_dir + ) + endif # ---- Build the Python extension ---- -host_os = host_machine.system() -if host_os == 'darwin' - pybind_rpath = '@loader_path/lib' -else - # Linux and others - pybind_rpath = '$ORIGIN/lib' -endif install_data('src/__init__.py', install_dir: hb_pkg_dir) pybind_module = python.extension_module('_core', 'src/hipopybind_module.cpp', @@ -72,3 +71,11 @@ pybind_module = python.extension_module('_core', install_dir: hb_pkg_dir, install_rpath: pybind_rpath, ) + +# Export a dependency object for use as a subproject +hipopybind_dep = declare_dependency( + link_with: pybind_module, +) + +# Export the dependency so superprojects can access it +meson.override_dependency('hipopybind_dep', hipopybind_dep) diff --git a/poetry.lock b/poetry.lock index 447751c..e6d47d0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -75,7 +75,7 @@ version = "1.9.1" description = "A high performance build system" optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["main", "dev"] files = [ {file = "meson-1.9.1-py3-none-any.whl", hash = "sha256:f824ab770c041a202f532f69e114c971918ed2daff7ea56583d80642564598d0"}, ] @@ -110,6 +110,35 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} docs = ["furo (>=2024.08.06)", "sphinx (>=8.1.0,<8.2.0)", "sphinx-copybutton (>=0.5.0)", "sphinx-design (>=0.1.0)", "sphinxext-opengraph (>=0.7.0)"] test = ["build", "cython (>=3.0.3)", "pytest (>=6.0)", "pytest-cov[toml]", "pytest-mock", "typing-extensions (>=3.7.4) ; python_version < \"3.11\"", "wheel"] +[[package]] +name = "ninja" +version = "1.13.0" +description = "Ninja is a small build system with a focus on speed" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "ninja-1.13.0-py3-none-macosx_10_9_universal2.whl", hash = "sha256:fa2a8bfc62e31b08f83127d1613d10821775a0eb334197154c4d6067b7068ff1"}, + {file = "ninja-1.13.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3d00c692fb717fd511abeb44b8c5d00340c36938c12d6538ba989fe764e79630"}, + {file = "ninja-1.13.0-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:be7f478ff9f96a128b599a964fc60a6a87b9fa332ee1bd44fa243ac88d50291c"}, + {file = "ninja-1.13.0-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:60056592cf495e9a6a4bea3cd178903056ecb0943e4de45a2ea825edb6dc8d3e"}, + {file = "ninja-1.13.0-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1c97223cdda0417f414bf864cfb73b72d8777e57ebb279c5f6de368de0062988"}, + {file = "ninja-1.13.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa"}, + {file = "ninja-1.13.0-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4be9c1b082d244b1ad7ef41eb8ab088aae8c109a9f3f0b3e56a252d3e00f42c1"}, + {file = "ninja-1.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6739d3352073341ad284246f81339a384eec091d9851a886dfa5b00a6d48b3e2"}, + {file = "ninja-1.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11be2d22027bde06f14c343f01d31446747dbb51e72d00decca2eb99be911e2f"}, + {file = "ninja-1.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aa45b4037b313c2f698bc13306239b8b93b4680eb47e287773156ac9e9304714"}, + {file = "ninja-1.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f8e1e8a1a30835eeb51db05cf5a67151ad37542f5a4af2a438e9490915e5b72"}, + {file = "ninja-1.13.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:3d7d7779d12cb20c6d054c61b702139fd23a7a964ec8f2c823f1ab1b084150db"}, + {file = "ninja-1.13.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:d741a5e6754e0bda767e3274a0f0deeef4807f1fec6c0d7921a0244018926ae5"}, + {file = "ninja-1.13.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:e8bad11f8a00b64137e9b315b137d8bb6cbf3086fbdc43bf1f90fd33324d2e96"}, + {file = "ninja-1.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4f2a072db3c0f944c32793e91532d8948d20d9ab83da9c0c7c15b5768072200"}, + {file = "ninja-1.13.0-py3-none-win32.whl", hash = "sha256:8cfbb80b4a53456ae8a39f90ae3d7a2129f45ea164f43fadfa15dc38c4aef1c9"}, + {file = "ninja-1.13.0-py3-none-win_amd64.whl", hash = "sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e"}, + {file = "ninja-1.13.0-py3-none-win_arm64.whl", hash = "sha256:3c0b40b1f0bba764644385319028650087b4c1b18cdfa6f45cb39a3669b81aa9"}, + {file = "ninja-1.13.0.tar.gz", hash = "sha256:4a40ce995ded54d9dc24f8ea37ff3bf62ad192b547f6c7126e7e25045e76f978"}, +] + [[package]] name = "packaging" version = "25.0" @@ -138,6 +167,21 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pybind11" +version = "3.0.1" +description = "Seamless operability between C++11 and Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pybind11-3.0.1-py3-none-any.whl", hash = "sha256:aa8f0aa6e0a94d3b64adfc38f560f33f15e589be2175e103c0a33c6bce55ee89"}, + {file = "pybind11-3.0.1.tar.gz", hash = "sha256:9c0f40056a016da59bab516efb523089139fcc6f2ba7e4930854c61efb932051"}, +] + +[package.extras] +global = ["pybind11-global (==3.0.1)"] + [[package]] name = "pyproject-metadata" version = "0.9.1" @@ -209,4 +253,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = ">=3.8.0" -content-hash = "fe015034a549f3c761105471a35347a1210bfb263af9ccf794a0338b00829255" +content-hash = "d2abcbcd6c28a752b586fd906a1d7fea3a76bdec8c0f14e4d28732064156f4d8" diff --git a/pyproject.toml b/pyproject.toml index c2d02d7..ddf0953 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = [ "meson>=1.0.0", "meson-python", "pybind11", - "ninja" + "ninja>=1.8.2" ] build-backend = 'mesonpy' @@ -19,6 +19,9 @@ classifiers = ["Programming Language :: Python :: 3"] [tool.poetry.dependencies] python = ">=3.8.0" +meson = ">=1.0.0" +ninja = ">=1.8.2" +pybind11 = ">=3.0.1" [tool.poetry.group.dev.dependencies] pytest = "^8.0.0" From 3d9ecca94d27f097ec233e00da222751557c95ce Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 14:15:39 -0400 Subject: [PATCH 035/113] fix: Update README. --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index ad2e331..4663f39 100644 --- a/README.md +++ b/README.md @@ -30,12 +30,6 @@ poetry run ./install_hipo.sh pip install . ``` -And add the following to your startup script: - -```bash -export PYTHONPATH=$PYTHONPATH\:/path/to/hipopybind -``` - # :rocket: Getting Started Run the tutorials via: From 8c13491992c9a6d3e8055d8b828f4883f9928ce6 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 14:44:05 -0400 Subject: [PATCH 036/113] feat: Add new workflow to build and publish wheels for tagged versions. --- .../workflows/build-and-publish-wheels.yml | 146 ++++++++++++++++++ .github/workflows/release.yml | 64 -------- 2 files changed, 146 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/build-and-publish-wheels.yml delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml new file mode 100644 index 0000000..69231ef --- /dev/null +++ b/.github/workflows/build-and-publish-wheels.yml @@ -0,0 +1,146 @@ +name: Build and Publish Wheels + +on: + push: + tags: + - "v*" # Build & publish on version tags (e.g. v1.2.3) + workflow_dispatch: # Allow manual trigger + +jobs: + build_wheels: + name: Build wheels on ${{ matrix.os }} / Python ${{ matrix.python }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + python: ["3.9", "3.10", "3.11", "3.12", "3.13"] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python }} + + - name: Install Poetry + run: | + python -m pip install --upgrade pip + pip install poetry + + - name: Configure Poetry + run: poetry config virtualenvs.create true && poetry lock + + - name: Install dependencies + run: poetry install --no-interaction --no-root + + - name: Check C++ formatting + run: | + echo "Checking C++ code formatting..." + poetry run clang-format --dry-run --Werror $(find src/ -name '*.cpp' -o -name '*.hpp') + + - name: Install patchelf (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y patchelf binutils + + - name: Ensure install_name_tool is available (macOS only) + if: runner.os == 'macOS' + run: | + # Make sure Xcode Command Line Tools are installed + xcode-select --install 2>/dev/null || true + + # Verify install_name_tool and otool exist + which install_name_tool + which otool + + - name: Install hipo + run: | + poetry run ./install_hipo.sh + + - name: Build package wheel + run: | + poetry build + + - name: Patch RPATHs in wheel + run: | + WHEEL=$(ls dist/*.whl) + TMPDIR=dist_tmp + mkdir $TMPDIR + unzip "$WHEEL" -d "$TMPDIR" + + if [[ "$RUNNER_OS" == "Linux" ]]; then + find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ + while IFS= read -r -d '' f; do + patchelf --print-rpath "$f" + patchelf --force-rpath --set-rpath '$ORIGIN/lib' "$f" + patchelf --print-rpath "$f" + done + elif [[ "$RUNNER_OS" == "macOS" ]]; then + find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ + while IFS= read -r -d '' f; do + otool -L "$f" + install_name_tool -add_rpath "@loader_path/lib" "$f" + otool -L "$f" + done + fi + + cd "$TMPDIR" + zip -r "../$WHEEL" . + cd .. + rm -rf $TPMDIR + + - name: Install package wheel + run: | + ls -lrth dist + poetry run pip install dist/*.whl + + - name: Run tests + run: | + poetry run pytest --maxfail=1 --disable-warnings -q + + - name: Upload built wheels + uses: actions/upload-artifact@v4 + with: + name: wheels-${{ matrix.os }}-py${{ matrix.python }} + path: dist/*.whl + + publish_testpypi: + name: Publish to TestPyPI + needs: build_wheels + runs-on: ubuntu-latest + if: github.event_name == 'workflow_dispatch' + steps: + - uses: actions/download-artifact@v4 + with: + path: dist + - run: pip install twine + - name: Upload to TestPyPI + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.TESTPYPI_API_TOKEN }} + run: twine upload --repository testpypi dist/**/*.whl + + publish: + name: Publish to PyPI + needs: publish_testpypi + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v') + steps: + - uses: actions/download-artifact@v4 + with: + path: dist + + - name: Install twine + run: | + python -m pip install --upgrade pip + pip install twine + + - name: Publish to PyPI + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + run: | + echo twine upload dist/**/*.whl diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 24c300d..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Publish to PyPI (Tag Release) - -on: - push: - tags: - - 'v*' # Runs when a tag like v1.2.3 is pushed - -permissions: - contents: read - -jobs: - publish: - name: publish-pypi - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.13' - - - name: Install Poetry - run: | - python -m pip install --upgrade pip - pip install poetry - - - name: Configure Poetry - run: poetry config virtualenvs.create false - - # --- Set version from Git tag --- - - name: Extract version from tag - id: version - run: | - VERSION=${GITHUB_REF#refs/tags/v} - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "Detected version: $VERSION" - - - name: Set Poetry version - run: | - poetry version ${{ steps.version.outputs.version }} - - # --- Optional: Update version in C++ / build files --- - - name: Update version in source files - run: | - VERSION=${{ steps.version.outputs.version }} - echo "Updating version strings in source files..." - # Example: adjust the regex below for your project - find . -type f \( -name "src/*.cpp" -o -name "src/*.h" -o -name "*.py" -o -name "meson.build" \) \ - -exec sed -i -E "s/[0-9]+\.[0-9]+\.[0-9]+/${VERSION}/g" {} + - - # --- Build & Publish to PyPI --- - - name: Build package - run: poetry build - - - name: Publish to PyPI - env: - POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_API_TOKEN }} - run: | - poetry publish --no-interaction --username __token__ --password $POETRY_PYPI_TOKEN_PYPI From 134cbf877e8880fae40e690888b803ad83e13771 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 15:07:18 -0400 Subject: [PATCH 037/113] fix: Update meson dependency. --- meson.build | 2 +- pyproject.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index 23c55d2..98b6602 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cpp', version: '2.0.0', license: 'MIT', - meson_version: '>= 1.2.0', + meson_version: '>=1.2', default_options: [ 'cpp_std=c++17', 'buildtype=release', diff --git a/pyproject.toml b/pyproject.toml index ddf0953..8d9129d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [build-system] requires = [ - "meson>=1.0.0", + "meson>=1.2", "meson-python", "pybind11", "ninja>=1.8.2" @@ -19,7 +19,7 @@ classifiers = ["Programming Language :: Python :: 3"] [tool.poetry.dependencies] python = ">=3.8.0" -meson = ">=1.0.0" +meson = ">=1.2" ninja = ">=1.8.2" pybind11 = ">=3.0.1" From a9721c2bd03b1bf3aa3fe567d5a910d1b220d8dd Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 15:08:21 -0400 Subject: [PATCH 038/113] feat: Add more python versions for wheels. --- .github/workflows/build-and-publish-wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 69231ef..2f27a76 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - python: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v4 From 2708fb363a99e7a8c67be64ffc03b66df4d5dd97 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 15:15:45 -0400 Subject: [PATCH 039/113] fix: Add recursive checkout to workflow. --- .github/workflows/build-and-publish-wheels.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 2f27a76..74c66b1 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -17,7 +17,10 @@ jobs: python: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive - name: Set up Python uses: actions/setup-python@v5 From 728a7ba8e2da8d41f7eb417ce1c7df41a913bd81 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 15:25:35 -0400 Subject: [PATCH 040/113] fix: Update minimum python version. --- .github/workflows/build-and-publish-wheels.yml | 2 +- .github/workflows/python.yml | 3 ++- README.md | 2 +- poetry.lock | 4 ++-- pyproject.toml | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 74c66b1..3a48985 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - python: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Checkout repository diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index ea04dee..57af46d 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -13,7 +13,8 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.13"] + os: [ubuntu-latest, macos-latest] + python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Checkout repository diff --git a/README.md b/README.md index 4663f39..11c771b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ custom classes and functions from C++ via [pybind11](https://github.com/pybind/p ## Prerequisites -* Python >=3.7.3 +* Python >=3.9 * A compiler with C++17 support * Ninja or Pip 10+ * meson diff --git a/poetry.lock b/poetry.lock index e6d47d0..0403456 100644 --- a/poetry.lock +++ b/poetry.lock @@ -252,5 +252,5 @@ files = [ [metadata] lock-version = "2.1" -python-versions = ">=3.8.0" -content-hash = "d2abcbcd6c28a752b586fd906a1d7fea3a76bdec8c0f14e4d28732064156f4d8" +python-versions = ">=3.9" +content-hash = "cf440429703e5be8b53694a06daab6878ffa84725ee243610cf39bc44844f867" diff --git a/pyproject.toml b/pyproject.toml index 8d9129d..2e75fa4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ license = "MIT" classifiers = ["Programming Language :: Python :: 3"] [tool.poetry.dependencies] -python = ">=3.8.0" +python = ">=3.9" meson = ">=1.2" ninja = ">=1.8.2" pybind11 = ">=3.0.1" From b91ad32b98468f311ad406cc0eddefcbba61d504 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 15:33:43 -0400 Subject: [PATCH 041/113] fix: Remove conditions for running steps. --- .github/workflows/build-and-publish-wheels.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 3a48985..bc321ae 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -114,7 +114,6 @@ jobs: name: Publish to TestPyPI needs: build_wheels runs-on: ubuntu-latest - if: github.event_name == 'workflow_dispatch' steps: - uses: actions/download-artifact@v4 with: @@ -130,7 +129,6 @@ jobs: name: Publish to PyPI needs: publish_testpypi runs-on: ubuntu-latest - if: startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/download-artifact@v4 with: From 01f24625c467f19e8d957ca11dad81990e081726 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 15:42:35 -0400 Subject: [PATCH 042/113] fix: Reformat toml file. --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2e75fa4..fd67877 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ requires = [ ] build-backend = 'mesonpy' -[tool.poetry] +[project] name = "hipopybind" version = "2.0.0" description = "Python bindings for hipo using pybind11" @@ -17,7 +17,7 @@ readme = "README.md" license = "MIT" classifiers = ["Programming Language :: Python :: 3"] -[tool.poetry.dependencies] +[project.dependencies] python = ">=3.9" meson = ">=1.2" ninja = ">=1.8.2" From c9ae4fc3004b87a24eacc0c48e6bab316a5734d6 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 16:20:21 -0400 Subject: [PATCH 043/113] fix: Rever toml. --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index fd67877..2e75fa4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ requires = [ ] build-backend = 'mesonpy' -[project] +[tool.poetry] name = "hipopybind" version = "2.0.0" description = "Python bindings for hipo using pybind11" @@ -17,7 +17,7 @@ readme = "README.md" license = "MIT" classifiers = ["Programming Language :: Python :: 3"] -[project.dependencies] +[tool.poetry.dependencies] python = ">=3.9" meson = ">=1.2" ninja = ">=1.8.2" From 97028b0ef6de8fb29e832b5fe646288a7748baca Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 16:27:20 -0400 Subject: [PATCH 044/113] fix: Use poetry to publish instead of twine. --- .../workflows/build-and-publish-wheels.yml | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index bc321ae..d3787fc 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -118,12 +118,10 @@ jobs: - uses: actions/download-artifact@v4 with: path: dist - - run: pip install twine - name: Upload to TestPyPI - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.TESTPYPI_API_TOKEN }} - run: twine upload --repository testpypi dist/**/*.whl + run: | + pip install --upgrade pip poetry + poetry publish -r testpypi --no-build -u __token__ -p ${{ secrets.TESTPYPI_API_TOKEN }} publish: name: Publish to PyPI @@ -134,14 +132,7 @@ jobs: with: path: dist - - name: Install twine - run: | - python -m pip install --upgrade pip - pip install twine - - - name: Publish to PyPI - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + - name: Upload to PyPI run: | - echo twine upload dist/**/*.whl + pip install --upgrade pip poetry + poetry publish --no-build -u __token__ -p ${{ secrets.PYPI_API_TOKEN }} From 380800b2376b01fb6dceec982f0f0c61178a2d0b Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 16:32:28 -0400 Subject: [PATCH 045/113] fix: Remove incorrect option. --- .github/workflows/build-and-publish-wheels.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index d3787fc..e9680ea 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -121,7 +121,7 @@ jobs: - name: Upload to TestPyPI run: | pip install --upgrade pip poetry - poetry publish -r testpypi --no-build -u __token__ -p ${{ secrets.TESTPYPI_API_TOKEN }} + poetry publish -r testpypi -u __token__ -p ${{ secrets.TESTPYPI_API_TOKEN }} publish: name: Publish to PyPI @@ -135,4 +135,4 @@ jobs: - name: Upload to PyPI run: | pip install --upgrade pip poetry - poetry publish --no-build -u __token__ -p ${{ secrets.PYPI_API_TOKEN }} + echo poetry publish -u __token__ -p ${{ secrets.PYPI_API_TOKEN }} From 6c438b752688f73f6376693f734af205e0b54135 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 18:55:33 -0400 Subject: [PATCH 046/113] fix: Updated publish workflows to check out directory and set up python. --- .../workflows/build-and-publish-wheels.yml | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index e9680ea..d7e1ad3 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -115,9 +115,21 @@ jobs: needs: build_wheels runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v4 + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Download distributions + uses: actions/download-artifact@v4 with: path: dist + - name: Upload to TestPyPI run: | pip install --upgrade pip poetry @@ -128,7 +140,18 @@ jobs: needs: publish_testpypi runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v4 + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Download distributions + uses: actions/download-artifact@v4 with: path: dist From e6256158798054d4b722a286c3f154e983cf7e18 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 19:01:22 -0400 Subject: [PATCH 047/113] fix: Use download with publish action. --- .github/workflows/build-and-publish-wheels.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index d7e1ad3..efa26c7 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -125,14 +125,13 @@ jobs: with: python-version: "3.13" - - name: Download distributions - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v4 with: path: dist - - name: Upload to TestPyPI run: | pip install --upgrade pip poetry + ls -lrth dist poetry publish -r testpypi -u __token__ -p ${{ secrets.TESTPYPI_API_TOKEN }} publish: @@ -155,6 +154,9 @@ jobs: with: path: dist + - uses: actions/download-artifact@v4 + with: + path: dist - name: Upload to PyPI run: | pip install --upgrade pip poetry From 089faf76163da21f4c516f864b86301fd24fcda8 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 19:16:45 -0400 Subject: [PATCH 048/113] fix: Use download with publish action. --- .github/workflows/build-and-publish-wheels.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index efa26c7..08e7649 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -132,6 +132,11 @@ jobs: run: | pip install --upgrade pip poetry ls -lrth dist + mkdir -p dist_flat + cp dist/**/*.whl dist_flat/ + rm -rf dist + mv dist_flat dist + ls -lrth dist poetry publish -r testpypi -u __token__ -p ${{ secrets.TESTPYPI_API_TOKEN }} publish: @@ -160,4 +165,9 @@ jobs: - name: Upload to PyPI run: | pip install --upgrade pip poetry + mkdir -p dist_flat + cp dist/**/*.whl dist_flat/ + rm -rf dist + mv dist_flat dist + ls -lrth dist echo poetry publish -u __token__ -p ${{ secrets.PYPI_API_TOKEN }} From b8795b8e62b7ada64cafbd3fc81047c4fcabde47 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sat, 25 Oct 2025 19:26:39 -0400 Subject: [PATCH 049/113] fix: Add poetry repo configs. --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 2e75fa4..68320b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,3 +27,7 @@ pybind11 = ">=3.0.1" pytest = "^8.0.0" clang-format = "^17.0.0" # For local C++ formatting meson-python = "^0.18.0" + +[tool.poetry.repositories] +pypi = { url = "https://upload.pypi.org/legacy/" } +testpypi = { url = "https://test.pypi.org/legacy/" } From fc2369dbe388cac10874415161eaafb47673502e Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sun, 26 Oct 2025 00:53:11 -0400 Subject: [PATCH 050/113] fix: Set testpypi repo address directly from CLI. --- .github/workflows/build-and-publish-wheels.yml | 1 + pyproject.toml | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 08e7649..750944d 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -137,6 +137,7 @@ jobs: rm -rf dist mv dist_flat dist ls -lrth dist + poetry config repositories.testpypi https://test.pypi.org/legacy/ poetry publish -r testpypi -u __token__ -p ${{ secrets.TESTPYPI_API_TOKEN }} publish: diff --git a/pyproject.toml b/pyproject.toml index 68320b1..2e75fa4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,3 @@ pybind11 = ">=3.0.1" pytest = "^8.0.0" clang-format = "^17.0.0" # For local C++ formatting meson-python = "^0.18.0" - -[tool.poetry.repositories] -pypi = { url = "https://upload.pypi.org/legacy/" } -testpypi = { url = "https://test.pypi.org/legacy/" } From 85391432475c093bdfa8da654ccf5506c3e40e30 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sun, 26 Oct 2025 01:08:43 -0400 Subject: [PATCH 051/113] fix: Use cibuildwheel to build wheels for all python version and for manylinux instead of linux. --- .github/workflows/build-and-publish-wheels.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 750944d..b21d3e7 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -8,13 +8,12 @@ on: jobs: build_wheels: - name: Build wheels on ${{ matrix.os }} / Python ${{ matrix.python }} + name: Build wheels on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Checkout repository @@ -22,11 +21,6 @@ jobs: with: submodules: recursive - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python }} - - name: Install Poetry run: | python -m pip install --upgrade pip @@ -65,7 +59,10 @@ jobs: - name: Build package wheel run: | - poetry build + pip install cibuildwheel + cibuildwheel --output-dir dist + env: + CIBW_SKIP: "pp*" # Skip PyPy if you like - name: Patch RPATHs in wheel run: | From ea828d6325e91e9e6fa8328fcfe3c5e0645273a2 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sun, 26 Oct 2025 01:26:10 -0400 Subject: [PATCH 052/113] fix: Add patches for all CI wheels and update minimum macos version. --- .../workflows/build-and-publish-wheels.yml | 67 ++++++++++++------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index b21d3e7..910c9ca 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -63,34 +63,49 @@ jobs: cibuildwheel --output-dir dist env: CIBW_SKIP: "pp*" # Skip PyPy if you like + MACOSX_DEPLOYMENT_TARGET: 15.0 - - name: Patch RPATHs in wheel + - name: Patch RPATHs in built wheels run: | - WHEEL=$(ls dist/*.whl) - TMPDIR=dist_tmp - mkdir $TMPDIR - unzip "$WHEEL" -d "$TMPDIR" - - if [[ "$RUNNER_OS" == "Linux" ]]; then - find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ - while IFS= read -r -d '' f; do - patchelf --print-rpath "$f" - patchelf --force-rpath --set-rpath '$ORIGIN/lib' "$f" - patchelf --print-rpath "$f" - done - elif [[ "$RUNNER_OS" == "macOS" ]]; then - find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ - while IFS= read -r -d '' f; do - otool -L "$f" - install_name_tool -add_rpath "@loader_path/lib" "$f" - otool -L "$f" - done - fi - - cd "$TMPDIR" - zip -r "../$WHEEL" . - cd .. - rm -rf $TPMDIR + TMPDIR_BASE="dist_tmp" + + for WHEEL in dist/*.whl; do + echo "🔧 Processing $WHEEL..." + TMPDIR="${TMPDIR_BASE}_$(basename "$WHEEL" .whl)" + mkdir -p "$TMPDIR" + unzip -q "$WHEEL" -d "$TMPDIR" + + if [[ "$RUNNER_OS" == "Linux" ]]; then + echo "🔧 Adjusting RPATHs with patchelf..." + find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ + while IFS= read -r -d '' f; do + echo " → $f" + patchelf --print-rpath "$f" || true + patchelf --force-rpath --set-rpath '$ORIGIN/lib' "$f" + patchelf --print-rpath "$f" || true + done + + elif [[ "$RUNNER_OS" == "macOS" ]]; then + echo "🔧 Adjusting RPATHs with install_name_tool..." + find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ + while IFS= read -r -d '' f; do + echo " → $f" + otool -L "$f" + install_name_tool -add_rpath "@loader_path/lib" "$f" + otool -L "$f" + done + fi + + # Repack the modified wheel + echo "📦 Repacking $WHEEL" + cd "$TMPDIR" + zip -qr "../$(basename "$WHEEL")" . + cd - >/dev/null + + # Clean up + rm -rf "$TMPDIR" + echo "✅ Finished $WHEEL" + done - name: Install package wheel run: | From 726a3efab1130d28d2a64fa8771f2ae9eef5ef69 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sun, 26 Oct 2025 01:42:40 -0400 Subject: [PATCH 053/113] fix: Update meson build. --- meson.build | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/meson.build b/meson.build index 98b6602..390d50f 100644 --- a/meson.build +++ b/meson.build @@ -35,30 +35,38 @@ else pybind_rpath = '$ORIGIN/lib' endif -# If no pkg-config is found if not libhipo_dep.found() - message('libhipo not found via pkg-config. Assuming ./install_hipo.sh has already been run...') + message('libhipo not found via pkg-config. Attempting to build from source...') - # Assume hipo is already installed locally in the source project - hipo_lib_name = 'hipo4' - hipo_include_dir = 'hipo' / hipo_lib_name - hipo_lib_dir = meson.project_source_root() / 'lib' + libhipo_src_dir = meson.project_source_root() / 'hipo' + libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' + libhipo_install_dir = meson.project_source_root() - libhipo_dep = declare_dependency( - include_directories: include_directories(hipo_include_dir), - link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] - ) + # Run meson setup + run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, + '--prefix=' + libhipo_install_dir, + check: true) + + # Compile and install + run_command('meson', 'compile', '-C', libhipo_build_dir, check: true) + run_command('meson', 'install', '-C', libhipo_build_dir, check: true) - # Install arbitrary data directory into the Python package + # Assume libhipo_install_dir is a Meson File object or string path + hipo_include_dir = 'include' + hipo_lib_dir = libhipo_install_dir / 'lib' + hipo_lib_name = 'hipo4' install_subdir( - 'lib', + hipo_include_dir, install_dir: hb_pkg_dir ) install_subdir( - 'include', + hipo_lib_dir, install_dir: hb_pkg_dir ) - + libhipo_dep = declare_dependency( + include_directories: include_directories(hipo_include_dir), + link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] + ) endif # ---- Build the Python extension ---- From 858c9b6f85c9787d106db993e0d9d4834faf8b33 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Sun, 26 Oct 2025 01:44:21 -0400 Subject: [PATCH 054/113] fix: Simplify workflow with cibuildwheel. --- .../workflows/build-and-publish-wheels.yml | 64 +------------------ 1 file changed, 1 insertion(+), 63 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 910c9ca..5a0a41e 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -37,26 +37,6 @@ jobs: echo "Checking C++ code formatting..." poetry run clang-format --dry-run --Werror $(find src/ -name '*.cpp' -o -name '*.hpp') - - name: Install patchelf (Linux only) - if: runner.os == 'Linux' - run: | - sudo apt-get update - sudo apt-get install -y patchelf binutils - - - name: Ensure install_name_tool is available (macOS only) - if: runner.os == 'macOS' - run: | - # Make sure Xcode Command Line Tools are installed - xcode-select --install 2>/dev/null || true - - # Verify install_name_tool and otool exist - which install_name_tool - which otool - - - name: Install hipo - run: | - poetry run ./install_hipo.sh - - name: Build package wheel run: | pip install cibuildwheel @@ -65,48 +45,6 @@ jobs: CIBW_SKIP: "pp*" # Skip PyPy if you like MACOSX_DEPLOYMENT_TARGET: 15.0 - - name: Patch RPATHs in built wheels - run: | - TMPDIR_BASE="dist_tmp" - - for WHEEL in dist/*.whl; do - echo "🔧 Processing $WHEEL..." - TMPDIR="${TMPDIR_BASE}_$(basename "$WHEEL" .whl)" - mkdir -p "$TMPDIR" - unzip -q "$WHEEL" -d "$TMPDIR" - - if [[ "$RUNNER_OS" == "Linux" ]]; then - echo "🔧 Adjusting RPATHs with patchelf..." - find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ - while IFS= read -r -d '' f; do - echo " → $f" - patchelf --print-rpath "$f" || true - patchelf --force-rpath --set-rpath '$ORIGIN/lib' "$f" - patchelf --print-rpath "$f" || true - done - - elif [[ "$RUNNER_OS" == "macOS" ]]; then - echo "🔧 Adjusting RPATHs with install_name_tool..." - find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ - while IFS= read -r -d '' f; do - echo " → $f" - otool -L "$f" - install_name_tool -add_rpath "@loader_path/lib" "$f" - otool -L "$f" - done - fi - - # Repack the modified wheel - echo "📦 Repacking $WHEEL" - cd "$TMPDIR" - zip -qr "../$(basename "$WHEEL")" . - cd - >/dev/null - - # Clean up - rm -rf "$TMPDIR" - echo "✅ Finished $WHEEL" - done - - name: Install package wheel run: | ls -lrth dist @@ -119,7 +57,7 @@ jobs: - name: Upload built wheels uses: actions/upload-artifact@v4 with: - name: wheels-${{ matrix.os }}-py${{ matrix.python }} + name: wheels-${{ matrix.os }} path: dist/*.whl publish_testpypi: From 15cdac4449db4bf37d1bd24eeb924cc27463cedc Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Mon, 27 Oct 2025 14:21:18 -0400 Subject: [PATCH 055/113] fix: Remove pypy skip selection. --- .github/workflows/build-and-publish-wheels.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 5a0a41e..908224d 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -42,7 +42,6 @@ jobs: pip install cibuildwheel cibuildwheel --output-dir dist env: - CIBW_SKIP: "pp*" # Skip PyPy if you like MACOSX_DEPLOYMENT_TARGET: 15.0 - name: Install package wheel From 78535973488b81a3af6347e9a2adcc1bce984324 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Tue, 28 Oct 2025 12:54:16 -0400 Subject: [PATCH 056/113] fix: Use meson project name instead of typing out project name. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 390d50f..3797899 100644 --- a/meson.build +++ b/meson.build @@ -24,7 +24,7 @@ pybind11_dep = dependency('pybind11', required: true) libhipo_dep = dependency('libhipo4', method: 'pkg-config', required: false) # ---- Set python install directory ---- -hb_pkg_dir = python.get_install_dir() / 'hipopybind' +hb_pkg_dir = python.get_install_dir() / meson.project_name() # Set loader path host_os = host_machine.system() From 62a870d1cc46bca5e62b470aff3b72740f1f8b00 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 29 Oct 2025 15:14:23 -0400 Subject: [PATCH 057/113] fix: Fix CI build errors. --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 3797899..c7fe31e 100644 --- a/meson.build +++ b/meson.build @@ -40,7 +40,7 @@ if not libhipo_dep.found() libhipo_src_dir = meson.project_source_root() / 'hipo' libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' - libhipo_install_dir = meson.project_source_root() + libhipo_install_dir = meson.current_source_dir() # Run meson setup run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, @@ -53,7 +53,7 @@ if not libhipo_dep.found() # Assume libhipo_install_dir is a Meson File object or string path hipo_include_dir = 'include' - hipo_lib_dir = libhipo_install_dir / 'lib' + hipo_lib_dir = libhipo_install_dir / meson.project_name() / 'lib' hipo_lib_name = 'hipo4' install_subdir( hipo_include_dir, From 6d6690077bc7e6fe50eae56ac6f548c6fbf3e6ba Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 29 Oct 2025 15:32:13 -0400 Subject: [PATCH 058/113] fix: remove hipo installation step and script. --- .github/workflows/python.yml | 4 ---- install_hipo.sh | 14 -------------- 2 files changed, 18 deletions(-) delete mode 100755 install_hipo.sh diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 57af46d..06b024f 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -59,10 +59,6 @@ jobs: which install_name_tool which otool - - name: Install hipo - run: | - poetry run ./install_hipo.sh - - name: Build package wheel run: | poetry build diff --git a/install_hipo.sh b/install_hipo.sh deleted file mode 100755 index 1f46242..0000000 --- a/install_hipo.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -cd hipo - -# Copy from the hipo README -echo "meson setup build --prefix=`dirname $PWD` --reconfigure" -meson setup build --prefix=`dirname $PWD` --reconfigure -cd build -ninja # compiles -ninja install # installs to your specified prefix (../install/, in the example) -ninja test # runs the tests -ninja clean # clean the build directory, if you need to start over - -cd - From b8fc4a6e6f1ca6e92b9e1b0956226753116b7f93 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 29 Oct 2025 16:08:30 -0400 Subject: [PATCH 059/113] fix: Update workflow python run. --- .github/workflows/python.yml | 48 ++++++------------------------------ 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 06b024f..a378c5b 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python: ["3.9", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Checkout repository @@ -43,58 +43,24 @@ jobs: echo "Checking C++ code formatting..." poetry run clang-format --dry-run --Werror $(find src/ -name '*.cpp' -o -name '*.hpp') - - name: Install patchelf (Linux only) - if: runner.os == 'Linux' - run: | - sudo apt-get update - sudo apt-get install -y patchelf binutils - - - name: Ensure install_name_tool is available (macOS only) - if: runner.os == 'macOS' - run: | - # Make sure Xcode Command Line Tools are installed - xcode-select --install 2>/dev/null || true - - # Verify install_name_tool and otool exist - which install_name_tool - which otool - - name: Build package wheel run: | poetry build - name: Patch RPATHs in wheel run: | - WHEEL=$(ls dist/*.whl) - TMPDIR=dist_tmp - mkdir $TMPDIR - unzip "$WHEEL" -d "$TMPDIR" - if [[ "$RUNNER_OS" == "Linux" ]]; then - find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ - while IFS= read -r -d '' f; do - patchelf --print-rpath "$f" - patchelf --force-rpath --set-rpath '$ORIGIN/lib' "$f" - patchelf --print-rpath "$f" - done + pip install auditwheel + auditwheel repair -w repaired_dist/ dist/*.whl elif [[ "$RUNNER_OS" == "macOS" ]]; then - find "$TMPDIR/hipopybind" -type f -name "*.so*" -print0 | \ - while IFS= read -r -d '' f; do - otool -L "$f" - install_name_tool -add_rpath "@loader_path/lib" "$f" - otool -L "$f" - done + pip install delocate + delocate -w repaired_dist/ dist/*.whl fi - cd "$TMPDIR" - zip -r "../$WHEEL" . - cd .. - rm -rf $TPMDIR - - name: Install package wheel run: | - ls -lrth dist - poetry run pip install dist/*.whl + ls -lrth repaired_dist + poetry run pip install repaired_dist/*.whl - name: Run tests run: | From bd29675f814af80a20db69c762b6d198c08477c6 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 29 Oct 2025 16:08:44 -0400 Subject: [PATCH 060/113] fix: Update README. --- README.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 11c771b..c8b720c 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,27 @@ To install from PyPi run: pip install hipopybind ``` -To compile the library from source run the following: +Compiling the library from source is **platform dependent**. +On macos run: ```bash git clone --recurse-submodules https://github.com/mfmceneaney/hipopybind.git cd hipopybind -pip install poetry -poetry run ./install_hipo.sh -pip install . +pip install poetry delocate +poetry build +delocate -w repaired_dist/ dist/*.whl +pip install repaired_dist/*.whl +``` + +On linux run: + +```bash +git clone --recurse-submodules https://github.com/mfmceneaney/hipopybind.git +cd hipopybind +pip install poetry auditwheel +poetry build +auditwheel repair -w repaired_dist/ dist/*.whl +pip install repaired_dist/*.whl ``` # :rocket: Getting Started From f168242737a970da4f02cba6ee441c001f9d8ce5 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Wed, 29 Oct 2025 16:55:09 -0400 Subject: [PATCH 061/113] fix: Update CIBW_SKIP. --- .github/workflows/build-and-publish-wheels.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 908224d..69212bd 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -43,6 +43,7 @@ jobs: cibuildwheel --output-dir dist env: MACOSX_DEPLOYMENT_TARGET: 15.0 + CIBW_SKIP: "cp36-* cp37-*" - name: Install package wheel run: | From d31d27f33d3835d9f453d1a003439b9c5da0e292 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 13:57:52 -0400 Subject: [PATCH 062/113] fix: Update README. --- .github/workflows/build-and-publish-wheels.yml | 5 +++++ README.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 69212bd..d257f9b 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -21,6 +21,11 @@ jobs: with: submodules: recursive + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + - name: Install Poetry run: | python -m pip install --upgrade pip diff --git a/README.md b/README.md index c8b720c..51f64d1 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ git clone --recurse-submodules https://github.com/mfmceneaney/hipopybind.git cd hipopybind pip install poetry delocate poetry build -delocate -w repaired_dist/ dist/*.whl +delocate-wheel -w repaired_dist/ dist/*.whl pip install repaired_dist/*.whl ``` From dc511dcdf2b386fd85245649ce06c2d45ff0c5cc Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:26:04 -0400 Subject: [PATCH 063/113] fix: Fix python command. --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index a378c5b..d2949ee 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -54,7 +54,7 @@ jobs: auditwheel repair -w repaired_dist/ dist/*.whl elif [[ "$RUNNER_OS" == "macOS" ]]; then pip install delocate - delocate -w repaired_dist/ dist/*.whl + delocate-wheel -w repaired_dist/ dist/*.whl fi - name: Install package wheel From d27436c6dd8c19e68691bd6c2ac1ed18b26d15e9 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:26:34 -0400 Subject: [PATCH 064/113] fix: Update install directories. --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index c7fe31e..5f3d033 100644 --- a/meson.build +++ b/meson.build @@ -40,7 +40,7 @@ if not libhipo_dep.found() libhipo_src_dir = meson.project_source_root() / 'hipo' libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' - libhipo_install_dir = meson.current_source_dir() + libhipo_install_dir = meson.current_source_dir() / 'libhipo_install' # Run meson setup run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, @@ -53,7 +53,7 @@ if not libhipo_dep.found() # Assume libhipo_install_dir is a Meson File object or string path hipo_include_dir = 'include' - hipo_lib_dir = libhipo_install_dir / meson.project_name() / 'lib' + hipo_lib_dir = libhipo_install_dir / 'lib' hipo_lib_name = 'hipo4' install_subdir( hipo_include_dir, From 87710504da5580ce1780d3b42efa9ce2604a5764 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:27:10 -0400 Subject: [PATCH 065/113] fix: reduce number of python versions. --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index d2949ee..456bf74 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - python: ["3.9", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python: ["3.8"] steps: - name: Checkout repository From d846cbf276b6aa6ce3933ae4a759f3b32044466b Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:29:50 -0400 Subject: [PATCH 066/113] fix: Update meson build. --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 5f3d033..b84bc94 100644 --- a/meson.build +++ b/meson.build @@ -40,7 +40,7 @@ if not libhipo_dep.found() libhipo_src_dir = meson.project_source_root() / 'hipo' libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' - libhipo_install_dir = meson.current_source_dir() / 'libhipo_install' + libhipo_install_dir = meson.current_source_dir() # Run meson setup run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, @@ -53,7 +53,7 @@ if not libhipo_dep.found() # Assume libhipo_install_dir is a Meson File object or string path hipo_include_dir = 'include' - hipo_lib_dir = libhipo_install_dir / 'lib' + hipo_lib_dir = meson.current_source_dir() / 'lib' hipo_lib_name = 'hipo4' install_subdir( hipo_include_dir, From 16cc9d21fd2a8da774d6641c2d61074a0df104fa Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:33:15 -0400 Subject: [PATCH 067/113] fix: Add some additional output to workflow. --- .github/workflows/python.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 456bf74..3cb8427 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -51,9 +51,13 @@ jobs: run: | if [[ "$RUNNER_OS" == "Linux" ]]; then pip install auditwheel + auditwheel dist/*.whl + pwd auditwheel repair -w repaired_dist/ dist/*.whl elif [[ "$RUNNER_OS" == "macOS" ]]; then pip install delocate + delocate-listdeps dist/*.whl + pwd delocate-wheel -w repaired_dist/ dist/*.whl fi From 705baf071e991bcbbe0eabf60e5c161095f41894 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:37:33 -0400 Subject: [PATCH 068/113] fix: Fix matrix jobs in workflow. --- .github/workflows/python.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 3cb8427..accf011 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -7,8 +7,8 @@ on: jobs: test: - name: python-${{ matrix.python-version }} - runs-on: ubuntu-latest + name: python-${{ matrix.python }} + runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -25,7 +25,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python }} - name: Install Poetry run: | @@ -51,7 +51,7 @@ jobs: run: | if [[ "$RUNNER_OS" == "Linux" ]]; then pip install auditwheel - auditwheel dist/*.whl + auditwheel show dist/*.whl pwd auditwheel repair -w repaired_dist/ dist/*.whl elif [[ "$RUNNER_OS" == "macOS" ]]; then From 16d0940ee39de84369aff33b0bddcc7254f7660d Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:39:24 -0400 Subject: [PATCH 069/113] fix: Fix job name and python version. --- .github/workflows/python.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index accf011..2d3114f 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -7,14 +7,14 @@ on: jobs: test: - name: python-${{ matrix.python }} + name: python-${{ matrix.python }}-${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - python: ["3.8"] + python: ["3.9"] steps: - name: Checkout repository From 3e1074b86fcfa5bef853d2e95484c38004642d5f Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:50:19 -0400 Subject: [PATCH 070/113] fix: Update meson build to install shared libraries in same directory for auditwheel compliance. --- meson.build | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index b84bc94..836a529 100644 --- a/meson.build +++ b/meson.build @@ -32,7 +32,7 @@ if host_os == 'darwin' pybind_rpath = '@loader_path/lib' else # Linux and others - pybind_rpath = '$ORIGIN/lib' + pybind_rpath = '$ORIGIN' endif if not libhipo_dep.found() @@ -63,6 +63,16 @@ if not libhipo_dep.found() hipo_lib_dir, install_dir: hb_pkg_dir ) + if host_os == 'darwin': + install_data( + hipo_include_dir / 'libhipo4.so', + install_dir: hb_pkg_dir + ) + install_data( + hipo_include_dir / 'liblz4.1.so', + install_dir: hb_pkg_dir + ) + endif libhipo_dep = declare_dependency( include_directories: include_directories(hipo_include_dir), link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] From 3bf3cc64445db6dc1c3381e5a9ef0dce4ed4e74e Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:52:19 -0400 Subject: [PATCH 071/113] fix: Fix syntax error and conditional logic. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 836a529..658675b 100644 --- a/meson.build +++ b/meson.build @@ -63,7 +63,7 @@ if not libhipo_dep.found() hipo_lib_dir, install_dir: hb_pkg_dir ) - if host_os == 'darwin': + if host_os != 'darwin' install_data( hipo_include_dir / 'libhipo4.so', install_dir: hb_pkg_dir From 1b9ca7037d907ac50a9d1ab3edb472a308ce8d25 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 17:54:06 -0400 Subject: [PATCH 072/113] fix: Fix paths. --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 658675b..373de7f 100644 --- a/meson.build +++ b/meson.build @@ -65,11 +65,11 @@ if not libhipo_dep.found() ) if host_os != 'darwin' install_data( - hipo_include_dir / 'libhipo4.so', + hipo_lib_dir / 'libhipo4.so', install_dir: hb_pkg_dir ) install_data( - hipo_include_dir / 'liblz4.1.so', + hipo_lib_dir / 'liblz4.1.so', install_dir: hb_pkg_dir ) endif From 5e7c75e22ca9b0aa4eb8c08b73252baae8747475 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 18:22:35 -0400 Subject: [PATCH 073/113] fix: Fix linux build. --- meson.build | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index 373de7f..a519ea5 100644 --- a/meson.build +++ b/meson.build @@ -40,7 +40,7 @@ if not libhipo_dep.found() libhipo_src_dir = meson.project_source_root() / 'hipo' libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' - libhipo_install_dir = meson.current_source_dir() + libhipo_install_dir = meson.project_source_root() # Run meson setup run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, @@ -53,7 +53,7 @@ if not libhipo_dep.found() # Assume libhipo_install_dir is a Meson File object or string path hipo_include_dir = 'include' - hipo_lib_dir = meson.current_source_dir() / 'lib' + hipo_lib_dir = libhipo_install_dir / 'lib' hipo_lib_name = 'hipo4' install_subdir( hipo_include_dir, @@ -69,8 +69,9 @@ if not libhipo_dep.found() install_dir: hb_pkg_dir ) install_data( - hipo_lib_dir / 'liblz4.1.so', - install_dir: hb_pkg_dir + hipo_lib_dir / 'liblz4.so.1.9.4', + install_dir: hb_pkg_dir, + rename: 'liblz4.so' ) endif libhipo_dep = declare_dependency( From 2f313398066fbb5dfcdb2f089ea7d980920c0a8f Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 18:24:48 -0400 Subject: [PATCH 074/113] fix: Add debugging message in meson.build script. --- meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/meson.build b/meson.build index a519ea5..cc59da8 100644 --- a/meson.build +++ b/meson.build @@ -68,6 +68,7 @@ if not libhipo_dep.found() hipo_lib_dir / 'libhipo4.so', install_dir: hb_pkg_dir ) + run_command('ls', '-lrth', hipo_lib_dir) install_data( hipo_lib_dir / 'liblz4.so.1.9.4', install_dir: hb_pkg_dir, From f9b457c48c8be7a2b3746ebd6992f7c8bdd1b647 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 18:28:46 -0400 Subject: [PATCH 075/113] fix: Make lz4 installation conditional. --- meson.build | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/meson.build b/meson.build index cc59da8..2b5c41a 100644 --- a/meson.build +++ b/meson.build @@ -69,11 +69,14 @@ if not libhipo_dep.found() install_dir: hb_pkg_dir ) run_command('ls', '-lrth', hipo_lib_dir) - install_data( - hipo_lib_dir / 'liblz4.so.1.9.4', - install_dir: hb_pkg_dir, - rename: 'liblz4.so' - ) + lz4_path = hipo_lib_dir / 'liblz4.so.1.9.4' + if meson.is_file(lz4_path) + install_data( + lz4_path, + install_dir: hb_pkg_dir, + rename: 'liblz4.so' + ) + endif endif libhipo_dep = declare_dependency( include_directories: include_directories(hipo_include_dir), From 9f2e6d40bdb4b98734882673e26ddb6286f29048 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Thu, 30 Oct 2025 18:33:16 -0400 Subject: [PATCH 076/113] fix: use fs to check file. --- meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 2b5c41a..53a0d04 100644 --- a/meson.build +++ b/meson.build @@ -13,6 +13,7 @@ project( # meson modules pkg = import('pkgconfig') +fs = import('fs') #---------- Find python ----------# python = import('python').find_installation(pure: false) @@ -70,7 +71,7 @@ if not libhipo_dep.found() ) run_command('ls', '-lrth', hipo_lib_dir) lz4_path = hipo_lib_dir / 'liblz4.so.1.9.4' - if meson.is_file(lz4_path) + if fs.is_file(lz4_path) install_data( lz4_path, install_dir: hb_pkg_dir, From 21fd3fe73d9c7458e4fe952b656b93dceea9903a Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 00:40:29 -0400 Subject: [PATCH 077/113] fix: Fix extension module build to shared module and set all rpaths. --- meson.build | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 53a0d04..8a68431 100644 --- a/meson.build +++ b/meson.build @@ -87,13 +87,16 @@ endif # ---- Build the Python extension ---- install_data('src/__init__.py', install_dir: hb_pkg_dir) -pybind_module = python.extension_module('_core', +pybind_module = shared_module('_core', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], cpp_args: ['-DVERSION_INFO="@0@"'.format(meson.project_version())], install: true, install_dir: hb_pkg_dir, install_rpath: pybind_rpath, + build_rpath: pybind_rpath, + link_args: ['-Wl,-rpath,'+pybind_rpath], + name_prefix: '', ) # Export a dependency object for use as a subproject From 69fec529346ad8b159f78c5aa49ae883c2039900 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 00:42:15 -0400 Subject: [PATCH 078/113] fix: Install patchelf in workflow. --- .github/workflows/python.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 2d3114f..7ec20d6 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -50,14 +50,11 @@ jobs: - name: Patch RPATHs in wheel run: | if [[ "$RUNNER_OS" == "Linux" ]]; then - pip install auditwheel - auditwheel show dist/*.whl - pwd + pip install auditwheel patchelf auditwheel repair -w repaired_dist/ dist/*.whl elif [[ "$RUNNER_OS" == "macOS" ]]; then pip install delocate delocate-listdeps dist/*.whl - pwd delocate-wheel -w repaired_dist/ dist/*.whl fi From 76911d8dc902c76b2a365f6967e007c4c1cbec07 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 01:03:52 -0400 Subject: [PATCH 079/113] fix: Fix macos build. --- meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/meson.build b/meson.build index 8a68431..1b66a44 100644 --- a/meson.build +++ b/meson.build @@ -97,6 +97,7 @@ pybind_module = shared_module('_core', build_rpath: pybind_rpath, link_args: ['-Wl,-rpath,'+pybind_rpath], name_prefix: '', + name_suffix: 'so', ) # Export a dependency object for use as a subproject From d401b1a6a5ebcfdce41ad1bc0ffa96be496ab5d2 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 01:06:48 -0400 Subject: [PATCH 080/113] fix: Add additional python version to workflow. --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 7ec20d6..7df040d 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - python: ["3.9"] + python: ["3.9","3.10","3.11","3.12","3.13","3.14"] steps: - name: Checkout repository From 763533b128fdc1522fcbb04c2909d0ac333f8523 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 01:17:56 -0400 Subject: [PATCH 081/113] fix: Remove link_args which will become deprecated and a hard error. --- meson.build | 1 - 1 file changed, 1 deletion(-) diff --git a/meson.build b/meson.build index 1b66a44..1c56dc7 100644 --- a/meson.build +++ b/meson.build @@ -95,7 +95,6 @@ pybind_module = shared_module('_core', install_dir: hb_pkg_dir, install_rpath: pybind_rpath, build_rpath: pybind_rpath, - link_args: ['-Wl,-rpath,'+pybind_rpath], name_prefix: '', name_suffix: 'so', ) From adcec62d6541d44766728cf6e88b3863eca27a70 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 01:22:27 -0400 Subject: [PATCH 082/113] fix: Skip musllinux builds. --- .github/workflows/build-and-publish-wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index d257f9b..84e4188 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -48,7 +48,7 @@ jobs: cibuildwheel --output-dir dist env: MACOSX_DEPLOYMENT_TARGET: 15.0 - CIBW_SKIP: "cp36-* cp37-*" + CIBW_SKIP: "pp* *-musllinux* cp36-* cp37-*" - name: Install package wheel run: | From a32be4dd33224c66f7e8817220d53310c602573f Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 01:33:55 -0400 Subject: [PATCH 083/113] fix: Set homebrew environment variables to empty strings so that lz4 installation not found on macos workflows. --- .github/workflows/build-and-publish-wheels.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 84e4188..cd2a4e7 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -49,6 +49,9 @@ jobs: env: MACOSX_DEPLOYMENT_TARGET: 15.0 CIBW_SKIP: "pp* *-musllinux* cp36-* cp37-*" + HOMEBREW_PREFIX: "" + HOMEBREW_CELLAR: "" + HOMEBREW_REPOSITORY: "" - name: Install package wheel run: | From a8e62551bc3af483439201fae77e4b9caee227f3 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 01:45:50 -0400 Subject: [PATCH 084/113] fix: Update workflow to not install all package wheels. --- .github/workflows/build-and-publish-wheels.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index cd2a4e7..913fade 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -48,20 +48,11 @@ jobs: cibuildwheel --output-dir dist env: MACOSX_DEPLOYMENT_TARGET: 15.0 - CIBW_SKIP: "pp* *-musllinux* cp36-* cp37-*" + CIBW_SKIP: "pp* *-musllinux* cp36-* cp37-* cp38-*" HOMEBREW_PREFIX: "" HOMEBREW_CELLAR: "" HOMEBREW_REPOSITORY: "" - - name: Install package wheel - run: | - ls -lrth dist - poetry run pip install dist/*.whl - - - name: Run tests - run: | - poetry run pytest --maxfail=1 --disable-warnings -q - - name: Upload built wheels uses: actions/upload-artifact@v4 with: From 984f69a4fd7b768055015bd471a9f85795269dac Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 01:51:08 -0400 Subject: [PATCH 085/113] fix: Reset PKG_CONFIG_PATH for workflow builds. --- .github/workflows/build-and-publish-wheels.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 913fade..4b933c2 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -52,6 +52,7 @@ jobs: HOMEBREW_PREFIX: "" HOMEBREW_CELLAR: "" HOMEBREW_REPOSITORY: "" + PKG_CONFIG_PATH: "" - name: Upload built wheels uses: actions/upload-artifact@v4 From 702f5906f4ad79f5a5ff4604c7b483b66f8b761b Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 02:01:18 -0400 Subject: [PATCH 086/113] fix: Do not set macos deployment target. --- .github/workflows/build-and-publish-wheels.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 4b933c2..80ebfcd 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -47,7 +47,6 @@ jobs: pip install cibuildwheel cibuildwheel --output-dir dist env: - MACOSX_DEPLOYMENT_TARGET: 15.0 CIBW_SKIP: "pp* *-musllinux* cp36-* cp37-* cp38-*" HOMEBREW_PREFIX: "" HOMEBREW_CELLAR: "" From 973127a5c761425cfd0de0b2a88bfb798146f126 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 02:14:54 -0400 Subject: [PATCH 087/113] fix: Specify macos deployment target and archs for cibw. --- .github/workflows/build-and-publish-wheels.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 80ebfcd..3c70580 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -47,6 +47,8 @@ jobs: pip install cibuildwheel cibuildwheel --output-dir dist env: + CIBW_ARCHS_MACOS: "universal2" + MACOSX_DEPLOYMENT_TARGET: '15.0' CIBW_SKIP: "pp* *-musllinux* cp36-* cp37-* cp38-*" HOMEBREW_PREFIX: "" HOMEBREW_CELLAR: "" From 74dc3707a6bbc1cd8f267f7481f466d2e2b82c38 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 10:11:00 -0400 Subject: [PATCH 088/113] fix: Build both macos architectures separately in workflow. --- .github/workflows/build-and-publish-wheels.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 3c70580..bd818ba 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -45,9 +45,13 @@ jobs: - name: Build package wheel run: | pip install cibuildwheel - cibuildwheel --output-dir dist + if [[ "$RUNNER_OS" == "Linux" ]]; then + cibuildwheel --output-dir dist --platform linux + elif [[ "$RUNNER_OS" == "macOS" ]]; then + cibuildwheel --output-dir dist --platform macos --archs arm64 + cibuildwheel --output-dir dist --platform macos --archs x86_64 + fi env: - CIBW_ARCHS_MACOS: "universal2" MACOSX_DEPLOYMENT_TARGET: '15.0' CIBW_SKIP: "pp* *-musllinux* cp36-* cp37-* cp38-*" HOMEBREW_PREFIX: "" From 45b6be3bd90d0727598aece9d322670ee700b33a Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 10:46:01 -0400 Subject: [PATCH 089/113] fix: Fix macos x86_64 compilation in github workflow. --- .../workflows/build-and-publish-wheels.yml | 4 +- cross_x86_64_macos.txt | 38 +++++++++++++++++++ meson.build | 13 +++++-- meson_options.txt | 6 +++ 4 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 cross_x86_64_macos.txt diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index bd818ba..01c21a6 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -48,8 +48,8 @@ jobs: if [[ "$RUNNER_OS" == "Linux" ]]; then cibuildwheel --output-dir dist --platform linux elif [[ "$RUNNER_OS" == "macOS" ]]; then - cibuildwheel --output-dir dist --platform macos --archs arm64 - cibuildwheel --output-dir dist --platform macos --archs x86_64 + MESON_ARGS="-Dmacos_arch=arm64" cibuildwheel --output-dir dist --platform macos --archs arm64 + MESON_ARGS="-Dmacos_arch=x86_64" cibuildwheel --output-dir dist --platform macos --archs x86_64 fi env: MACOSX_DEPLOYMENT_TARGET: '15.0' diff --git a/cross_x86_64_macos.txt b/cross_x86_64_macos.txt new file mode 100644 index 0000000..d0ed541 --- /dev/null +++ b/cross_x86_64_macos.txt @@ -0,0 +1,38 @@ +# cross_x86_64_macos.txt +# Cross compilation configuration for building x86_64 binaries on an arm64 macOS host. + +[binaries] +c = 'clang' +cpp = 'clang++' +ar = 'ar' +strip = 'strip' +pkgconfig = 'pkg-config' + +[properties] +# Tell Meson we’re cross-compiling for macOS x86_64 +needs_exe_wrapper = false +has_function_printf = true +skip_sanity_check = false +sys_root = '/' +c_args = ['-arch', 'x86_64'] +cpp_args = ['-arch', 'x86_64'] +c_link_args = ['-arch', 'x86_64'] +cpp_link_args = ['-arch', 'x86_64'] + +[host_machine] +system = 'darwin' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' + +[target_machine] +system = 'darwin' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' + +[build_machine] +system = 'darwin' +cpu_family = 'arm64' +cpu = 'arm64' +endian = 'little' diff --git a/meson.build b/meson.build index 1c56dc7..8daa1c2 100644 --- a/meson.build +++ b/meson.build @@ -44,9 +44,16 @@ if not libhipo_dep.found() libhipo_install_dir = meson.project_source_root() # Run meson setup - run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, - '--prefix=' + libhipo_install_dir, - check: true) + if host_os == 'darwin' and get_option('macos_arch') == 'x86_64' + run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, + '--prefix=' + libhipo_install_dir, + '--cross-file cross_x86_64_macos.txt', + check: true) + else + run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, + '--prefix=' + libhipo_install_dir, + check: true) + endif # Compile and install run_command('meson', 'compile', '-C', libhipo_build_dir, check: true) diff --git a/meson_options.txt b/meson_options.txt index b1e29b5..6486701 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1 +1,7 @@ option('build_type', type: 'combo', choices: ['debug', 'release'], value: 'release') +option( + 'macos_arch', + type: 'string', + value: '', + description: 'Target macOS architecture (arm64 or x86_64)' +) \ No newline at end of file From b2607500cef32f6fd1220151f00df626cd492083 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 11:01:11 -0400 Subject: [PATCH 090/113] fix: Update cross compilation. --- cross_x86_64_macos.txt | 6 ------ meson.build | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/cross_x86_64_macos.txt b/cross_x86_64_macos.txt index d0ed541..1c47aad 100644 --- a/cross_x86_64_macos.txt +++ b/cross_x86_64_macos.txt @@ -25,12 +25,6 @@ cpu_family = 'x86_64' cpu = 'x86_64' endian = 'little' -[target_machine] -system = 'darwin' -cpu_family = 'x86_64' -cpu = 'x86_64' -endian = 'little' - [build_machine] system = 'darwin' cpu_family = 'arm64' diff --git a/meson.build b/meson.build index 8daa1c2..04f5c62 100644 --- a/meson.build +++ b/meson.build @@ -47,7 +47,7 @@ if not libhipo_dep.found() if host_os == 'darwin' and get_option('macos_arch') == 'x86_64' run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, '--prefix=' + libhipo_install_dir, - '--cross-file cross_x86_64_macos.txt', + '--cross-file', 'cross_x86_64_macos.txt', check: true) else run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, From 748539c9c75cce8d850eec6fbd0c90a164a3aefd Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 11:17:27 -0400 Subject: [PATCH 091/113] fix: Updated cibuildwheel ordering for macos archs builds and added messages in build script. --- .github/workflows/build-and-publish-wheels.yml | 2 +- meson.build | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 01c21a6..97e9d9d 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -48,8 +48,8 @@ jobs: if [[ "$RUNNER_OS" == "Linux" ]]; then cibuildwheel --output-dir dist --platform linux elif [[ "$RUNNER_OS" == "macOS" ]]; then - MESON_ARGS="-Dmacos_arch=arm64" cibuildwheel --output-dir dist --platform macos --archs arm64 MESON_ARGS="-Dmacos_arch=x86_64" cibuildwheel --output-dir dist --platform macos --archs x86_64 + MESON_ARGS="-Dmacos_arch=arm64" cibuildwheel --output-dir dist --platform macos --archs arm64 fi env: MACOSX_DEPLOYMENT_TARGET: '15.0' diff --git a/meson.build b/meson.build index 04f5c62..28ed618 100644 --- a/meson.build +++ b/meson.build @@ -44,7 +44,10 @@ if not libhipo_dep.found() libhipo_install_dir = meson.project_source_root() # Run meson setup - if host_os == 'darwin' and get_option('macos_arch') == 'x86_64' + macos_arch = get_option('macos_arch') + message('macos_arch = @0@'.format(macos_arch)) + if host_os == 'darwin' and macos_arch == 'x86_64' + message('Building for macos_arch==x86_64') run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, '--prefix=' + libhipo_install_dir, '--cross-file', 'cross_x86_64_macos.txt', From aeddf392e4ffea91eb5a1312f0167b3dd7ddec85 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 11:28:46 -0400 Subject: [PATCH 092/113] fix: Set meson args in environment directly. --- .github/workflows/build-and-publish-wheels.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 97e9d9d..38c3f95 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -48,8 +48,10 @@ jobs: if [[ "$RUNNER_OS" == "Linux" ]]; then cibuildwheel --output-dir dist --platform linux elif [[ "$RUNNER_OS" == "macOS" ]]; then - MESON_ARGS="-Dmacos_arch=x86_64" cibuildwheel --output-dir dist --platform macos --archs x86_64 - MESON_ARGS="-Dmacos_arch=arm64" cibuildwheel --output-dir dist --platform macos --archs arm64 + export MESON_ARGS="-Dmacos_arch=x86_64" + cibuildwheel --output-dir dist --platform macos --archs x86_64 + export MESON_ARGS="-Dmacos_arch=arm64" + cibuildwheel --output-dir dist --platform macos --archs arm64 fi env: MACOSX_DEPLOYMENT_TARGET: '15.0' From 3c3b32deb34fe1b69b3555bfee608bf73d59ae04 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 11:46:57 -0400 Subject: [PATCH 093/113] fix: Add meson arguments to the CIBW_ENVIRONEMNT. --- .github/workflows/build-and-publish-wheels.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 38c3f95..2bb3870 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -48,10 +48,8 @@ jobs: if [[ "$RUNNER_OS" == "Linux" ]]; then cibuildwheel --output-dir dist --platform linux elif [[ "$RUNNER_OS" == "macOS" ]]; then - export MESON_ARGS="-Dmacos_arch=x86_64" - cibuildwheel --output-dir dist --platform macos --archs x86_64 - export MESON_ARGS="-Dmacos_arch=arm64" - cibuildwheel --output-dir dist --platform macos --archs arm64 + CIBW_ENVIRONMENT="MESON_ARGS='-Dmacos_arch=x86_64'" cibuildwheel --output-dir dist --platform macos --archs x86_64 + CIBW_ENVIRONMENT="MESON_ARGS='-Dmacos_arch=arm64'" cibuildwheel --output-dir dist --platform macos --archs arm64 fi env: MACOSX_DEPLOYMENT_TARGET: '15.0' From a14f3f6ba71ed96ce578cb2c1520ac6b1b7c4724 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 12:06:15 -0400 Subject: [PATCH 094/113] fix: Fix how args are passed from cibuildwheel to meson-python. --- .github/workflows/build-and-publish-wheels.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 2bb3870..4750010 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -48,8 +48,8 @@ jobs: if [[ "$RUNNER_OS" == "Linux" ]]; then cibuildwheel --output-dir dist --platform linux elif [[ "$RUNNER_OS" == "macOS" ]]; then - CIBW_ENVIRONMENT="MESON_ARGS='-Dmacos_arch=x86_64'" cibuildwheel --output-dir dist --platform macos --archs x86_64 - CIBW_ENVIRONMENT="MESON_ARGS='-Dmacos_arch=arm64'" cibuildwheel --output-dir dist --platform macos --archs arm64 + CIBW_CONFIG_SETTINGS="setup-args=-Dmacos_arch=x86_64" cibuildwheel --output-dir dist --platform macos --archs x86_64 + CIBW_CONFIG_SETTINGS="setup-args=-Dmacos_arch=arm64" cibuildwheel --output-dir dist --platform macos --archs arm64 fi env: MACOSX_DEPLOYMENT_TARGET: '15.0' From d5d6b766bfba039ee3226bcd6c743e250476c52a Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 12:22:29 -0400 Subject: [PATCH 095/113] fix: Update deprecated block in cross file. --- cross_x86_64_macos.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cross_x86_64_macos.txt b/cross_x86_64_macos.txt index 1c47aad..fc1f8fa 100644 --- a/cross_x86_64_macos.txt +++ b/cross_x86_64_macos.txt @@ -14,6 +14,8 @@ needs_exe_wrapper = false has_function_printf = true skip_sanity_check = false sys_root = '/' + +[built-in options] c_args = ['-arch', 'x86_64'] cpp_args = ['-arch', 'x86_64'] c_link_args = ['-arch', 'x86_64'] From 418dc404d6e6842e6d7220d7eca5a94cde0076e1 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 12:22:55 -0400 Subject: [PATCH 096/113] fix: Pass environment to run_command meson calls. --- meson.build | 2 ++ 1 file changed, 2 insertions(+) diff --git a/meson.build b/meson.build index 28ed618..305d2c3 100644 --- a/meson.build +++ b/meson.build @@ -51,10 +51,12 @@ if not libhipo_dep.found() run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, '--prefix=' + libhipo_install_dir, '--cross-file', 'cross_x86_64_macos.txt', + env: environment(), check: true) else run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, '--prefix=' + libhipo_install_dir, + env: environment(), check: true) endif From 5653b2d4e5a1804eb5c6ac3d1b62fc3bb3f01dd8 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 13:49:20 -0400 Subject: [PATCH 097/113] fix: Update README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 51f64d1..852f182 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ custom classes and functions from C++ via [pybind11](https://github.com/pybind/p ## Prerequisites +* macos or linux, windows is **not** supported * Python >=3.9 * A compiler with C++17 support * Ninja or Pip 10+ From 5c269cf69289b42434d51ad2056388dff1fe84ec Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 13:49:43 -0400 Subject: [PATCH 098/113] fix: Update pkg-config specification in cross compilation file. --- cross_x86_64_macos.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cross_x86_64_macos.txt b/cross_x86_64_macos.txt index fc1f8fa..a534311 100644 --- a/cross_x86_64_macos.txt +++ b/cross_x86_64_macos.txt @@ -6,7 +6,7 @@ c = 'clang' cpp = 'clang++' ar = 'ar' strip = 'strip' -pkgconfig = 'pkg-config' +pkg-config = 'pkg-config' [properties] # Tell Meson we’re cross-compiling for macOS x86_64 From 5a6f769701565f6e8436f9f5ebb8fa96995358cf Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 13:50:05 -0400 Subject: [PATCH 099/113] fix: Dump environment in meson.build script. --- meson.build | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 305d2c3..2471bf0 100644 --- a/meson.build +++ b/meson.build @@ -43,9 +43,11 @@ if not libhipo_dep.found() libhipo_build_dir = meson.current_build_dir() / 'libhipo_build' libhipo_install_dir = meson.project_source_root() - # Run meson setup + # Run meson setup with workaround for macos x86_64 architecture if you are building on arm64 macos_arch = get_option('macos_arch') message('macos_arch = @0@'.format(macos_arch)) + env_cmd = run_command('printenv', env: environment(), check: true) + message('Current environment:\n' + env_cmd.stdout()) if host_os == 'darwin' and macos_arch == 'x86_64' message('Building for macos_arch==x86_64') run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, @@ -81,7 +83,7 @@ if not libhipo_dep.found() hipo_lib_dir / 'libhipo4.so', install_dir: hb_pkg_dir ) - run_command('ls', '-lrth', hipo_lib_dir) + run_command('ls', '-lrth', hipo_lib_dir, check: true) lz4_path = hipo_lib_dir / 'liblz4.so.1.9.4' if fs.is_file(lz4_path) install_data( From 6e0e1a8da2c9d8b369d4963e55dc9e88845afc30 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 13:50:30 -0400 Subject: [PATCH 100/113] fix: Explicitly set CIBW_ENVIRONMENT in workflow. --- .github/workflows/build-and-publish-wheels.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 4750010..b01948a 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -58,6 +58,7 @@ jobs: HOMEBREW_CELLAR: "" HOMEBREW_REPOSITORY: "" PKG_CONFIG_PATH: "" + CIBW_ENVIRONMENT: "HOMEBREW_PREFIX='' HOMEBREW_CELLAR='' HOMEBREW_REPOSITORY='' PKG_CONFIG_PATH=''" - name: Upload built wheels uses: actions/upload-artifact@v4 From d98ee09f9ef341db91cb2dea5b2429d5ce10bd23 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 14:12:33 -0400 Subject: [PATCH 101/113] fix: Disable pkg-config lookups for macos arch x86_64 builds. --- cross_x86_64_macos.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cross_x86_64_macos.txt b/cross_x86_64_macos.txt index a534311..910be61 100644 --- a/cross_x86_64_macos.txt +++ b/cross_x86_64_macos.txt @@ -6,7 +6,7 @@ c = 'clang' cpp = 'clang++' ar = 'ar' strip = 'strip' -pkg-config = 'pkg-config' +pkgconfig = '/bin/true' # disables pkg-config lookups [properties] # Tell Meson we’re cross-compiling for macOS x86_64 From 3daa41dfec554d164f3e202017e3c7ae006758ae Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 14:48:25 -0400 Subject: [PATCH 102/113] fix: Bump version. --- meson.build | 2 +- pyproject.toml | 2 +- src/__init__.py | 2 +- tests/test_basic.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index 2471bf0..088004c 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'hipopybind', 'cpp', - version: '2.0.0', + version: '2.0.1', license: 'MIT', meson_version: '>=1.2', default_options: [ diff --git a/pyproject.toml b/pyproject.toml index 2e75fa4..25ec6bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ build-backend = 'mesonpy' [tool.poetry] name = "hipopybind" -version = "2.0.0" +version = "2.0.1" description = "Python bindings for hipo using pybind11" authors = ["Matthew McEneaney "] repository = "https://github.com/mfmceneaney/hipopybind.git" diff --git a/src/__init__.py b/src/__init__.py index 16610d0..7daa176 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,2 +1,2 @@ -__version__="2.0.0" +__version__="2.0.1" from ._core import * diff --git a/tests/test_basic.py b/tests/test_basic.py index f642a26..fbbd680 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,4 +1,4 @@ import hipopybind as m def test_main(): - assert m.__version__ == "2.0.0" + assert m.__version__ == "2.0.1" From 514df82e981488fe64e72d4a1961cd51a3ecff7e Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 14:52:15 -0400 Subject: [PATCH 103/113] fix: Only trigger publishing build on tags on main. --- .github/workflows/build-and-publish-wheels.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index b01948a..573ae80 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -2,6 +2,7 @@ name: Build and Publish Wheels on: push: + branches: ['main'] tags: - "v*" # Build & publish on version tags (e.g. v1.2.3) workflow_dispatch: # Allow manual trigger From e12fae9c8fb81567f5b940d36f93c2b134b6723e Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 15:17:18 -0400 Subject: [PATCH 104/113] fix: Include static c++/gcc libs in wheels and use test version. --- .github/workflows/build-and-publish-wheels.yml | 1 - meson.build | 3 ++- pyproject.toml | 2 +- src/__init__.py | 2 +- tests/test_basic.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 573ae80..b01948a 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -2,7 +2,6 @@ name: Build and Publish Wheels on: push: - branches: ['main'] tags: - "v*" # Build & publish on version tags (e.g. v1.2.3) workflow_dispatch: # Allow manual trigger diff --git a/meson.build b/meson.build index 088004c..cc3d549 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'hipopybind', 'cpp', - version: '2.0.1', + version: '1.9.9', license: 'MIT', meson_version: '>=1.2', default_options: [ @@ -105,6 +105,7 @@ pybind_module = shared_module('_core', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], cpp_args: ['-DVERSION_INFO="@0@"'.format(meson.project_version())], + link_args: ['-static-libstdc++', '-static-libgcc'], install: true, install_dir: hb_pkg_dir, install_rpath: pybind_rpath, diff --git a/pyproject.toml b/pyproject.toml index 25ec6bf..ea70d82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ build-backend = 'mesonpy' [tool.poetry] name = "hipopybind" -version = "2.0.1" +version = "1.9.9" description = "Python bindings for hipo using pybind11" authors = ["Matthew McEneaney "] repository = "https://github.com/mfmceneaney/hipopybind.git" diff --git a/src/__init__.py b/src/__init__.py index 7daa176..8bc3638 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,2 +1,2 @@ -__version__="2.0.1" +__version__="1.9.9" from ._core import * diff --git a/tests/test_basic.py b/tests/test_basic.py index fbbd680..b277da5 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,4 +1,4 @@ import hipopybind as m def test_main(): - assert m.__version__ == "2.0.1" + assert m.__version__ == "1.9.9" From cb248d6544fe8c727925696650a27198a7513187 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 15:35:20 -0400 Subject: [PATCH 105/113] fix: Only link static cpp libraries for linux builds and remove environment dump. --- meson.build | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index cc3d549..c9d418d 100644 --- a/meson.build +++ b/meson.build @@ -46,8 +46,6 @@ if not libhipo_dep.found() # Run meson setup with workaround for macos x86_64 architecture if you are building on arm64 macos_arch = get_option('macos_arch') message('macos_arch = @0@'.format(macos_arch)) - env_cmd = run_command('printenv', env: environment(), check: true) - message('Current environment:\n' + env_cmd.stdout()) if host_os == 'darwin' and macos_arch == 'x86_64' message('Building for macos_arch==x86_64') run_command('meson', 'setup', libhipo_build_dir, libhipo_src_dir, @@ -100,12 +98,22 @@ if not libhipo_dep.found() endif # ---- Build the Python extension ---- + +# Install the python init script so your python installation can find the package install_data('src/__init__.py', install_dir: hb_pkg_dir) + +# Set link args to include GNU libstdc++ and libgcc on linux +link_args = [] +if host_os != 'darwin' + link_args += ['-static-libstdc++', '-static-libgcc'] +endif + +# Compile the shared module pybind_module = shared_module('_core', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], cpp_args: ['-DVERSION_INFO="@0@"'.format(meson.project_version())], - link_args: ['-static-libstdc++', '-static-libgcc'], + link_args: link_args, install: true, install_dir: hb_pkg_dir, install_rpath: pybind_rpath, From e25ed273e7ce67588d1328b45e26ad80b79611a2 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 16:57:25 -0400 Subject: [PATCH 106/113] fix: Remove the GNU gcc link args. --- meson.build | 7 ------- 1 file changed, 7 deletions(-) diff --git a/meson.build b/meson.build index c9d418d..efb17dc 100644 --- a/meson.build +++ b/meson.build @@ -102,18 +102,11 @@ endif # Install the python init script so your python installation can find the package install_data('src/__init__.py', install_dir: hb_pkg_dir) -# Set link args to include GNU libstdc++ and libgcc on linux -link_args = [] -if host_os != 'darwin' - link_args += ['-static-libstdc++', '-static-libgcc'] -endif - # Compile the shared module pybind_module = shared_module('_core', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], cpp_args: ['-DVERSION_INFO="@0@"'.format(meson.project_version())], - link_args: link_args, install: true, install_dir: hb_pkg_dir, install_rpath: pybind_rpath, From 86ca020a994d330ada6ec343791985e7aba7a00e Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Fri, 31 Oct 2025 18:58:51 -0400 Subject: [PATCH 107/113] INCOMPLETE: just recording progress on renaming libhipo4 so far... --- meson.build | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/meson.build b/meson.build index efb17dc..561a42f 100644 --- a/meson.build +++ b/meson.build @@ -62,12 +62,17 @@ if not libhipo_dep.found() # Compile and install run_command('meson', 'compile', '-C', libhipo_build_dir, check: true) - run_command('meson', 'install', '-C', libhipo_build_dir, check: true) + hipo_install_target = run_command('meson', 'install', '-C', libhipo_build_dir, check: true) # Assume libhipo_install_dir is a Meson File object or string path hipo_include_dir = 'include' - hipo_lib_dir = libhipo_install_dir / 'lib' + lib_dir = 'lib' + hipo_lib_dir = libhipo_install_dir / lib_dir hipo_lib_name = 'hipo4' + lz4_lib_name = 'lz4' + new_hipo_lib_name = hipo_lib_name + 'pybind11' + + # Install include directory install_subdir( hipo_include_dir, install_dir: hb_pkg_dir @@ -76,24 +81,40 @@ if not libhipo_dep.found() hipo_lib_dir, install_dir: hb_pkg_dir ) + + # Set file extension + file_ext = '.dylib' if host_os != 'darwin' + file_ext = '.so' + endif + + # Copy hipo4 into main directory and rename to avoid loading conflicts + # if another library loads libhipo4 from another place + hipo4_path = join_paths(hipo_lib_dir, 'lib'+hipo_lib_name+file_ext) + new_hipo_lib_fname = 'lib'+new_hipo_lib_name+file_ext + new_hipo4_path = hipo_lib_dir / new_hipo_lib_fname + rename_libhipo4 = custom_target( + 'rename_libhipo4', + input : hipo4_path, # the built library + output: new_hipo_lib_fname, # just a filename, no directories + command: ['mv', '@INPUT@', '@OUTPUT@'], + build_by_default: true, + install_dir: host_os=='darwin' ? hb_pkg_dir / 'lib' : hb_pkg_dir , + ) + + # Copy lz4 into main directory if it exists + lz4_path = join_paths(hipo_lib_dir, 'lib'+lz4_lib_name+file_ext+'.1.9.4') + if fs.is_file(lz4_path) install_data( - hipo_lib_dir / 'libhipo4.so', + lz4_path, install_dir: hb_pkg_dir ) - run_command('ls', '-lrth', hipo_lib_dir, check: true) - lz4_path = hipo_lib_dir / 'liblz4.so.1.9.4' - if fs.is_file(lz4_path) - install_data( - lz4_path, - install_dir: hb_pkg_dir, - rename: 'liblz4.so' - ) - endif endif + + # Declare hipo dependency libhipo_dep = declare_dependency( include_directories: include_directories(hipo_include_dir), - link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] + link_args: ['-L' + hipo_lib_dir, '-l'+new_hipo_lib_name, '-rpath', pybind_rpath], ) endif From 721e35acd6df4bb81da0cc47d063598701c86f25 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Mon, 3 Nov 2025 10:44:45 -0500 Subject: [PATCH 108/113] fix: Update meson build to hide imported symbols in shared library. --- meson.build | 61 +++++++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/meson.build b/meson.build index 561a42f..78c0a3c 100644 --- a/meson.build +++ b/meson.build @@ -62,17 +62,12 @@ if not libhipo_dep.found() # Compile and install run_command('meson', 'compile', '-C', libhipo_build_dir, check: true) - hipo_install_target = run_command('meson', 'install', '-C', libhipo_build_dir, check: true) + run_command('meson', 'install', '-C', libhipo_build_dir, check: true) # Assume libhipo_install_dir is a Meson File object or string path hipo_include_dir = 'include' - lib_dir = 'lib' - hipo_lib_dir = libhipo_install_dir / lib_dir + hipo_lib_dir = libhipo_install_dir / 'lib' hipo_lib_name = 'hipo4' - lz4_lib_name = 'lz4' - new_hipo_lib_name = hipo_lib_name + 'pybind11' - - # Install include directory install_subdir( hipo_include_dir, install_dir: hb_pkg_dir @@ -81,40 +76,24 @@ if not libhipo_dep.found() hipo_lib_dir, install_dir: hb_pkg_dir ) - - # Set file extension - file_ext = '.dylib' if host_os != 'darwin' - file_ext = '.so' - endif - - # Copy hipo4 into main directory and rename to avoid loading conflicts - # if another library loads libhipo4 from another place - hipo4_path = join_paths(hipo_lib_dir, 'lib'+hipo_lib_name+file_ext) - new_hipo_lib_fname = 'lib'+new_hipo_lib_name+file_ext - new_hipo4_path = hipo_lib_dir / new_hipo_lib_fname - rename_libhipo4 = custom_target( - 'rename_libhipo4', - input : hipo4_path, # the built library - output: new_hipo_lib_fname, # just a filename, no directories - command: ['mv', '@INPUT@', '@OUTPUT@'], - build_by_default: true, - install_dir: host_os=='darwin' ? hb_pkg_dir / 'lib' : hb_pkg_dir , - ) - - # Copy lz4 into main directory if it exists - lz4_path = join_paths(hipo_lib_dir, 'lib'+lz4_lib_name+file_ext+'.1.9.4') - if fs.is_file(lz4_path) install_data( - lz4_path, + hipo_lib_dir / 'libhipo4.so', install_dir: hb_pkg_dir ) + run_command('ls', '-lrth', hipo_lib_dir, check: true) + lz4_path = hipo_lib_dir / 'liblz4.so.1.9.4' + if fs.is_file(lz4_path) + install_data( + lz4_path, + install_dir: hb_pkg_dir, + rename: 'liblz4.so' + ) + endif endif - - # Declare hipo dependency libhipo_dep = declare_dependency( include_directories: include_directories(hipo_include_dir), - link_args: ['-L' + hipo_lib_dir, '-l'+new_hipo_lib_name, '-rpath', pybind_rpath], + link_args: ['-L' + hipo_lib_dir, '-l' + hipo_lib_name] ) endif @@ -123,11 +102,23 @@ endif # Install the python init script so your python installation can find the package install_data('src/__init__.py', install_dir: hb_pkg_dir) +# Set link args based on os +py_mod_link_args = [] +if host_os == 'darwin' + py_mod_link_args += ['-Wl,-exported_symbol,_PyInit__core'] # explicitly export python module init function +else + py_mod_link_args += ['-Wl,--exclude-libs,ALL'] # don't re-export linked libs +endif + # Compile the shared module pybind_module = shared_module('_core', 'src/hipopybind_module.cpp', dependencies: [pybind11_dep, libhipo_dep], - cpp_args: ['-DVERSION_INFO="@0@"'.format(meson.project_version())], + cpp_args: [ + '-DVERSION_INFO="@0@"'.format(meson.project_version()), + '-fvisibility=hidden' + ], # hide all internal symbols + link_args: py_mod_link_args, install: true, install_dir: hb_pkg_dir, install_rpath: pybind_rpath, From d98ffb953c6da0f85b855614e9ac26c7a91614f8 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Mon, 3 Nov 2025 11:01:57 -0500 Subject: [PATCH 109/113] fix: Update project version. --- meson.build | 2 +- pyproject.toml | 2 +- src/__init__.py | 2 +- tests/test_basic.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index 78c0a3c..30d646a 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'hipopybind', 'cpp', - version: '1.9.9', + version: '1.9.10', license: 'MIT', meson_version: '>=1.2', default_options: [ diff --git a/pyproject.toml b/pyproject.toml index ea70d82..f88e0d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ build-backend = 'mesonpy' [tool.poetry] name = "hipopybind" -version = "1.9.9" +version = "1.9.10" description = "Python bindings for hipo using pybind11" authors = ["Matthew McEneaney "] repository = "https://github.com/mfmceneaney/hipopybind.git" diff --git a/src/__init__.py b/src/__init__.py index 8bc3638..0638ad3 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,2 +1,2 @@ -__version__="1.9.9" +__version__="1.9.10" from ._core import * diff --git a/tests/test_basic.py b/tests/test_basic.py index b277da5..f5e95fc 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,4 +1,4 @@ import hipopybind as m def test_main(): - assert m.__version__ == "1.9.9" + assert m.__version__ == "1.9.10" From 64ed5c1478b878562d9a4db8a1f8416cebe39d09 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Mon, 3 Nov 2025 12:17:39 -0500 Subject: [PATCH 110/113] fix: Add troubleshooting note in README. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 852f182..5d4d805 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,11 @@ python3 tutorials/write.py python3 tutorials/read.py ``` +# :red_circle: Troubleshooting +If you run into import errors because of undefined symbols when using the project along +with cppyy python libraries, try importing this library first since symbol visibility set to +hidden during compilation. + # Contact: matthew.mceneaney@duke.edu From 466069145c742383e82b9895b99e2de95b59d77f Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Mon, 3 Nov 2025 12:19:03 -0500 Subject: [PATCH 111/113] fix: Update workflow to only publish on main and to publish to pypi. --- .github/workflows/build-and-publish-wheels.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index b01948a..1168946 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -1,6 +1,7 @@ name: Build and Publish Wheels on: + branches: ['main'] push: tags: - "v*" # Build & publish on version tags (e.g. v1.2.3) @@ -127,4 +128,4 @@ jobs: rm -rf dist mv dist_flat dist ls -lrth dist - echo poetry publish -u __token__ -p ${{ secrets.PYPI_API_TOKEN }} + poetry publish -u __token__ -p ${{ secrets.PYPI_API_TOKEN }} From 72f3101adfe90bfef7be4e2b8e781e3046231daf Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Mon, 3 Nov 2025 12:19:56 -0500 Subject: [PATCH 112/113] fix: Update project version. --- meson.build | 2 +- pyproject.toml | 2 +- src/__init__.py | 2 +- tests/test_basic.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index 30d646a..066bcc4 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'hipopybind', 'cpp', - version: '1.9.10', + version: '2.0.1', license: 'MIT', meson_version: '>=1.2', default_options: [ diff --git a/pyproject.toml b/pyproject.toml index f88e0d2..25ec6bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ build-backend = 'mesonpy' [tool.poetry] name = "hipopybind" -version = "1.9.10" +version = "2.0.1" description = "Python bindings for hipo using pybind11" authors = ["Matthew McEneaney "] repository = "https://github.com/mfmceneaney/hipopybind.git" diff --git a/src/__init__.py b/src/__init__.py index 0638ad3..7daa176 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,2 +1,2 @@ -__version__="1.9.10" +__version__="2.0.1" from ._core import * diff --git a/tests/test_basic.py b/tests/test_basic.py index f5e95fc..fbbd680 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,4 +1,4 @@ import hipopybind as m def test_main(): - assert m.__version__ == "1.9.10" + assert m.__version__ == "2.0.1" From 46980c0288ed07c98d3b6da2828ac2b5651188b6 Mon Sep 17 00:00:00 2001 From: "Matthew F. McEneaney" Date: Mon, 3 Nov 2025 12:21:11 -0500 Subject: [PATCH 113/113] fix: Fix workflow file. --- .github/workflows/build-and-publish-wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish-wheels.yml b/.github/workflows/build-and-publish-wheels.yml index 1168946..4b02a38 100644 --- a/.github/workflows/build-and-publish-wheels.yml +++ b/.github/workflows/build-and-publish-wheels.yml @@ -1,8 +1,8 @@ name: Build and Publish Wheels on: - branches: ['main'] push: + branches: ['main'] tags: - "v*" # Build & publish on version tags (e.g. v1.2.3) workflow_dispatch: # Allow manual trigger