From 0d42e816675a182a7994070a5c7c99651f93755f Mon Sep 17 00:00:00 2001 From: Antoine Prouvost Date: Fri, 10 Nov 2023 18:29:16 +0100 Subject: [PATCH] Modularize libmambapy (#2960) * Modularize libmambapy * Add test-libmambapy to Taskfile * Fix libmamba installation * Fix standalone libmambapy configuration * Change libmambapy layout * Add scikit-build * Fix libmambapy extension name * Add submodules shims * Fix libmambaoy tests * Fix stubgen * Adapt libmambapy tests to scikit-build * Read version from Python * Replace confusing names --- .github/workflows/unix_impl.yml | 7 +- .github/workflows/windows_impl.yml | 17 +-- .pre-commit-config.yaml | 1 + Taskfile.dist.yml | 17 ++- dev/environment-dev.yml | 2 + libmamba/CMakeLists.txt | 17 ++- libmamba/libmambaConfig.cmake.in | 24 +++-- libmambapy/CMakeLists.txt | 41 ++++++- libmambapy/libmambapy/__init__.py | 9 -- libmambapy/pyproject.toml | 34 ++++++ libmambapy/setup.cfg | 17 --- libmambapy/setup.py | 38 ++++++- libmambapy/src/libmambapy/__init__.py | 5 + libmambapy/{ => src}/libmambapy/__init__.pyi | 101 ++++++++++-------- .../src/libmambapy/bindings/bindings.cpp | 12 +++ .../src/libmambapy/bindings/bindings.hpp | 19 ++++ .../bindings}/flat_set_caster.hpp | 0 .../bindings/legacy.cpp} | 13 ++- .../libmambapy/bindings}/longpath.manifest | 0 libmambapy/src/libmambapy/py.typed | 0 .../_version.py => src/libmambapy/version.py} | 0 .../libmambapy/version.py.tmpl} | 0 libmambapy/tests/test_specs.py | 2 +- pyproject.toml | 7 -- releaser.py | 3 +- 25 files changed, 256 insertions(+), 130 deletions(-) delete mode 100644 libmambapy/libmambapy/__init__.py create mode 100644 libmambapy/pyproject.toml delete mode 100644 libmambapy/setup.cfg create mode 100644 libmambapy/src/libmambapy/__init__.py rename libmambapy/{ => src}/libmambapy/__init__.pyi (89%) create mode 100644 libmambapy/src/libmambapy/bindings/bindings.cpp create mode 100644 libmambapy/src/libmambapy/bindings/bindings.hpp rename libmambapy/src/{ => libmambapy/bindings}/flat_set_caster.hpp (100%) rename libmambapy/src/{main.cpp => libmambapy/bindings/legacy.cpp} (99%) rename libmambapy/{ => src/libmambapy/bindings}/longpath.manifest (100%) create mode 100644 libmambapy/src/libmambapy/py.typed rename libmambapy/{libmambapy/_version.py => src/libmambapy/version.py} (100%) rename libmambapy/{libmambapy/_version.py.tmpl => src/libmambapy/version.py.tmpl} (100%) diff --git a/.github/workflows/unix_impl.yml b/.github/workflows/unix_impl.yml index 8f615b26d1..70c23897a5 100644 --- a/.github/workflows/unix_impl.yml +++ b/.github/workflows/unix_impl.yml @@ -39,7 +39,8 @@ jobs: cmake -B build/ -G Ninja \ --preset mamba-unix-shared-${{ inputs.build_type }} \ -D CMAKE_CXX_COMPILER_LAUNCHER=sccache \ - -D CMAKE_C_COMPILER_LAUNCHER=sccache + -D CMAKE_C_COMPILER_LAUNCHER=sccache \ + -D BUILD_LIBMAMBAPY=OFF cmake --build build/ --parallel - name: Show build cache statistics run: sccache --show-stats @@ -97,9 +98,9 @@ jobs: environment-name: build_env - name: Install libmambapy run: | - ln build/libmambapy/bindings* libmambapy/libmambapy/ cmake --install build/ --prefix "${CONDA_PREFIX}" - python -m pip install ./libmambapy/ + # TODO add some ccache and parallelism to builds + python -m pip install --no-deps --no-build-isolation ./libmambapy - name: Run libmamba Python bindings tests run: | python -m pytest libmambapy/tests/ diff --git a/.github/workflows/windows_impl.yml b/.github/workflows/windows_impl.yml index adb1162471..75dbe68081 100644 --- a/.github/workflows/windows_impl.yml +++ b/.github/workflows/windows_impl.yml @@ -41,7 +41,8 @@ jobs: --preset mamba-win-shared-${{ inputs.build_type }} ^ -D CMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" ^ -D CMAKE_CXX_COMPILER_LAUNCHER=sccache ^ - -D CMAKE_C_COMPILER_LAUNCHER=sccache + -D CMAKE_C_COMPILER_LAUNCHER=sccache ^ + -D BUILD_LIBMAMBAPY=OFF if %errorlevel% neq 0 exit /b %errorlevel% cmake --build build/ --parallel if %errorlevel% neq 0 exit /b %errorlevel% @@ -84,13 +85,6 @@ jobs: unset CONDARC # Interferes with tests cd ./build/libmamba && ./tests/test_libmamba - # - name: Run libmamba tests - # run: | - # @REM Interferes with tests - # set CONDARC= - # @REM Move to directory of libmamba DLL for Windows to find it - # cd "build\libmamba" && .\tests\test_libmamba - libmambapy_tests_win: name: Test libmamba Python bindings needs: ["build_shared_win"] @@ -111,11 +105,10 @@ jobs: environment-name: build_env init-shell: bash cmd.exe - name: Install libmambapy - shell: bash -elo pipefail {0} run: | - ln build/libmambapy/bindings*.pyd libmambapy/libmambapy/ - cmake --install build/ --prefix "${CONDA_PREFIX}" - python -m pip install ./libmambapy/ + cmake --install build/ --prefix %CONDA_PREFIX% + # TODO add some ccache and parallelism to builds + python -m pip install --no-deps --no-build-isolation ./libmambapy - name: Run libmamba Python bindings tests run: | python -m pytest libmambapy/tests/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 045b764b8d..835168d390 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -41,6 +41,7 @@ repos: - flake8-builtins==2.1.0 - flake8-bugbear==23.9.16 - flake8-isort==6.1.0 + exclude: libmambapy/src - repo: https://github.com/pre-commit/mirrors-clang-format rev: v16.0.6 hooks: diff --git a/Taskfile.dist.yml b/Taskfile.dist.yml index c77c3dae57..af3a8e715c 100644 --- a/Taskfile.dist.yml +++ b/Taskfile.dist.yml @@ -155,14 +155,23 @@ tasks: cmds: - >- {{.TEST_RUN}} python -m pip install - --no-deps --no-build-isolation --ignore-installed --editable libmambapy/ + --no-deps --no-build-isolation --ignore-installed ./libmambapy/ + + _test-libmambapy: + internal: true + deps: [install-py] + cmds: + - >- + {{.TEST_RUN}} python -m pytest libmambapy/tests/ {{.args}} + test-libmambapy: + cmds: [{task: _test-libmambapy, vars: {args: '{{.CLI_ARGS}}'}}] stubgen: deps: [install-py] cmds: - - '{{.TEST_RUN}} python -m pybind11_stubgen -o "{{.BUILD_DIR}}/stubs" libmambapy.bindings' - - cp "{{.BUILD_DIR}}/stubs/libmambapy/bindings-stubs/__init__.pyi" libmambapy/libmambapy/ - - '{{.DEV_RUN}} pre-commit run --files libmambapy/libmambapy/__init__.pyi' + - '{{.TEST_RUN}} python -m pybind11_stubgen -o "{{.BUILD_DIR}}/stubs" libmambapy.core.bindings' + - cp "{{.BUILD_DIR}}/stubs/libmambapy/core/bindings-stubs/__init__.pyi" libmambapy/src/libmambapy/__init__.pyi + - '{{.DEV_RUN}} pre-commit run --files libmambapy/src/libmambapy/__init__.pyi' clean: 'rm -rf {{.BUILD_DIR}}' diff --git a/dev/environment-dev.yml b/dev/environment-dev.yml index 9015631891..34dcef4311 100644 --- a/dev/environment-dev.yml +++ b/dev/environment-dev.yml @@ -38,6 +38,8 @@ dependencies: - pip: - securesystemslib # libmambapy build dependencies + - scikit-build + - build - pybind11-stubgen <1.0 # libmambapy dependencies - python diff --git a/libmamba/CMakeLists.txt b/libmamba/CMakeLists.txt index 22f6b0f2d9..f24d445e19 100644 --- a/libmamba/CMakeLists.txt +++ b/libmamba/CMakeLists.txt @@ -660,7 +660,7 @@ set( install( TARGETS ${libmamba_targets} - EXPORT ${PROJECT_NAME}-targets + EXPORT ${PROJECT_NAME}Targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -674,13 +674,6 @@ install( PATTERN "*.h" ) -# Makes the project importable from the build directory -export( - EXPORT ${PROJECT_NAME}-targets - FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake" - NAMESPACE mamba:: -) - # Configure 'mambaConfig.cmake' for a build tree set(MAMBA_CONFIG_CODE "####### Expanded from \@MAMBA_CONFIG_CODE\@ #######\n") set( @@ -711,8 +704,12 @@ install( ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake DESTINATION ${LIBMAMBA_CMAKECONFIG_INSTALL_DIR} ) +# Need to install the FindLibsolv for the installed target to work +install(FILES "../cmake/modules/FindLibsolv.cmake" DESTINATION ${LIBMAMBA_CMAKECONFIG_INSTALL_DIR}) + install( - EXPORT ${PROJECT_NAME}-targets - FILE ${PROJECT_NAME}Targets.cmake + EXPORT ${PROJECT_NAME}Targets + NAMESPACE mamba:: DESTINATION ${LIBMAMBA_CMAKECONFIG_INSTALL_DIR} + COMPONENT Mamba_Development ) diff --git a/libmamba/libmambaConfig.cmake.in b/libmamba/libmambaConfig.cmake.in index 35834de762..1591dba23e 100644 --- a/libmamba/libmambaConfig.cmake.in +++ b/libmamba/libmambaConfig.cmake.in @@ -22,25 +22,31 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR};${CMAKE_MODULE_PATH}") @LIBMAMBA_CONFIG_CODE@ include(CMakeFindDependencyMacro) +find_dependency(CURL) +find_dependency(LibArchive) +find_dependency(zstd) +find_dependency(BZip2) +find_dependency(OpenSSL) find_dependency(fmt) -find_dependency(nlohmann_json) find_dependency(spdlog) -find_dependency(Threads) find_dependency(tl-expected) -find_dependency(zstd) -find_dependency(BZip2) +find_dependency(nlohmann_json) +find_dependency(simdjson) find_dependency(yaml-cpp) +find_dependency(reproc) +find_dependency(reproc++) +find_dependency(Libsolv MODULE) -if(NOT (TARGET libmamba OR TARGET libmamba-static)) +if(NOT (TARGET libmamba-dyn OR TARGET libmamba-static)) include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") if (TARGET mamba::libmamba-dyn) - get_target_property(@PROJECT_NAME@_INCLUDE_DIR libmamba INTERFACE_INCLUDE_DIRECTORIES) - get_target_property(@PROJECT_NAME@_LIBRARY libmamba LOCATION) + get_target_property(@PROJECT_NAME@_INCLUDE_DIR mamba::libmamba-dyn INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(@PROJECT_NAME@_LIBRARY mamba::libmamba-dyn LOCATION) endif() if (TARGET mamba::libmamba-static) - get_target_property(@PROJECT_NAME@_INCLUDE_DIR libmamba-static INTERFACE_INCLUDE_DIRECTORIES) - get_target_property(@PROJECT_NAME@_STATIC_LIBRARY libmamba-static LOCATION) + get_target_property(@PROJECT_NAME@_INCLUDE_DIR mamba::libmamba-static INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(@PROJECT_NAME@_STATIC_LIBRARY mamba::libmamba-static LOCATION) endif() endif() diff --git a/libmambapy/CMakeLists.txt b/libmambapy/CMakeLists.txt index 8f22a0c830..7362f861ba 100644 --- a/libmambapy/CMakeLists.txt +++ b/libmambapy/CMakeLists.txt @@ -5,6 +5,8 @@ # The full license is in the file LICENSE, distributed with this software. cmake_minimum_required(VERSION 3.18.2) +include("../cmake/CompilerWarnings.cmake") + cmake_policy(SET CMP0025 NEW) cmake_policy(SET CMP0077 NEW) cmake_policy(SET CMP0057 NEW) @@ -13,16 +15,45 @@ project(libmambapy) if(NOT TARGET mamba::libmamba) find_package(libmamba REQUIRED) + set(libmamba_target mamba::libmamba-dyn) +else() + set(libmamba_target mamba::libmamba) endif() find_package(Python COMPONENTS Interpreter Development) find_package(pybind11 REQUIRED) -pybind11_add_module(bindings src/main.cpp longpath.manifest) +pybind11_add_module( + bindings + src/libmambapy/bindings/longpath.manifest + src/libmambapy/bindings/bindings.cpp + src/libmambapy/bindings/legacy.cpp +) -mamba_target_add_compile_warnings(bindings WARNING_AS_ERROR ${MAMBA_WARNING_AS_ERROR}) +target_include_directories(bindings PRIVATE src/libmambapy/bindings) -target_link_libraries(bindings PRIVATE pybind11::pybind11 mamba::libmamba) -set_property(TARGET bindings PROPERTY CXX_STANDARD 17) +mamba_target_add_compile_warnings(bindings WARNING_AS_ERROR ${MAMBA_WARNING_AS_ERROR}) -install(TARGETS bindings LIBRARY DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/libmambapy/) +target_link_libraries(bindings PRIVATE pybind11::pybind11 ${libmamba_target}) +target_compile_features(bindings PRIVATE cxx_std_17) + +# Installation + +if(SKBUILD) + install(TARGETS bindings DESTINATION ${MAMBA_INSTALL_PYTHON_EXT_LIBDIR}) +else() + # WARNING: this default should probably not be used as it is but set extranlly by a proper + # Python packager tool + set( + MAMBA_INSTALL_PYTHON_EXT_LIBDIR + "lib" + CACHE PATH "Installation directory for Python extension" + ) + + install( + TARGETS bindings + EXCLUDE_FROM_ALL + COMPONENT Mamba_Python_Extension + DESTINATION ${MAMBA_INSTALL_PYTHON_EXT_LIBDIR} + ) +endif() diff --git a/libmambapy/libmambapy/__init__.py b/libmambapy/libmambapy/__init__.py deleted file mode 100644 index 446fa4eedb..0000000000 --- a/libmambapy/libmambapy/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -import os - -try: - from libmambapy.bindings import * # noqa: F401,F403 -except ImportError as e: - if not os.environ.get("CONDA_BUILD_CROSS_COMPILATION"): - raise e - else: - print("libmambapy import error ignored due to cross compilation") diff --git a/libmambapy/pyproject.toml b/libmambapy/pyproject.toml new file mode 100644 index 0000000000..0e31aa56d3 --- /dev/null +++ b/libmambapy/pyproject.toml @@ -0,0 +1,34 @@ +[build-system] +requires = [ + "setuptools>=42", + "wheel", + "scikit-build>=0.13", + "cmake>=3.18", + "ninja", +] +build-backend = "setuptools.build_meta" + +[project] +name = "libmambapy" +authors = [ + {name = "Wolf Vollprecht"}, + {name = "Adrien Delsalle"}, + {name = "Jonas Haag"}, + {name = "QuantStack", email = "info@quantstack.net"}, + {name = "Other contributors"}, +] +maintainers = [ + {name = "QuantStack", email = "info@quantstack.net"}, +] +description = "A fast library to interact with the Conda package ecosystem" +requires-python = ">=3.7" +keywords = ["mamba", "conda", "packaging"] +license = {text = "BSD-3-Clause"} +dependencies = [] +dynamic = ["version"] +[projet.url] +Documentation = "https://mamba.readthedocs.io" +Repository = "https://github.com/mamba-org/mamba/" + +[tool.setuptools] +platforms = ["Windows", "Linux", "Mac OS X"] diff --git a/libmambapy/setup.cfg b/libmambapy/setup.cfg deleted file mode 100644 index 904712f8d6..0000000000 --- a/libmambapy/setup.cfg +++ /dev/null @@ -1,17 +0,0 @@ -[metadata] -name = libmambapy -version = attr: libmambapy._version.__version__ -description = Python bindings of libmamba -long_description = Python bindings of libmamba, C++ reimplementation of conda -long_description_content_type = text/markdown -license_file = LICENSE -author = QuantStack -author_email = info@quantstack.net -url = https://github.com/mamba-org/mamba -platforms = Windows, Linux, Mac OS X -keywords = mamba, libmamba, conda - -[options] -include_package_data = True -packages = find: -python_requires = >=3.7 diff --git a/libmambapy/setup.py b/libmambapy/setup.py index b908cbe55c..8320455b8b 100644 --- a/libmambapy/setup.py +++ b/libmambapy/setup.py @@ -1,3 +1,37 @@ -import setuptools +import importlib.util +import os +import pathlib -setuptools.setup() +import skbuild +import skbuild.constants + +__dir__ = pathlib.Path(__file__).parent.absolute() + + +def CMAKE_INSTALL_DIR(): + """Where scikit-build configures CMAKE_INSTALL_PREFIX.""" + return os.path.abspath(skbuild.constants.CMAKE_INSTALL_DIR()) + + +def libmambapy_version(): + """Get the version of libmambapy from its version module.""" + spec = importlib.util.spec_from_file_location( + "libmambapy_version", __dir__ / "src/libmambapy/version.py" + ) + ver = importlib.util.module_from_spec(spec) + spec.loader.exec_module(ver) + return ver.__version__ + + +skbuild.setup( + version=libmambapy_version(), + packages=["libmambapy", "libmambapy.bindings"], + package_dir={"": "src"}, + package_data={"libmambapy": ["py.typed", "__init__.pyi"]}, + cmake_languages=["CXX"], + cmake_minimum_required_version="3.17", + cmake_install_dir="src/libmambapy", # Must match package_dir layout + cmake_args=[ + f"-DMAMBA_INSTALL_PYTHON_EXT_LIBDIR={CMAKE_INSTALL_DIR()}/src/libmambapy", + ], +) diff --git a/libmambapy/src/libmambapy/__init__.py b/libmambapy/src/libmambapy/__init__.py new file mode 100644 index 0000000000..067573fa98 --- /dev/null +++ b/libmambapy/src/libmambapy/__init__.py @@ -0,0 +1,5 @@ +import libmambapy.version +from libmambapy.bindings.legacy import * # Legacy which used to combine everything + +# Define top-level attributes +__version__ = libmambapy.version.__version__ diff --git a/libmambapy/libmambapy/__init__.pyi b/libmambapy/src/libmambapy/__init__.pyi similarity index 89% rename from libmambapy/libmambapy/__init__.pyi rename to libmambapy/src/libmambapy/__init__.pyi index 8863e7a7cf..b67473920a 100644 --- a/libmambapy/libmambapy/__init__.pyi +++ b/libmambapy/src/libmambapy/__init__.pyi @@ -1,5 +1,5 @@ from __future__ import annotations -import libmambapy.bindings +import libmambapy.core.bindings import typing __all__ = [ @@ -113,6 +113,7 @@ __all__ = [ "SubdirIndexEntry", "TimeRef", "Transaction", + "Version", "cache_fn_url", "cancel_json_output", "clean", @@ -187,9 +188,9 @@ class ChannelPriority: """ :type: int """ - Disabled: libmambapy.bindings.ChannelPriority # value = - Flexible: libmambapy.bindings.ChannelPriority # value = - Strict: libmambapy.bindings.ChannelPriority # value = + Disabled: libmambapy.core.bindings.ChannelPriority # value = + Flexible: libmambapy.core.bindings.ChannelPriority # value = + Strict: libmambapy.core.bindings.ChannelPriority # value = __members__: dict # value = {'Flexible': , 'Strict': , 'Disabled': } pass @@ -423,7 +424,7 @@ class Context: @property def connect_timeout_secs(self) -> float: """ - :type: int + :type: float """ @connect_timeout_secs.setter def connect_timeout_secs(self, arg0: float) -> None: @@ -551,7 +552,7 @@ class Context: @property def connect_timeout_secs(self) -> float: """ - :type: int + :type: float """ @connect_timeout_secs.setter def connect_timeout_secs(self, arg1: float) -> None: @@ -941,13 +942,13 @@ class LogLevel: """ :type: int """ - CRITICAL: libmambapy.bindings.LogLevel # value = - DEBUG: libmambapy.bindings.LogLevel # value = - ERROR: libmambapy.bindings.LogLevel # value = - INFO: libmambapy.bindings.LogLevel # value = - OFF: libmambapy.bindings.LogLevel # value = - TRACE: libmambapy.bindings.LogLevel # value = - WARNING: libmambapy.bindings.LogLevel # value = + CRITICAL: libmambapy.core.bindings.LogLevel # value = + DEBUG: libmambapy.core.bindings.LogLevel # value = + ERROR: libmambapy.core.bindings.LogLevel # value = + INFO: libmambapy.core.bindings.LogLevel # value = + OFF: libmambapy.core.bindings.LogLevel # value = + TRACE: libmambapy.core.bindings.LogLevel # value = + WARNING: libmambapy.core.bindings.LogLevel # value = __members__: dict # value = {'TRACE': , 'DEBUG': , 'INFO': , 'WARNING': , 'ERROR': , 'CRITICAL': , 'OFF': } pass @@ -1248,11 +1249,11 @@ class QueryFormat: """ :type: int """ - JSON: libmambapy.bindings.QueryFormat # value = - PRETTY: libmambapy.bindings.QueryFormat # value = - RECURSIVETABLE: libmambapy.bindings.QueryFormat # value = - TABLE: libmambapy.bindings.QueryFormat # value = - TREE: libmambapy.bindings.QueryFormat # value = + JSON: libmambapy.core.bindings.QueryFormat # value = + PRETTY: libmambapy.core.bindings.QueryFormat # value = + RECURSIVETABLE: libmambapy.core.bindings.QueryFormat # value = + TABLE: libmambapy.core.bindings.QueryFormat # value = + TREE: libmambapy.core.bindings.QueryFormat # value = __members__: dict # value = {'JSON': , 'TREE': , 'TABLE': , 'PRETTY': , 'RECURSIVETABLE': } pass @@ -1482,35 +1483,35 @@ class SolverRuleinfo: """ :type: int """ - SOLVER_RULE_BEST: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_BLACK: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_CHOICE: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_DISTUPGRADE: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_FEATURE: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_INFARCH: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_JOB: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_JOB_UNKNOWN_PACKAGE: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_JOB_UNSUPPORTED: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_LEARNT: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_CONFLICTS: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_CONSTRAINS: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_IMPLICIT_OBSOLETES: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_INSTALLED_OBSOLETES: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_NOT_INSTALLABLE: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_OBSOLETES: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_RECOMMENDS: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_REQUIRES: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_SAME_NAME: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_PKG_SELF_CONFLICT: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_RECOMMENDS: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_STRICT_REPO_PRIORITY: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_UNKNOWN: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_UPDATE: libmambapy.bindings.SolverRuleinfo # value = - SOLVER_RULE_YUMOBS: libmambapy.bindings.SolverRuleinfo # value = + SOLVER_RULE_BEST: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_BLACK: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_CHOICE: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_DISTUPGRADE: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_FEATURE: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_INFARCH: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_JOB: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_JOB_UNKNOWN_PACKAGE: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_JOB_UNSUPPORTED: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_LEARNT: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_CONFLICTS: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_CONSTRAINS: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_IMPLICIT_OBSOLETES: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_INSTALLED_OBSOLETES: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_NOT_INSTALLABLE: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_OBSOLETES: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_RECOMMENDS: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_REQUIRES: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_SAME_NAME: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_PKG_SELF_CONFLICT: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_RECOMMENDS: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_STRICT_REPO_PRIORITY: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_UNKNOWN: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_UPDATE: libmambapy.core.bindings.SolverRuleinfo # value = + SOLVER_RULE_YUMOBS: libmambapy.core.bindings.SolverRuleinfo # value = __members__: dict # value = {'SOLVER_RULE_UNKNOWN': , 'SOLVER_RULE_PKG': , 'SOLVER_RULE_PKG_NOT_INSTALLABLE': , 'SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP': , 'SOLVER_RULE_PKG_REQUIRES': , 'SOLVER_RULE_PKG_SELF_CONFLICT': , 'SOLVER_RULE_PKG_CONFLICTS': , 'SOLVER_RULE_PKG_SAME_NAME': , 'SOLVER_RULE_PKG_OBSOLETES': , 'SOLVER_RULE_PKG_IMPLICIT_OBSOLETES': , 'SOLVER_RULE_PKG_INSTALLED_OBSOLETES': , 'SOLVER_RULE_PKG_RECOMMENDS': , 'SOLVER_RULE_PKG_CONSTRAINS': , 'SOLVER_RULE_UPDATE': , 'SOLVER_RULE_FEATURE': , 'SOLVER_RULE_JOB': , 'SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP': , 'SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM': , 'SOLVER_RULE_JOB_UNKNOWN_PACKAGE': , 'SOLVER_RULE_JOB_UNSUPPORTED': , 'SOLVER_RULE_DISTUPGRADE': , 'SOLVER_RULE_INFARCH': , 'SOLVER_RULE_CHOICE': , 'SOLVER_RULE_LEARNT': , 'SOLVER_RULE_BEST': , 'SOLVER_RULE_YUMOBS': , 'SOLVER_RULE_RECOMMENDS': , 'SOLVER_RULE_BLACK': , 'SOLVER_RULE_STRICT_REPO_PRIORITY': } pass @@ -1598,6 +1599,12 @@ class Transaction: ]: ... pass +class Version: + def __str__(self) -> str: ... + @staticmethod + def parse(arg0: str) -> Version: ... + pass + class ostream_redirect: def __enter__(self) -> None: ... def __exit__(self, *args) -> None: ... diff --git a/libmambapy/src/libmambapy/bindings/bindings.cpp b/libmambapy/src/libmambapy/bindings/bindings.cpp new file mode 100644 index 0000000000..d952815315 --- /dev/null +++ b/libmambapy/src/libmambapy/bindings/bindings.cpp @@ -0,0 +1,12 @@ +// Copyright (c) 2019, QuantStack and Mamba Contributors +// +// Distributed under the terms of the BSD 3-Clause License. +// +// The full license is in the file LICENSE, distributed with this software. + +#include "bindings.hpp" + +PYBIND11_MODULE(bindings, m) +{ + mambapy::legacy::bind_submodule(m.def_submodule("legacy")); +} diff --git a/libmambapy/src/libmambapy/bindings/bindings.hpp b/libmambapy/src/libmambapy/bindings/bindings.hpp new file mode 100644 index 0000000000..1cb5a66a21 --- /dev/null +++ b/libmambapy/src/libmambapy/bindings/bindings.hpp @@ -0,0 +1,19 @@ +// Copyright (c) 2019, QuantStack and Mamba Contributors +// +// Distributed under the terms of the BSD 3-Clause License. +// +// The full license is in the file LICENSE, distributed with this software. + +#ifndef LIBMAMBAPY_HPP +#define LIBMAMBAPY_HPP + +#include + +namespace mambapy +{ + namespace legacy + { + void bind_submodule(pybind11::module_ m); + } +} +#endif diff --git a/libmambapy/src/flat_set_caster.hpp b/libmambapy/src/libmambapy/bindings/flat_set_caster.hpp similarity index 100% rename from libmambapy/src/flat_set_caster.hpp rename to libmambapy/src/libmambapy/bindings/flat_set_caster.hpp diff --git a/libmambapy/src/main.cpp b/libmambapy/src/libmambapy/bindings/legacy.cpp similarity index 99% rename from libmambapy/src/main.cpp rename to libmambapy/src/libmambapy/bindings/legacy.cpp index a608a8e13d..43b4ec8b6b 100644 --- a/libmambapy/src/main.cpp +++ b/libmambapy/src/libmambapy/bindings/legacy.cpp @@ -36,9 +36,9 @@ #include "mamba/core/validate.hpp" #include "mamba/core/virtual_packages.hpp" #include "mamba/specs/version.hpp" -#include "mamba/util/flat_set.hpp" #include "mamba/util/string.hpp" +#include "bindings.hpp" #include "flat_set_caster.hpp" namespace py = pybind11; @@ -258,7 +258,8 @@ namespace mambapy }; } -PYBIND11_MODULE(bindings, m) +void +bind_submodule_impl(pybind11::module_ m) { using namespace mamba; @@ -1330,3 +1331,11 @@ PYBIND11_MODULE(bindings, m) m.attr("MAMBA_CLEAN_TARBALLS") = MAMBA_CLEAN_TARBALLS; m.attr("MAMBA_CLEAN_LOCKS") = MAMBA_CLEAN_LOCKS; } + +namespace mambapy::legacy +{ + void bind_submodule(pybind11::module_ m) + { + bind_submodule_impl(std::move(m)); + } +} diff --git a/libmambapy/longpath.manifest b/libmambapy/src/libmambapy/bindings/longpath.manifest similarity index 100% rename from libmambapy/longpath.manifest rename to libmambapy/src/libmambapy/bindings/longpath.manifest diff --git a/libmambapy/src/libmambapy/py.typed b/libmambapy/src/libmambapy/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libmambapy/libmambapy/_version.py b/libmambapy/src/libmambapy/version.py similarity index 100% rename from libmambapy/libmambapy/_version.py rename to libmambapy/src/libmambapy/version.py diff --git a/libmambapy/libmambapy/_version.py.tmpl b/libmambapy/src/libmambapy/version.py.tmpl similarity index 100% rename from libmambapy/libmambapy/_version.py.tmpl rename to libmambapy/src/libmambapy/version.py.tmpl diff --git a/libmambapy/tests/test_specs.py b/libmambapy/tests/test_specs.py index 5fd7f551bf..7924f6f1ba 100644 --- a/libmambapy/tests/test_specs.py +++ b/libmambapy/tests/test_specs.py @@ -3,5 +3,5 @@ def test_version(): ver_str = "1.0" - ver = libmambapy.bindings.Version.parse(ver_str) + ver = libmambapy.Version.parse(ver_str) assert str(ver) == ver_str diff --git a/pyproject.toml b/pyproject.toml index 63378fe43f..c80cf3f5c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,3 @@ -[build-system] -build-backend = 'setuptools.build_meta' -requires = [ - 'setuptools >= 49.2.1', - 'pybind11 >= 2.2', -] - [tool.pytest.ini_options] minversion = "6.0" tmp_path_retention_policy = "failed" diff --git a/releaser.py b/releaser.py index 08f3f1f1e4..874f41c1c8 100644 --- a/releaser.py +++ b/releaser.py @@ -8,8 +8,7 @@ templates = { "libmamba": "libmamba/include/mamba/version.hpp.tmpl", "micromamba": "micromamba/src/version.hpp.tmpl", - "libmambapy": "libmambapy/libmambapy/_version.py.tmpl", - "mamba": "mamba/mamba/_version.py.tmpl", + "libmambapy": "libmambapy/src/libmambapy/version.py.tmpl", }