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
This commit is contained in:
Antoine Prouvost 2023-11-10 18:29:16 +01:00 committed by GitHub
parent ed27c7112c
commit 0d42e81667
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 256 additions and 130 deletions

View File

@ -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/

View File

@ -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/

View File

@ -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:

View File

@ -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}}'

View File

@ -38,6 +38,8 @@ dependencies:
- pip:
- securesystemslib
# libmambapy build dependencies
- scikit-build
- build
- pybind11-stubgen <1.0
# libmambapy dependencies
- python

View File

@ -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
)

View File

@ -22,25 +22,31 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR};${CMAKE_MODULE_PATH}")
@LIBMAMBA_CONFIG_CODE@
include(CMakeFindDependencyMacro)
find_dependency(fmt)
find_dependency(nlohmann_json)
find_dependency(spdlog)
find_dependency(Threads)
find_dependency(tl-expected)
find_dependency(CURL)
find_dependency(LibArchive)
find_dependency(zstd)
find_dependency(BZip2)
find_dependency(OpenSSL)
find_dependency(fmt)
find_dependency(spdlog)
find_dependency(tl-expected)
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()

View File

@ -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
)
target_include_directories(bindings PRIVATE src/libmambapy/bindings)
mamba_target_add_compile_warnings(bindings WARNING_AS_ERROR ${MAMBA_WARNING_AS_ERROR})
target_link_libraries(bindings PRIVATE pybind11::pybind11 mamba::libmamba)
set_property(TARGET bindings PROPERTY CXX_STANDARD 17)
target_link_libraries(bindings PRIVATE pybind11::pybind11 ${libmamba_target})
target_compile_features(bindings PRIVATE cxx_std_17)
install(TARGETS bindings LIBRARY DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/libmambapy/)
# 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()

View File

@ -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")

34
libmambapy/pyproject.toml Normal file
View File

@ -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"]

View File

@ -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

View File

@ -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",
],
)

View File

@ -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__

View File

