diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..d6fa4bd85 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.15...3.26) + +project( + ${SKBUILD_PROJECT_NAME} + LANGUAGES C + VERSION ${SKBUILD_PROJECT_VERSION}) + +find_package( + Python + COMPONENTS + Interpreter + Development.Module + ${SKBUILD_SABI_COMPONENT} + NumPy + REQUIRED) + +python_add_library(cutils + MODULE + src/asammdf/blocks/cutils.c + WITH_SOABI USE_SABI 3.9) + +target_link_libraries(cutils PRIVATE Python::NumPy) + +install(TARGETS cutils DESTINATION "asammdf/blocks") diff --git a/pyproject.toml b/pyproject.toml index 848dacafd..c6b9c0a14 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,84 @@ [build-system] -requires = ["numpy", "setuptools"] -build-backend = "setuptools.build_meta" +requires = ["scikit-build-core", "numpy"] +build-backend = "scikit_build_core.build" + +[project] +name = "asammdf" +description="ASAM MDF measurement data file parser" +readme = "README.md" +requires-python = ">=3.9" +license = { text = "LGPLv3+" } +authors = [{ name = "Daniel Hrisca", email = "daniel.hrisca@gmail.com" }] +dynamic = ["version"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Topic :: Software Development", + "Topic :: Scientific/Engineering", + "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +keywords = [ + "read", + "reader", + "edit", + "editor", + "parse", + "parser", + "asam", + "mdf", + "measurement", +] +dependencies = [ + "canmatrix[arxml,dbc]>=1.0", + "isal; platform_machine == 'x86_64' or platform_machine == 'AMD64'", + "lxml>=4.9.3", + "lz4", + "numexpr", + "numpy>=1.23.0", + "pandas", + "python-dateutil", + "typing-extensions", +] + +[project.optional-dependencies] +decode = ["faust-cchardet==2.1.19", "chardet"] +export = [ + "pyarrow", + "h5py", + "hdf5storage>=0.1.19", + "python-snappy", +] +export_matlab_v5 = ["scipy"] +gui = [ + "natsort", + "PySide6", + "pyqtgraph", + "pyqtlet2", + "packaging", + "QtPy", +] +encryption = ["cryptography", "keyring"] +symbolic_math = ["sympy"] +filesystem = ["fsspec"] + +[project.scripts] +asammdf = "asammdf.app.asammdfgui:main [gui]" + +[project.urls] +Documentation = "https://asammdf.readthedocs.io/en/master" +Issues = "https://github.com/danielhrisca/asammdf/issues" +Source = "https://github.com/danielhrisca/asammdf" + +[tool.scikit-build] +metadata.version.provider = "scikit_build_core.metadata.regex" +metadata.version.input = "src/asammdf/version.py" +wheel.packages = ["src/asammdf"] +wheel.py-api = "cp39" [tool.black] line-length = 120 diff --git a/setup.py b/setup.py deleted file mode 100644 index 095389893..000000000 --- a/setup.py +++ /dev/null @@ -1,145 +0,0 @@ -""" -asammdf - -""" - -from pathlib import Path - -from numpy import get_include -from setuptools import Extension, find_packages, setup - -PROJECT_PATH = Path(__file__).parent - - -def _get_version(): - with PROJECT_PATH.joinpath("src", "asammdf", "version.py").open() as f: - line = next(line for line in f if line.startswith("__version__")) - - version = line.partition("=")[2].strip()[1:-1] - - return version - - -def _get_long_description(): - description = PROJECT_PATH.joinpath("README.md").read_text(encoding="utf-8") - - return description - - -def _get_ext_modules(): - modules = [ - Extension( - "asammdf.blocks.cutils", - ["src/asammdf/blocks/cutils.c"], - include_dirs=[get_include()], - extra_compile_args=["-std=c99"], - ) - ] - - return modules - - -setup( - name="asammdf", - # Versions should comply with PEP440. For a discussion on single-sourcing - # the version across setup.py and the project code, see - # https://packaging.python.org/en/latest/single_source_version.html - version=_get_version(), - description="ASAM MDF measurement data file parser", - long_description=_get_long_description(), - long_description_content_type=r"text/markdown", - # The project's main homepage. - url="https://github.com/danielhrisca/asammdf", - # Author details - author="Daniel Hrisca", - author_email="daniel.hrisca@gmail.com", - # Choose your license - license="LGPLv3+", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 5 - Production/Stable", - # Indicate who your project is intended for - "Intended Audience :: Developers", - "Topic :: Software Development", - "Topic :: Scientific/Engineering", - # Pick your license as you wish (should match "license" above) - "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - ], - # Supported python versions - python_requires=">=3.9", - # What does your project relate to? - keywords="read reader edit editor parse parser asam mdf measurement", - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - packages=find_packages("src"), - package_dir={"": "src"}, - # Alternatively, if you want to distribute just a my_module.py, uncomment - # this: - # py_modules=["my_module"], - # List run-time dependencies here. These will be installed by pip when - # your project is installed. For an analysis of "install_requires" vs pip's - # requirements files see: - # https://packaging.python.org/en/latest/requirements.html - install_requires=[ - "canmatrix[arxml,dbc]>=1.0", - "isal; platform_machine == 'x86_64' or platform_machine == 'AMD64'", - "lxml>=4.9.3", - "lz4", - "numexpr", - "numpy>=1.23.0", - "pandas", - "python-dateutil", - "typing-extensions", - ], - # List additional groups of dependencies here (e.g. development - # dependencies). You can install these using the following syntax, - # for example: - # $ pip install -e .[dev,test] - extras_require={ - "decode": ["faust-cchardet==2.1.19", "chardet"], - "export": [ - "pyarrow", - "h5py", - "hdf5storage>=0.1.19", - "python-snappy", - ], - "export_matlab_v5": "scipy", - "gui": [ - "natsort", - "PySide6", - "pyqtgraph", - "pyqtlet2", - "packaging", - "QtPy", - ], - "encryption": ["cryptography", "keyring"], - "symbolic_math": "sympy", - "filesystem": "fsspec", - }, - # If there are data files included in your packages that need to be - # installed, specify them here. If using Python 2.6 or less, then these - # have to be included in MANIFEST.in as well. - package_data={"asammdf.gui.ui": ["*.ui"]}, - include_package_data=True, - # Although 'package_data' is the preferred approach, in some case you may - # need to place data files outside of your packages. See: - # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files - # In this case, 'data_file' will be installed into '/my_data' - # data_files=[('my_data', ['data/data_file'])], - # To provide executable scripts, use entry points in preference to the - # "scripts" keyword. Entry points provide cross-platform support and allow - # pip to create the appropriate form of executable for the target platform. - entry_points={"console_scripts": ["asammdf = asammdf.app.asammdfgui:main [gui]"]}, - ext_modules=_get_ext_modules(), -) diff --git a/src/asammdf/blocks/cutils.c b/src/asammdf/blocks/cutils.c index 5f2e6ac25..13f1e03e1 100644 --- a/src/asammdf/blocks/cutils.c +++ b/src/asammdf/blocks/cutils.c @@ -1529,7 +1529,7 @@ static PyObject *bytes_dtype_size(PyObject *self, PyObject *args) break; } - current_size = PyBytes_GET_SIZE(*pointer); + current_size = PyBytes_Size(*pointer); if (current_size > size) size = current_size; }