lmnr-0.7.52guru
download
# Copyright 2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DISTUTILS_USE_PEP517=uv-build
PYTHON_COMPAT=( python3_{12..14} )
inherit distutils-r1
MY_PN="lmnr-python"
MY_P="${MY_PN}-${PV}"
DESCRIPTION="Python SDK for Laminar"
HOMEPAGE="
https://github.com/lmnr-ai/lmnr-python
https://pypi.org/project/lmnr/
"
SRC_URI="
https://github.com/lmnr-ai/${MY_PN}/archive/refs/tags/${PV}.tar.gz
-> ${MY_P}.gh.tar.gz
"
S="${WORKDIR}/${MY_P}"
LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="~amd64 ~arm64"
RDEPEND="
>=dev-python/grpcio-1[${PYTHON_USEDEP}]
>=dev-python/httpx-0.24.0[${PYTHON_USEDEP}]
>=dev-python/opentelemetry-api-1.39.0[${PYTHON_USEDEP}]
>=dev-python/opentelemetry-exporter-otlp-proto-grpc-1.39.0[${PYTHON_USEDEP}]
>=dev-python/opentelemetry-exporter-otlp-proto-http-1.39.0[${PYTHON_USEDEP}]
>=dev-python/opentelemetry-instrumentation-0.54_beta0[${PYTHON_USEDEP}]
>=dev-python/opentelemetry-instrumentation-threading-0.54_beta0[${PYTHON_USEDEP}]
>=dev-python/opentelemetry-sdk-1.39.0[${PYTHON_USEDEP}]
>=dev-python/opentelemetry-semantic-conventions-0.60_beta1[${PYTHON_USEDEP}]
>=dev-python/opentelemetry-semantic-conventions-ai-0.4.13[${PYTHON_USEDEP}]
>=dev-python/orjson-3.0.0[${PYTHON_USEDEP}]
>=dev-python/packaging-22.0[${PYTHON_USEDEP}]
>=dev-python/pydantic-2.0.3[${PYTHON_USEDEP}]
>=dev-python/python-dotenv-1.0[${PYTHON_USEDEP}]
>=dev-python/tenacity-8.0[${PYTHON_USEDEP}]
>=dev-python/tqdm-4.0[${PYTHON_USEDEP}]
"
# FIXME keyword litellm and dependencies for arm64
BDEPEND="
test? (
>=dev-python/anthropic-0.95.0[${PYTHON_USEDEP}]
>=dev-python/boto3-1.28.57[${PYTHON_USEDEP}]
!arm64? (
$(python_gen_any_dep '
>=dev-python/litellm-1.85.2[${PYTHON_SINGLE_USEDEP}]
')
)
)
"
EPYTEST_PLUGINS=( pytest-{asyncio,recording,sugar} )
distutils_enable_tests pytest
python_test() {
local EPYTEST_IGNORE=(
# missing optional deps
tests/test_google_genai.py
tests/test_instrumentations/test_claude_agent/
tests/test_langchain.py
tests/test_instrumentations/test_groq/
tests/test_instrumentations/test_openai_agents/
)
local EPYTEST_DESELECT=(
# google-genai
tests/test_utils.py::test_merge_text_parts_empty_list
tests/test_utils.py::test_merge_text_parts_consecutive_strings
tests/test_utils.py::test_merge_text_parts_consecutive_part_objects
tests/test_utils.py::test_merge_text_parts_consecutive_part_dicts
tests/test_utils.py::test_merge_text_parts_mixed_types
tests/test_utils.py::test_merge_text_parts_with_non_text_part
tests/test_utils.py::test_merge_text_parts_with_function_call
tests/test_utils.py::test_merge_text_parts_multiple_non_text_parts
tests/test_utils.py::test_merge_text_parts_only_non_text_parts
tests/test_utils.py::test_merge_text_parts_single_text_part
tests/test_utils.py::test_merge_text_parts_with_file_object
tests/test_utils.py::test_merge_text_parts_trailing_text_only
tests/test_utils.py::test_merge_text_parts_leading_non_text
# langchain-openai
tests/test_observe_concurrency.py::test_observe_threadpool_parallel_spans_with_langchain
tests/test_tracing.py::test_use_span_with_auto_instrumentation_langchain
tests/test_tracing_concurrency.py::test_threadpool_parallel_spans_with_langchain
# network
tests/test_instrumentations/test_openai/traces/test_chat.py::test_chat_exception
tests/test_instrumentations/test_openai/traces/test_chat.py::test_chat_async_exception
tests/test_instrumentations/test_openai/traces/test_chat_parse.py::test_parsed_completion_exception
tests/test_instrumentations/test_openai/traces/test_chat_parse.py::test_async_parsed_completion_exception
tests/test_instrumentations/test_openai/traces/test_completions.py::test_completion_streaming
tests/test_instrumentations/test_openai/traces/test_completions.py::test_completion_exception
tests/test_instrumentations/test_openai/traces/test_completions.py::test_async_completion_exception
tests/test_instrumentations/test_openai/traces/test_embeddings.py::test_embeddings_exception
tests/test_instrumentations/test_openai/traces/test_embeddings.py::test_async_embeddings_exception
)
if ! has_version "dev-python/litellm[${PYTHON_SINGLE_USEDEP}]"; then
EPYTEST_IGNORE+=(
tests/test_litellm.py
)
fi
epytest
}