@ -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 = <ChannelPriority.Disabled: 0>
Flexible: libmambapy.bindings.ChannelPriority # value = <ChannelPriority.Flexible: 1>
Strict: libmambapy.bindings.ChannelPriority # value = <ChannelPriority.Strict: 2>
Disabled: libmambapy.core.bindings.ChannelPriority # value = <ChannelPriority.Disabled: 0>
Flexible: libmambapy.core.bindings.ChannelPriority # value = <ChannelPriority.Flexible: 1>
Strict: libmambapy.core.bindings.ChannelPriority # value = <ChannelPriority.Strict: 2>
__members__: dict # value = {'Flexible': <ChannelPriority.Flexible: 1>, 'Strict': <ChannelPriority.Strict: 2>, 'Disabled': <ChannelPriority.Disabled: 0>}
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 = <LogLevel.CRITICAL: 5>
DEBUG: libmambapy.bindings.LogLevel # value = <LogLevel.DEBUG: 1>
ERROR: libmambapy.bindings.LogLevel # value = <LogLevel.ERROR: 4>
INFO: libmambapy.bindings.LogLevel # value = <LogLevel.INFO: 2>
OFF: libmambapy.bindings.LogLevel # value = <LogLevel.OFF: 6>
TRACE: libmambapy.bindings.LogLevel # value = <LogLevel.TRACE: 0>
WARNING: libmambapy.bindings.LogLevel # value = <LogLevel.WARNING: 3>
CRITICAL: libmambapy.core.bindings.LogLevel # value = <LogLevel.CRITICAL: 5>
DEBUG: libmambapy.core.bindings.LogLevel # value = <LogLevel.DEBUG: 1>
ERROR: libmambapy.core.bindings.LogLevel # value = <LogLevel.ERROR: 4>
INFO: libmambapy.core.bindings.LogLevel # value = <LogLevel.INFO: 2>
OFF: libmambapy.core.bindings.LogLevel # value = <LogLevel.OFF: 6>
TRACE: libmambapy.core.bindings.LogLevel # value = <LogLevel.TRACE: 0>
WARNING: libmambapy.core.bindings.LogLevel # value = <LogLevel.WARNING: 3>
__members__: dict # value = {'TRACE': <LogLevel.TRACE: 0>, 'DEBUG': <LogLevel.DEBUG: 1>, 'INFO': <LogLevel.INFO: 2>, 'WARNING': <LogLevel.WARNING: 3>, 'ERROR': <LogLevel.ERROR: 4>, 'CRITICAL': <LogLevel.CRITICAL: 5>, 'OFF': <LogLevel.OFF: 6>}
pass
@ -1248,11 +1249,11 @@ class QueryFormat:
"""
:type: int
"""
JSON: libmambapy.bindings.QueryFormat # value = <QueryFormat.JSON: 0>
PRETTY: libmambapy.bindings.QueryFormat # value = <QueryFormat.PRETTY: 3>
RECURSIVETABLE: libmambapy.bindings.QueryFormat # value = <QueryFormat.RECURSIVETABLE: 4>
TABLE: libmambapy.bindings.QueryFormat # value = <QueryFormat.TABLE: 2>
TREE: libmambapy.bindings.QueryFormat # value = <QueryFormat.TREE: 1>
JSON: libmambapy.core.bindings.QueryFormat # value = <QueryFormat.JSON: 0>
PRETTY: libmambapy.core.bindings.QueryFormat # value = <QueryFormat.PRETTY: 3>
RECURSIVETABLE: libmambapy.core.bindings.QueryFormat # value = <QueryFormat.RECURSIVETABLE: 4>
TABLE: libmambapy.core.bindings.QueryFormat # value = <QueryFormat.TABLE: 2>
TREE: libmambapy.core.bindings.QueryFormat # value = <QueryFormat.TREE: 1>
__members__: dict # value = {'JSON': <QueryFormat.JSON: 0>, 'TREE': <QueryFormat.TREE: 1>, 'TABLE': <QueryFormat.TABLE: 2>, 'PRETTY': <QueryFormat.PRETTY: 3>, 'RECURSIVETABLE': <QueryFormat.RECURSIVETABLE: 4>}
pass
@ -1482,35 +1483,35 @@ class SolverRuleinfo:
"""
:type: int
"""
SOLVER_RULE_BEST: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_BEST: 2304>
SOLVER_RULE_BLACK: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_BLACK: 3072>
SOLVER_RULE_CHOICE: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_CHOICE: 1792>
SOLVER_RULE_DISTUPGRADE: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_DISTUPGRADE: 1280>
SOLVER_RULE_FEATURE: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_FEATURE: 768>
SOLVER_RULE_INFARCH: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_INFARCH: 1536>
SOLVER_RULE_JOB: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB: 1024>
SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: 1025>
SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: 1026>
SOLVER_RULE_JOB_UNKNOWN_PACKAGE: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB_UNKNOWN_PACKAGE: 1027>
SOLVER_RULE_JOB_UNSUPPORTED: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB_UNSUPPORTED: 1028>
SOLVER_RULE_LEARNT: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_LEARNT: 2048>
SOLVER_RULE_PKG: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG: 256>
SOLVER_RULE_PKG_CONFLICTS: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_CONFLICTS: 261>
SOLVER_RULE_PKG_CONSTRAINS: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_CONSTRAINS: 267>
SOLVER_RULE_PKG_IMPLICIT_OBSOLETES: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_IMPLICIT_OBSOLETES: 264>
SOLVER_RULE_PKG_INSTALLED_OBSOLETES: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_INSTALLED_OBSOLETES: 265>
SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: 258>
SOLVER_RULE_PKG_NOT_INSTALLABLE: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_NOT_INSTALLABLE: 257>
SOLVER_RULE_PKG_OBSOLETES: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_OBSOLETES: 263>
SOLVER_RULE_PKG_RECOMMENDS: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_RECOMMENDS: 266>
SOLVER_RULE_PKG_REQUIRES: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES: 259>
SOLVER_RULE_PKG_SAME_NAME: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_SAME_NAME: 262>
SOLVER_RULE_PKG_SELF_CONFLICT: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_SELF_CONFLICT: 260>
SOLVER_RULE_RECOMMENDS: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_RECOMMENDS: 2816>
SOLVER_RULE_STRICT_REPO_PRIORITY: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_STRICT_REPO_PRIORITY: 3328>
SOLVER_RULE_UNKNOWN: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_UNKNOWN: 0>
SOLVER_RULE_UPDATE: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_UPDATE: 512>
SOLVER_RULE_YUMOBS: libmambapy.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_YUMOBS: 2560>
SOLVER_RULE_BEST: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_BEST: 2304>
SOLVER_RULE_BLACK: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_BLACK: 3072>
SOLVER_RULE_CHOICE: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_CHOICE: 1792>
SOLVER_RULE_DISTUPGRADE: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_DISTUPGRADE: 1280>
SOLVER_RULE_FEATURE: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_FEATURE: 768>
SOLVER_RULE_INFARCH: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_INFARCH: 1536>
SOLVER_RULE_JOB: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB: 1024>
SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: 1025>
SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: 1026>
SOLVER_RULE_JOB_UNKNOWN_PACKAGE: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB_UNKNOWN_PACKAGE: 1027>
SOLVER_RULE_JOB_UNSUPPORTED: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_JOB_UNSUPPORTED: 1028>
SOLVER_RULE_LEARNT: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_LEARNT: 2048>
SOLVER_RULE_PKG: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG: 256>
SOLVER_RULE_PKG_CONFLICTS: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_CONFLICTS: 261>
SOLVER_RULE_PKG_CONSTRAINS: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_CONSTRAINS: 267>
SOLVER_RULE_PKG_IMPLICIT_OBSOLETES: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_IMPLICIT_OBSOLETES: 264>
SOLVER_RULE_PKG_INSTALLED_OBSOLETES: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_INSTALLED_OBSOLETES: 265>
SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: 258>
SOLVER_RULE_PKG_NOT_INSTALLABLE: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_NOT_INSTALLABLE: 257>
SOLVER_RULE_PKG_OBSOLETES: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_OBSOLETES: 263>
SOLVER_RULE_PKG_RECOMMENDS: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_RECOMMENDS: 266>
SOLVER_RULE_PKG_REQUIRES: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES: 259>
SOLVER_RULE_PKG_SAME_NAME: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_SAME_NAME: 262>
SOLVER_RULE_PKG_SELF_CONFLICT: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_PKG_SELF_CONFLICT: 260>
SOLVER_RULE_RECOMMENDS: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_RECOMMENDS: 2816>
SOLVER_RULE_STRICT_REPO_PRIORITY: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_STRICT_REPO_PRIORITY: 3328>
SOLVER_RULE_UNKNOWN: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_UNKNOWN: 0>
SOLVER_RULE_UPDATE: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_UPDATE: 512>
SOLVER_RULE_YUMOBS: libmambapy.core.bindings.SolverRuleinfo # value = <SolverRuleinfo.SOLVER_RULE_YUMOBS: 2560>
__members__: dict # value = {'SOLVER_RULE_UNKNOWN': <SolverRuleinfo.SOLVER_RULE_UNKNOWN: 0>, 'SOLVER_RULE_PKG': <SolverRuleinfo.SOLVER_RULE_PKG: 256>, 'SOLVER_RULE_PKG_NOT_INSTALLABLE': <SolverRuleinfo.SOLVER_RULE_PKG_NOT_INSTALLABLE: 257>, 'SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP': <SolverRuleinfo.SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: 258>, 'SOLVER_RULE_PKG_REQUIRES': <SolverRuleinfo.SOLVER_RULE_PKG_REQUIRES: 259>, 'SOLVER_RULE_PKG_SELF_CONFLICT': <SolverRuleinfo.SOLVER_RULE_PKG_SELF_CONFLICT: 260>, 'SOLVER_RULE_PKG_CONFLICTS': <SolverRuleinfo.SOLVER_RULE_PKG_CONFLICTS: 261>, 'SOLVER_RULE_PKG_SAME_NAME': <SolverRuleinfo.SOLVER_RULE_PKG_SAME_NAME: 262>, 'SOLVER_RULE_PKG_OBSOLETES': <SolverRuleinfo.SOLVER_RULE_PKG_OBSOLETES: 263>, 'SOLVER_RULE_PKG_IMPLICIT_OBSOLETES': <SolverRuleinfo.SOLVER_RULE_PKG_IMPLICIT_OBSOLETES: 264>, 'SOLVER_RULE_PKG_INSTALLED_OBSOLETES': <SolverRuleinfo.SOLVER_RULE_PKG_INSTALLED_OBSOLETES: 265>, 'SOLVER_RULE_PKG_RECOMMENDS': <SolverRuleinfo.SOLVER_RULE_PKG_RECOMMENDS: 266>, 'SOLVER_RULE_PKG_CONSTRAINS': <SolverRuleinfo.SOLVER_RULE_PKG_CONSTRAINS: 267>, 'SOLVER_RULE_UPDATE': <SolverRuleinfo.SOLVER_RULE_UPDATE: 512>, 'SOLVER_RULE_FEATURE': <SolverRuleinfo.SOLVER_RULE_FEATURE: 768>, 'SOLVER_RULE_JOB': <SolverRuleinfo.SOLVER_RULE_JOB: 1024>, 'SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP': <SolverRuleinfo.SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: 1025>, 'SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM': <SolverRuleinfo.SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: 1026>, 'SOLVER_RULE_JOB_UNKNOWN_PACKAGE': <SolverRuleinfo.SOLVER_RULE_JOB_UNKNOWN_PACKAGE: 1027>, 'SOLVER_RULE_JOB_UNSUPPORTED': <SolverRuleinfo.SOLVER_RULE_JOB_UNSUPPORTED: 1028>, 'SOLVER_RULE_DISTUPGRADE': <SolverRuleinfo.SOLVER_RULE_DISTUPGRADE: 1280>, 'SOLVER_RULE_INFARCH': <SolverRuleinfo.SOLVER_RULE_INFARCH: 1536>, 'SOLVER_RULE_CHOICE': <SolverRuleinfo.SOLVER_RULE_CHOICE: 1792>, 'SOLVER_RULE_LEARNT': <SolverRuleinfo.SOLVER_RULE_LEARNT: 2048>, 'SOLVER_RULE_BEST': <SolverRuleinfo.SOLVER_RULE_BEST: 2304>, 'SOLVER_RULE_YUMOBS': <SolverRuleinfo.SOLVER_RULE_YUMOBS: 2560>, 'SOLVER_RULE_RECOMMENDS': <SolverRuleinfo.SOLVER_RULE_RECOMMENDS: 2816>, 'SOLVER_RULE_BLACK': <SolverRuleinfo.SOLVER_RULE_BLACK: 3072>, 'SOLVER_RULE_STRICT_REPO_PRIORITY': <SolverRuleinfo.SOLVER_RULE_STRICT_REPO_PRIORITY: 3328>}
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: ...

View File

@ -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"));
}

View File

@ -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 <pybind11/pybind11.h>
namespace mambapy
{
namespace legacy
{
void bind_submodule(pybind11::module_ m);
}
}
#endif

View File

@ -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));
}
}

View File

View File

@ -3,5 +3,5 @@ import libmambapy
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

View File

@ -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"

View File

@ -8,8 +8,7 @@ template = {"version": None, "changes": []}
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",
}