# Copyright 2024-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

DISTUTILS_USE_PEP517=hatchling
PYTHON_COMPAT=( python3_{12..14} )

inherit distutils-r1 optfeature pypi

# See https://github.com/anthropics/anthropic-sdk-python/blob/main/.stats.yml
API_SPEC_BASE="https://storage.googleapis.com/stainless-sdk-openapi-specs"
API_SPEC="anthropic-openapi-spec-v2026.03.18.yml"
MY_PN="anthropic-sdk-python"
STDY_PV=0.19.7
DESCRIPTION="The official Python library for the anthropic API"
HOMEPAGE="
	https://github.com/anthropics/anthropic-sdk-python
	https://pypi.org/project/anthropic
"
SRC_URI="
	https://github.com/anthropics/${MY_PN}/archive/refs/tags/v${PV}.tar.gz
		-> ${MY_PN}-${PV}.gh.tar.gz

	test? (
		${API_SPEC_BASE}/anthropic%2Fanthropic-dd2dcd00a757075370a7e4a7f469a1e2d067c2118684c3b70d7906a8f5cf518b.yml
			-> ${API_SPEC}

		https://registry.npmjs.org/@stdy/cli/-/cli-${STDY_PV}.tgz
			-> npm-@stdy-cli-cli-${STDY_PV}.tgz

		amd64? (
			https://registry.npmjs.org/@stdy/cli-linux-x64/-/cli-linux-x64-${STDY_PV}.tgz
				-> npm-@stdy-cli-linux-x64-cli-linux-x64-${STDY_PV}.tgz
		)

		arm64? (
			https://registry.npmjs.org/@stdy/cli-linux-arm64/-/cli-linux-arm64-${STDY_PV}.tgz
				-> npm-@stdy-cli-linux-arm64-cli-linux-arm64-${STDY_PV}.tgz
		)
	)
"
S="${WORKDIR}/${MY_PN}-${PV}"

LICENSE="MIT"
SLOT="0"
KEYWORDS="~amd64 ~arm64"

RDEPEND="
	>=dev-python/anyio-3.5.0[${PYTHON_USEDEP}]
	>=dev-python/distro-1.7.0[${PYTHON_USEDEP}]
	>=dev-python/docstring-parser-0.15[${PYTHON_USEDEP}]
	>=dev-python/httpx-0.25.0[${PYTHON_USEDEP}]
	>=dev-python/jiter-0.4.0[${PYTHON_USEDEP}]
	>=dev-python/pydantic-1.9.0[${PYTHON_USEDEP}]
	dev-python/sniffio[${PYTHON_USEDEP}]
	>=dev-python/typing-extensions-4.14[${PYTHON_USEDEP}]
"

BDEPEND="
	dev-python/hatch-fancy-pypi-readme[${PYTHON_USEDEP}]
	test? (
		>=dev-python/boto3-1.28.57[${PYTHON_USEDEP}]
		>=dev-python/botocore-1.31.57[${PYTHON_USEDEP}]
		dev-python/httpx-aiohttp[${PYTHON_USEDEP}]
		>=dev-python/rich-13.7.1[${PYTHON_USEDEP}]
		net-libs/nodejs[npm]
		net-misc/curl
	)
"

EPYTEST_PLUGINS=(
	dirty-equals
	http-snapshot
	inline-snapshot
	pytest-{asyncio,xdist}
	respx
	time-machine
)
distutils_enable_tests pytest

src_unpack() {
	unpack "${MY_PN}-${PV}.gh.tar.gz"
}

src_test() {
	einfo "Assembling npm cache..."

	local -x npm_config_cache="${WORKDIR}/npm-cache"
	mkdir -p "${npm_config_cache}" || die

	for distfile in ${A}; do
		if [[ "${distfile}" == npm-* ]]; then
			npm cache add "${DISTDIR}/${distfile}" &>/dev/null || die
		fi
	done

	einfo "Installing mock server..."

	local mock_dir="${WORKDIR}/mock-server"
	mkdir -p "${mock_dir}" || die

	cp "${FILESDIR}/${PN}-0.86.0-mock-server-package.json" \
		"${mock_dir}/package.json" || die
	cp "${FILESDIR}/${PN}-0.86.0-mock-server-package-lock.json" \
		"${mock_dir}/package-lock.json" || die

	local mock_dir="${WORKDIR}/mock-server"
	local mock="${mock_dir}/node_modules/.bin/steady"

	pushd "${mock_dir}" >/dev/null || die

	npm ci &>/dev/null || die

	einfo "Starting mock server..."

	# Replicate the logic from scripts/mock --daemon
	"${mock}" --host 127.0.0.1 -p 4010 \
		--validator-form-array-format=brackets \
		--validator-query-array-format=brackets \
		--validator-form-object-format=brackets \
		--validator-query-object-format=brackets \
		"${DISTDIR}/${API_SPEC}" &> .stdy.log &
	local mock_pid=$!

	is_mock_running() {
		local -a args
		readarray -d '' args < "/proc/${mock_pid}/cmdline" 2>/dev/null || return 1
		[[ "${args[1]}" == "${mock}" ]]
	}

	local attempts=0
	while ! curl -sf "http://127.0.0.1:4010/_x-steady/health" &>/dev/null; do
		if ! is_mock_running; then
			cat .stdy.log
			die "Mock server failed to start"
		fi
		attempts=$((attempts + 1))
		if (( attempts >= 300 )); then
			cat .stdy.log
			die "Timed out waiting for mock server to start"
		fi
		sleep 0.1
	done

	# Oops; connected to another Steady instance running on 4010
	is_mock_running || die

	popd >/dev/null || die

	nonfatal distutils-r1_src_test
	local ret=${?}

	if is_mock_running; then
		einfo "Stopping mock server..."
		kill "${mock_pid}" || die
	fi

	[[ ${ret} -ne 0 ]] && die
}

pkg_postinst() {
	optfeature "alternative async HTTP client support" \
		"dev-python/aiohttp >=dev-python/httpx-aiohttp-0.1.9"
	optfeature "Google Cloud Vertex AI integration" \
		">=dev-python/google-auth-2 dev-python/requests"
	optfeature "Amazon Web Services (AWS) Bedrock integration" \
		">=dev-python/boto3-1.28.57 >=dev-python/botocore-1.31.57"
	optfeature "Model Context Protocol (MCP) support" \
		">=dev-python/mcp-1.0"
}