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

EAPI=8

DISTUTILS_EXT=1
DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( pypy3 python3_{10..13} )

CRATES="
	aho-corasick@1.0.4
	anes@0.1.6
	annotate-snippets@0.6.1
	anstyle@1.0.2
	autocfg@1.1.0
	bitflags@1.3.2
	bitflags@2.4.0
	bumpalo@3.12.0
	cast@0.3.0
	cc@1.0.83
	cfg-if@1.0.0
	chic@1.2.2
	ciborium-io@0.2.0
	ciborium-ll@0.2.0
	ciborium@0.2.0
	clap@4.4.0
	clap_builder@4.4.0
	clap_lex@0.5.1
	criterion-plot@0.5.0
	criterion@0.5.1
	crossbeam-deque@0.8.1
	crossbeam-epoch@0.9.9
	crossbeam-utils@0.8.10
	difference@2.0.0
	either@1.6.1
	equivalent@1.0.1
	errno-dragonfly@0.1.2
	errno@0.3.2
	glob@0.3.0
	half@1.8.2
	hashbrown@0.14.5
	heck@0.4.1
	hermit-abi@0.3.2
	indexmap@2.4.0
	indoc@2.0.4
	instant@0.1.12
	is-terminal@0.4.9
	itertools@0.10.5
	itertools@0.13.0
	itoa@1.0.2
	js-sys@0.3.58
	lazy_static@1.4.0
	libc@0.2.149
	linux-raw-sys@0.4.10
	lock_api@0.4.7
	log@0.4.17
	memchr@2.7.4
	memoffset@0.6.5
	memoffset@0.9.0
	num-traits@0.2.15
	once_cell@1.16.0
	oorandom@11.1.3
	parking_lot@0.11.2
	parking_lot_core@0.8.5
	paste@1.0.15
	peg-macros@0.8.4
	peg-runtime@0.8.3
	peg@0.8.4
	plotters-backend@0.3.2
	plotters-svg@0.3.1
	plotters@0.3.1
	proc-macro2@1.0.86
	pyo3-build-config@0.20.2
	pyo3-ffi@0.20.2
	pyo3-macros-backend@0.20.2
	pyo3-macros@0.20.2
	pyo3@0.20.2
	quote@1.0.37
	rayon-core@1.12.1
	rayon@1.10.0
	redox_syscall@0.2.13
	regex-automata@0.4.7
	regex-syntax@0.8.4
	regex@1.10.6
	rustix@0.38.19
	ryu@1.0.10
	same-file@1.0.6
	scopeguard@1.1.0
	serde@1.0.208
	serde_derive@1.0.208
	serde_json@1.0.125
	serde_spanned@0.6.7
	smallvec@1.8.1
	syn@1.0.109
	syn@2.0.75
	target-lexicon@0.12.4
	termcolor@1.1.3
	thiserror-impl@1.0.63
	thiserror@1.0.63
	tinytemplate@1.2.1
	toml@0.8.19
	toml_datetime@0.6.8
	toml_edit@0.22.20
	trybuild@1.0.99
	unicode-ident@1.0.1
	unindent@0.2.3
	walkdir@2.3.2
	wasm-bindgen-backend@0.2.81
	wasm-bindgen-macro-support@0.2.81
	wasm-bindgen-macro@0.2.81
	wasm-bindgen-shared@0.2.81
	wasm-bindgen@0.2.81
	web-sys@0.3.58
	winapi-i686-pc-windows-gnu@0.4.0
	winapi-util@0.1.5
	winapi-x86_64-pc-windows-gnu@0.4.0
	winapi@0.3.9
	windows-sys@0.48.0
	windows-targets@0.48.5
	windows_aarch64_gnullvm@0.48.5
	windows_aarch64_msvc@0.48.5
	windows_i686_gnu@0.48.5
	windows_i686_msvc@0.48.5
	windows_x86_64_gnu@0.48.5
	windows_x86_64_gnullvm@0.48.5
	windows_x86_64_msvc@0.48.5
	winnow@0.6.18
"

inherit cargo distutils-r1 pypi

DESCRIPTION="A concrete syntax tree with AST-like properties for Python"
HOMEPAGE="
	https://github.com/Instagram/LibCST/
	https://pypi.org/project/libcst/
"
SRC_URI+="
	${CARGO_CRATE_URIS}
"

LICENSE="MIT Apache-2.0 PSF-2"
# Dependent crate licenses
LICENSE+=" Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD MIT"
SLOT="0"
KEYWORDS="~amd64 ~riscv"

RDEPEND="
	>=dev-python/pyyaml-5.2[${PYTHON_USEDEP}]
"
BDEPEND="
	dev-python/setuptools-rust[${PYTHON_USEDEP}]
	dev-python/setuptools-scm[${PYTHON_USEDEP}]
	test? (
		dev-python/black[${PYTHON_USEDEP}]
	)
"

EPYTEST_XDIST=1
distutils_enable_tests pytest

QA_FLAGS_IGNORED="usr/lib/py.*/site-packages/libcst/native.*"

python_test() {
	local EPYTEST_DESELECT=(
		# TODO
		libcst/codemod/tests/test_codemod_cli.py::TestCodemodCLI::test_codemod_formatter_error_input
	)
	local EPYTEST_IGNORE=(
		# fuzzing, require hypothesmith
		libcst/tests/test_fuzz.py
		# require pyre-check
		libcst/metadata/tests/test_type_inference_provider.py
		# requires `python -m libcst.codegen.generate` which has extra
		# deps and needs patching to work in our venv
		# TODO: figure out if we don't need that for revdeps anyway
		libcst/codegen/tests/test_codegen_clean.py
	)

	local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
	cd "${BUILD_DIR}/install$(python_get_sitedir)" || die
	# fixtures
	ln -s "${S}/native" . || die

	nonfatal epytest
	local ret=${?}

	rm native || die

	[[ ${ret} -ne 0 ]] && die "Tests failed on ${EPYTHON}"
}

python_test_all() {
	cd native || die
	cargo_src_test
}