From e775c5f9fde1a782f608a9ff97678452c1d8749b Mon Sep 17 00:00:00 2001 From: David Heejong Park Date: Wed, 21 May 2025 08:58:42 +0200 Subject: [PATCH 1/7] Moved libcosimc loading to _internal.py --- src/libcosimpy/CosimAlgorithm.py | 9 ++-- src/libcosimpy/CosimExecution.py | 68 +++++++++++++++--------------- src/libcosimpy/CosimLibrary.py | 17 -------- src/libcosimpy/CosimLogging.py | 5 +-- src/libcosimpy/CosimManipulator.py | 16 +++---- src/libcosimpy/CosimObserver.py | 25 ++++++----- src/libcosimpy/CosimSlave.py | 7 ++- src/libcosimpy/_internal.py | 26 +++++++++++- tests/test_load_library.py | 4 +- uv.lock | 54 +++++++++++++++++++++++- 10 files changed, 142 insertions(+), 89 deletions(-) delete mode 100644 src/libcosimpy/CosimLibrary.py diff --git a/src/libcosimpy/CosimAlgorithm.py b/src/libcosimpy/CosimAlgorithm.py index adb9842..6a6d80a 100644 --- a/src/libcosimpy/CosimAlgorithm.py +++ b/src/libcosimpy/CosimAlgorithm.py @@ -11,8 +11,7 @@ from dataclasses import dataclass from typing import Optional -from . import CosimLibrary -from ._internal import wrap_function, get_last_error_message +from ._internal import wrap_function, get_last_error_message, libcosimc if typing.TYPE_CHECKING: from ctypes import _Pointer # pyright: ignore[reportPrivateUsage] @@ -69,7 +68,7 @@ def __init__( ) self.__ecco_add_power_bond = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_ecco_add_power_bond", argtypes=[POINTER(CosimAlgorithm), c_int, c_uint32, c_uint32, c_int, c_uint32, c_uint32], restype=c_int, @@ -78,7 +77,7 @@ def __init__( @classmethod def create_ecco_algorithm(cls, param: EccoParams) -> CosimAlgorithm: ecco_algorithm_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_ecco_algorithm_create", argtypes=[ c_double, @@ -156,7 +155,7 @@ def __del__(self): # Release object in C when object is removed (if pointer exists) if self.__ptr is not None: algorithm_destroy = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_algorithm_destroy", argtypes=[POINTER(CosimAlgorithm)], restype=c_int, diff --git a/src/libcosimpy/CosimExecution.py b/src/libcosimpy/CosimExecution.py index 13f72a5..e069660 100644 --- a/src/libcosimpy/CosimExecution.py +++ b/src/libcosimpy/CosimExecution.py @@ -13,8 +13,8 @@ ) from typing import Optional -from . import CosimConstants, CosimEnums, CosimLibrary, CosimManipulator, CosimObserver, CosimSlave -from ._internal import wrap_function +from . import CosimConstants, CosimEnums, CosimManipulator, CosimObserver, CosimSlave +from ._internal import wrap_function, libcosimc from .CosimAlgorithm import CosimAlgorithm if typing.TYPE_CHECKING: @@ -57,55 +57,55 @@ def __init__(self, create_key: object = None, execution_ptr: Optional[CosimExecu self.__execution_status_ptr = pointer(self.execution_status) self.__multiple_steps = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_step", argtypes=[POINTER(CosimExecution), c_int64], restype=None, ) self.__add_local_slave = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_add_slave", argtypes=[POINTER(CosimExecution), POINTER(CosimSlave.CosimLocalSlave)], restype=c_int, ) self.__simulate_until = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_simulate_until", argtypes=[POINTER(CosimExecution), c_int64], restype=c_int, ) self.__stop = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_stop", argtypes=[POINTER(CosimExecution)], restype=c_int, ) self.__enable_real_time_simulation = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_enable_real_time_simulation", argtypes=[POINTER(CosimExecution)], restype=c_int, ) self.__disable_real_time_simulation = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_disable_real_time_simulation", argtypes=[POINTER(CosimExecution)], restype=c_int, ) self.__real_time_factor_target = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_set_real_time_factor_target", argtypes=[POINTER(CosimExecution), c_double], restype=c_int, ) self.__steps_to_monitor = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_set_steps_to_monitor", argtypes=[POINTER(CosimExecution), c_int], restype=c_int, ) self.__add_manipulator = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_add_manipulator", argtypes=[ POINTER(CosimExecution), @@ -114,31 +114,31 @@ def __init__(self, create_key: object = None, execution_ptr: Optional[CosimExecu restype=c_int, ) self.__add_observer = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_add_observer", argtypes=[POINTER(CosimExecution), POINTER(CosimObserver.CosimObserver)], restype=c_int, ) self.__status = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_get_status", argtypes=[POINTER(CosimExecution), POINTER(CosimExecutionStatus)], restype=c_int, ) self.__slave_num_variables = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_slave_get_num_variables", argtypes=[POINTER(CosimExecution), c_int], restype=c_int, ) self.__num_modified_variables = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_get_num_modified_variables", argtypes=[POINTER(CosimExecution)], restype=c_int, ) self.__load_scenario = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_load_scenario", argtypes=[ POINTER(CosimExecution), @@ -148,55 +148,55 @@ def __init__(self, create_key: object = None, execution_ptr: Optional[CosimExecu restype=c_int, ) self.__real_initial = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_set_real_initial_value", argtypes=[POINTER(CosimExecution), c_int, c_uint32, c_double], restype=c_int, ) self.__integer_initial = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_set_integer_initial_value", argtypes=[POINTER(CosimExecution), c_int, c_uint32, c_int], restype=c_int, ) self.__boolean_initial = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_set_boolean_initial_value", argtypes=[POINTER(CosimExecution), c_int, c_uint32, c_bool], restype=c_int, ) self.__string_initial = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_set_string_initial_value", argtypes=[POINTER(CosimExecution), c_int, c_uint32, c_char_p], restype=c_int, ) self.__connect_real_variables = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_connect_real_variables", argtypes=[POINTER(CosimExecution), c_int, c_uint32, c_int, c_uint32], restype=c_int, ) self.__connect_int_variables = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_connect_integer_variables", argtypes=[POINTER(CosimExecution), c_int, c_uint32, c_int, c_uint32], restype=c_int, ) self.__connect_string_variables = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_connect_string_variables", argtypes=[POINTER(CosimExecution), c_int, c_uint32, c_int, c_uint32], restype=c_int, ) self.__connect_boolean_variables = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_connect_boolean_variables", argtypes=[POINTER(CosimExecution), c_int, c_uint32, c_int, c_uint32], restype=c_int, @@ -210,7 +210,7 @@ def from_algorithm(cls, algorithm: CosimAlgorithm): :return: CosimExecution object """ execution_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_create_with_algorithm", argtypes=[c_int64, POINTER(CosimAlgorithm)], restype=POINTER(CosimExecution), @@ -243,7 +243,7 @@ def from_step_size(cls, step_size: int | float): assert step_size > 0, "Step size must be a positive and non-zero integer" execution_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_create", argtypes=[c_int64, c_int64], restype=POINTER(CosimExecution), @@ -260,7 +260,7 @@ def from_osp_config_file(cls, osp_path: str): :return: CosimExecution object """ osp_execution_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_osp_config_execution_create", argtypes=[c_char_p, c_bool, c_int64], restype=POINTER(CosimExecution), @@ -288,7 +288,7 @@ def from_ssp_file(cls, ssp_path: str, step_size: Optional[int | float] = None): if step_size is None: # Create simulation without defined step size ssp_execution_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_ssp_execution_create", argtypes=[c_char_p, c_bool, c_int64], restype=POINTER(CosimExecution), @@ -309,7 +309,7 @@ def from_ssp_file(cls, ssp_path: str, step_size: Optional[int | float] = None): # Create simulation with defined step size ssp_fixed_step_execution_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_ssp_fixed_step_execution_create", argtypes=[c_char_p, c_bool, c_int64, c_int64], restype=POINTER(CosimExecution), @@ -327,7 +327,7 @@ def num_slaves(self): :return: int Number of currently connected slaves """ execution_get_num_slaves = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_get_num_slaves", argtypes=[POINTER(CosimExecution)], restype=c_int, @@ -341,7 +341,7 @@ def start(self): :return: bool Successful start of execution """ execution_start = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_start", argtypes=[POINTER(CosimExecution)], restype=c_int, @@ -468,7 +468,7 @@ def slave_infos(self): slave_count = self.num_slaves() slave_infos_list = (CosimSlave.CosimSlaveInfo * slave_count)() slave_infos = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_get_slave_infos", argtypes=[ POINTER(CosimExecution), @@ -521,7 +521,7 @@ def slave_variables(self, slave_index: int): slave_variables_count = self.num_slave_variables(slave_index) slave_variables_list = (CosimSlave.CosimSlaveVariableDescription * slave_variables_count)() slave_variables = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_slave_get_variables", argtypes=[ POINTER(CosimExecution), @@ -675,7 +675,7 @@ def __del__(self): # Release object in C when object is removed (if pointer exists) if self.__ptr is not None: execution_destroy = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_execution_destroy", argtypes=[POINTER(CosimExecution)], restype=c_int, diff --git a/src/libcosimpy/CosimLibrary.py b/src/libcosimpy/CosimLibrary.py deleted file mode 100644 index d6ba2ac..0000000 --- a/src/libcosimpy/CosimLibrary.py +++ /dev/null @@ -1,17 +0,0 @@ -import warnings -from ctypes import cdll -import os - -# Path of libcosimc .dll (Windows) or .so (Linux) files -lib_path = os.path.dirname(os.path.realpath(__file__)) -try: - if os.name == "nt": - lib = cdll.LoadLibrary(f"{lib_path}/libcosimc/cosimc.dll") - else: - lib = cdll.LoadLibrary(f"{lib_path}/libcosimc/libcosimc.so") -except FileNotFoundError: - warnings.warn("Unable to load cosimc library, searching in the default search paths..") - if os.name == "nt": - lib = cdll.LoadLibrary("cosimc.dll") - else: - lib = cdll.LoadLibrary("libcosimc.so") diff --git a/src/libcosimpy/CosimLogging.py b/src/libcosimpy/CosimLogging.py index 40a873d..8be5f8e 100644 --- a/src/libcosimpy/CosimLogging.py +++ b/src/libcosimpy/CosimLogging.py @@ -1,6 +1,5 @@ from ctypes import c_int -from ._internal import wrap_function -from . import CosimLibrary +from ._internal import wrap_function, libcosimc from enum import Enum @@ -25,7 +24,7 @@ def log_output_level(log_level: CosimLogLevel): :param CosimLogLevel log_level: """ log_output_level_set = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_log_set_output_level", argtypes=[c_int], restype=None, diff --git a/src/libcosimpy/CosimManipulator.py b/src/libcosimpy/CosimManipulator.py index d98277a..e61dd8e 100644 --- a/src/libcosimpy/CosimManipulator.py +++ b/src/libcosimpy/CosimManipulator.py @@ -11,9 +11,9 @@ ) from typing import TYPE_CHECKING, Optional, Any, Sequence -from . import CosimConstants, CosimLibrary +from . import CosimConstants from .CosimEnums import CosimVariableType -from ._internal import wrap_function +from ._internal import wrap_function, libcosimc if TYPE_CHECKING: from ctypes import _Pointer # pyright: ignore[reportPrivateUsage] @@ -49,7 +49,7 @@ def __init__(self, create_key: object = None, manipulator_ptr: Optional[CosimMan # Store the pointer used by the C library self.__ptr = manipulator_ptr self.__abort = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_scenario_abort", argtypes=[POINTER(CosimManipulator)], restype=c_int, @@ -63,7 +63,7 @@ def create_override(cls): :return: CosimManipulator object from constructor """ override_manipulator_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_override_manipulator_create", argtypes=[], restype=POINTER(CosimManipulator), @@ -79,7 +79,7 @@ def create_scenario_manager(cls): :return CosimManipulator object from constructor """ scenario_manager_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_scenario_manager_create", argtypes=[], restype=POINTER(CosimManipulator), @@ -126,7 +126,7 @@ def __slave_values( value_array = (c_type * variable_count)(*values) slave_values = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname=funcname, argtypes=[ POINTER(CosimManipulator), @@ -220,7 +220,7 @@ def reset_variables(self, slave_index: int, variable_type: CosimVariableType, va variable_array = (c_uint32 * variable_count)(*variable_references) slave_reset = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_manipulator_slave_reset", argtypes=[ POINTER(CosimManipulator), @@ -256,7 +256,7 @@ def __del__(self): """ if self.__ptr is not None: manipulator_destroy = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_manipulator_destroy", argtypes=[POINTER(CosimManipulator)], restype=c_int64, diff --git a/src/libcosimpy/CosimObserver.py b/src/libcosimpy/CosimObserver.py index 779a855..46c6e11 100644 --- a/src/libcosimpy/CosimObserver.py +++ b/src/libcosimpy/CosimObserver.py @@ -13,9 +13,8 @@ ) from typing import Optional, TYPE_CHECKING, Any -from . import CosimLibrary from .CosimEnums import CosimVariableType -from ._internal import wrap_function +from ._internal import wrap_function, libcosimc from . import CosimConstants @@ -53,19 +52,19 @@ def __init__(self, create_key: object = None, observer_ptr: Optional[CosimObserv # Store the pointer used by the C library self.__ptr = observer_ptr self.__step_numbers = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_observer_get_step_numbers", argtypes=[POINTER(CosimObserver), c_longlong, c_longlong, c_uint32], restype=c_int, ) self.__start_observing = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_observer_start_observing", argtypes=[POINTER(CosimObserver), c_int, c_int, c_uint32], restype=c_int, ) self.__stop_observing = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_observer_stop_observing", argtypes=[POINTER(CosimObserver), c_int, c_int, c_uint32], restype=c_int, @@ -79,7 +78,7 @@ def create_last_value(cls): :return: CosimObserver object from constructor """ last_value_observer_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_last_value_observer_create", argtypes=[], restype=POINTER(CosimObserver), @@ -96,7 +95,7 @@ def create_to_dir(cls, log_dir: str): :return: CosimObserver object from constructor """ file_observer_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_file_observer_create", argtypes=[c_char_p], restype=POINTER(CosimObserver), @@ -113,7 +112,7 @@ def from_cfg(cls, cfg_path, log_dir): :param str cfg_path: Directory of the LogConfig.xml file :return: CosimObserver object from constructor - file_observer_create = wrap_function(lib=CosimLibrary.lib, funcname='cosim_file_observer_create_from_cfg', + file_observer_create = wrap_function(lib=libcosimc(), funcname='cosim_file_observer_create_from_cfg', argtypes=[c_char_p, c_char_p], restype=POINTER(CosimObserver)) @@ -130,7 +129,7 @@ def create_time_series(cls, buffer_size: Optional[int] = None): """ if buffer_size is None: time_series_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_time_series_observer_create", argtypes=[], restype=POINTER(CosimObserver), @@ -139,7 +138,7 @@ def create_time_series(cls, buffer_size: Optional[int] = None): return cls(cls.__create_key, observer_ptr) else: buffered_time_series_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_buffered_time_series_observer_create", argtypes=[c_uint64], restype=POINTER(CosimObserver), @@ -192,7 +191,7 @@ def __time_series_samples( samples_array = (c_type * sample_count)() real_samples = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname=funcname, argtypes=[ POINTER(CosimObserver), @@ -289,7 +288,7 @@ def __last_values(self, slave_index: int, variable_references: list[int], c_type value_array = (c_type * variable_count)() real_values = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname=funcname, argtypes=[ POINTER(CosimObserver), @@ -383,7 +382,7 @@ def __del__(self): """ if self.__ptr is not None: observer_destroy = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_observer_destroy", argtypes=[POINTER(CosimObserver)], restype=c_int, diff --git a/src/libcosimpy/CosimSlave.py b/src/libcosimpy/CosimSlave.py index 84cb63e..c32e019 100644 --- a/src/libcosimpy/CosimSlave.py +++ b/src/libcosimpy/CosimSlave.py @@ -1,6 +1,5 @@ from ctypes import c_char, c_char_p, POINTER, c_int, Structure, c_uint32 -from ._internal import wrap_function -from . import CosimLibrary +from ._internal import wrap_function, libcosimc from . import CosimConstants from . import CosimEnums @@ -46,7 +45,7 @@ class CosimLocalSlave(Structure): def __init__(self, fmu_path: str, instance_name: str): local_slave_create = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_local_slave_create", argtypes=[c_char_p, c_char_p], restype=POINTER(CosimLocalSlave), @@ -66,7 +65,7 @@ def __del__(self): Releases C objects when CosimObserver is deleted in python """ local_slave_destroy = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_local_slave_destroy", argtypes=[POINTER(CosimLocalSlave)], restype=c_int, diff --git a/src/libcosimpy/_internal.py b/src/libcosimpy/_internal.py index 9e45483..3ba20a9 100644 --- a/src/libcosimpy/_internal.py +++ b/src/libcosimpy/_internal.py @@ -1,8 +1,11 @@ import ctypes from typing import Any +import warnings +from ctypes import cdll +import os -from libcosimpy import CosimLibrary +__lib = None def wrap_function(lib: ctypes.CDLL, funcname: str, restype: Any, argtypes: list[Any]): @@ -13,6 +16,25 @@ def wrap_function(lib: ctypes.CDLL, funcname: str, restype: Any, argtypes: list[ return func +def libcosimc(): + # Path of libcosimc .dll (Windows) or .so (Linux) files + global __lib + if __lib is None: + lib_path = os.path.dirname(os.path.realpath(__file__)) + try: + if os.name == "nt": + __lib = cdll.LoadLibrary(f"{lib_path}/libcosimc/cosimc.dll") + else: + __lib = cdll.LoadLibrary(f"{lib_path}/libcosimc/libcosimc.so") + except FileNotFoundError: + warnings.warn("Unable to load cosimc library, searching in the default search paths..") + if os.name == "nt": + __lib = cdll.LoadLibrary("cosimc.dll") + else: + __lib = cdll.LoadLibrary("libcosimc.so") + return __lib + + class CTypeMeta(type(ctypes.Structure)): def __new__(cls, name: str, bases: tuple[type, ...], namespace: dict[str, Any]): annotations = namespace.get("__annotations__", {}) @@ -22,7 +44,7 @@ def __new__(cls, name: str, bases: tuple[type, ...], namespace: dict[str, Any]): def get_last_error_message() -> str: cosim_last_error_message = wrap_function( - lib=CosimLibrary.lib, + lib=libcosimc(), funcname="cosim_last_error_message", argtypes=[], restype=ctypes.c_char_p, diff --git a/tests/test_load_library.py b/tests/test_load_library.py index 05a023d..0578542 100644 --- a/tests/test_load_library.py +++ b/tests/test_load_library.py @@ -1,5 +1,5 @@ -import libcosimpy.CosimLibrary +from libcosimpy._internal import libcosimc def test_load_libray(): - assert libcosimpy.CosimLibrary is not None + assert libcosimc() is not None diff --git a/uv.lock b/uv.lock index 0209041..add5cc2 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 2 -requires-python = ">=3.10, <3.13" +requires-python = ">=3.10, <3.14" [[package]] name = "certifi" @@ -56,6 +56,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, ] @@ -200,6 +213,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, ] [[package]] @@ -310,6 +343,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] [[package]] @@ -387,6 +429,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, ] From d47725ff786aafe212ee8e8d1103eb23ae29587c Mon Sep 17 00:00:00 2001 From: David Heejong Park Date: Wed, 21 May 2025 10:26:45 +0200 Subject: [PATCH 2/7] Build b2 --- hatch_build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hatch_build.py b/hatch_build.py index 683fe5d..c483d23 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -29,7 +29,7 @@ def initialize(self, version: str, build_data: dict[str, Any]) -> None: else: build_packages = "-b missing" - assert os.system(f"conan install . -u {build_packages} -of build --format json --out-file graph.json") == 0, ( + assert os.system(f"conan install . -u {build_packages} -of build --format json -b b2/* --out-file graph.json") == 0, ( "Conan install failed" ) From f9cbe0db657d89d088b4850bfb645e3fa249c9ac Mon Sep 17 00:00:00 2001 From: David Heejong Park Date: Thu, 22 May 2025 08:42:24 +0200 Subject: [PATCH 3/7] Build b2 --- hatch_build.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hatch_build.py b/hatch_build.py index c483d23..072734a 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -29,9 +29,9 @@ def initialize(self, version: str, build_data: dict[str, Any]) -> None: else: build_packages = "-b missing" - assert os.system(f"conan install . -u {build_packages} -of build --format json -b b2/* --out-file graph.json") == 0, ( - "Conan install failed" - ) + assert ( + os.system(f"conan install . -u {build_packages} -of build --format json -b b2/* --out-file graph.json") == 0 + ), "Conan install failed" if "CONAN_UPLOAD_OSP" in os.environ: print("Uploading packages..") From b89b5976ad4a16fb55cd925fbf66c8eea962680b Mon Sep 17 00:00:00 2001 From: David Heejong Park Date: Thu, 22 May 2025 18:07:32 +0200 Subject: [PATCH 4/7] Build b2 --- hatch_build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hatch_build.py b/hatch_build.py index 072734a..4c43c48 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -21,7 +21,7 @@ def initialize(self, version: str, build_data: dict[str, Any]) -> None: frame = frame_info.frame module = inspect.getmodule(frame) if module and module.__name__.startswith("hatchling.build") and "config_settings" in frame.f_locals: - config_settings = frame.f_locals["config_settings"] + config_settings = frame.f_locals["config_settings"] or {} package_list = config_settings.get("CONAN_BUILD") if package_list: From f16d518f333a368a3f1b0455b34f097777b112ad Mon Sep 17 00:00:00 2001 From: David Heejong Park Date: Thu, 22 May 2025 18:10:39 +0200 Subject: [PATCH 5/7] Update --- src/libcosimpy/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcosimpy/__about__.py b/src/libcosimpy/__about__.py index 6477332..6630dd6 100644 --- a/src/libcosimpy/__about__.py +++ b/src/libcosimpy/__about__.py @@ -1 +1 @@ -__version__ = "0.0.3.post1" +__version__ = "0.0.3.post2" From f7c6eb5ad2bdf67807834c1321927468c188753f Mon Sep 17 00:00:00 2001 From: David Heejong Park Date: Thu, 5 Jun 2025 15:51:14 +0200 Subject: [PATCH 6/7] Added error message from_osp_config_file. --- src/libcosimpy/CosimExecution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcosimpy/CosimExecution.py b/src/libcosimpy/CosimExecution.py index e069660..ceb5bed 100644 --- a/src/libcosimpy/CosimExecution.py +++ b/src/libcosimpy/CosimExecution.py @@ -14,7 +14,7 @@ from typing import Optional from . import CosimConstants, CosimEnums, CosimManipulator, CosimObserver, CosimSlave -from ._internal import wrap_function, libcosimc +from ._internal import wrap_function, libcosimc, get_last_error_message from .CosimAlgorithm import CosimAlgorithm if typing.TYPE_CHECKING: @@ -272,7 +272,7 @@ def from_osp_config_file(cls, osp_path: str): execution_ptr = osp_execution_create(encoded_osp_path, False, 0) - assert execution_ptr, "Unable to create execution from path. Please check if path is correct." + assert execution_ptr, f"Unable to create execution from path: {get_last_error_message()}" return cls(cls.__create_key, execution_ptr) From c640c11d66a6040b21c59b8cf61e455b510eb917 Mon Sep 17 00:00:00 2001 From: David Heejong Park Date: Mon, 7 Jul 2025 07:39:27 +0200 Subject: [PATCH 7/7] Bump version to 0.0.4 --- src/libcosimpy/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcosimpy/__about__.py b/src/libcosimpy/__about__.py index 6630dd6..81f0fde 100644 --- a/src/libcosimpy/__about__.py +++ b/src/libcosimpy/__about__.py @@ -1 +1 @@ -__version__ = "0.0.3.post2" +__version__ = "0.0.4"