blob: 286a8d403b6a4e906e2892d724c31aaf46991328 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
|
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DISTUTILS_EXT=1
DISTUTILS_USE_PEP517=hatchling
PYTHON_COMPAT=( pypy3 python3_{10..13} )
inherit check-reqs distutils-r1
MY_P=mongo-python-driver-${PV}
DESCRIPTION="Python driver for MongoDB"
HOMEPAGE="
https://github.com/mongodb/mongo-python-driver/
https://pypi.org/project/pymongo/
"
SRC_URI="
https://github.com/mongodb/mongo-python-driver/archive/${PV}.tar.gz
-> ${MY_P}.gh.tar.gz
"
S=${WORKDIR}/${MY_P}
LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"
IUSE="doc kerberos +native-extensions +test-full"
RDEPEND="
<dev-python/dnspython-3.0.0[${PYTHON_USEDEP}]
kerberos? ( dev-python/kerberos[${PYTHON_USEDEP}] )
"
BDEPEND="
dev-python/setuptools[${PYTHON_USEDEP}]
test? (
dev-python/pytest-asyncio[${PYTHON_USEDEP}]
test-full? (
>=dev-db/mongodb-2.6.0
)
)
"
distutils_enable_sphinx doc
distutils_enable_tests pytest
reqcheck() {
if use test && use test-full; then
# During the tests, database size reaches 1.5G.
local CHECKREQS_DISK_BUILD=1536M
check-reqs_${1}
fi
}
pkg_pretend() {
reqcheck pkg_pretend
}
pkg_setup() {
reqcheck pkg_setup
}
src_prepare() {
distutils-r1_src_prepare
# we do not want hatch-requirements-txt and its ton of NIH deps
sed -i -e '/requirements/d' pyproject.toml || die
}
python_compile() {
# causes build errors to be fatal
local -x TOX_ENV_NAME=whatever
local DISTUTILS_ARGS=()
# unconditionally implicitly disabled on pypy3
if ! use native-extensions; then
export NO_EXT=1
else
export PYMONGO_C_EXT_MUST_BUILD=1
unset NO_EXT
fi
distutils-r1_python_compile
}
python_test() {
rm -rf bson pymongo || die
local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
local EPYTEST_DESELECT=(
# network-sandbox
test/asynchronous/test_client.py::AsyncClientUnitTest::test_connection_timeout_ms_propagates_to_DNS_resolver
test/asynchronous/test_client.py::AsyncClientUnitTest::test_detected_environment_logging
test/asynchronous/test_client.py::AsyncClientUnitTest::test_detected_environment_warning
test/asynchronous/test_client.py::TestClient::test_service_name_from_kwargs
test/asynchronous/test_client.py::TestClient::test_srv_max_hosts_kwarg
test/test_client.py::ClientUnitTest::test_connection_timeout_ms_propagates_to_DNS_resolver
test/test_client.py::ClientUnitTest::test_detected_environment_logging
test/test_client.py::ClientUnitTest::test_detected_environment_warning
test/test_client.py::TestClient::test_service_name_from_kwargs
test/test_client.py::TestClient::test_srv_max_hosts_kwarg
test/test_dns.py::TestCaseInsensitive::test_connect_case_insensitive
test/test_srv_polling.py
test/test_uri_spec.py::TestAllScenarios::test_test_uri_options_srv-options_SRV_URI_with_custom_srvServiceName
test/test_uri_spec.py::TestAllScenarios::test_test_uri_options_srv-options_SRV_URI_with_invalid_type_for_srvMaxHosts
test/test_uri_spec.py::TestAllScenarios::test_test_uri_options_srv-options_SRV_URI_with_negative_integer_for_srvMaxHosts
test/test_uri_spec.py::TestAllScenarios::test_test_uri_options_srv-options_SRV_URI_with_positive_srvMaxHosts_and_loadBalanced=fa
test/test_uri_spec.py::TestAllScenarios::test_test_uri_options_srv-options_SRV_URI_with_srvMaxHosts
test/test_uri_spec.py::TestAllScenarios::test_test_uri_options_srv-options_SRV_URI_with_srvMaxHosts=0_and_loadBalanced=true
test/test_uri_spec.py::TestAllScenarios::test_test_uri_options_srv-options_SRV_URI_with_srvMaxHosts=0_and_replicaSet
# broken regularly by changes in mypy
test/test_typing.py::TestMypyFails::test_mypy_failures
# fragile to timing? fails because we're getting too many logs
test/test_connection_logging.py::TestConnectionLoggingConnectionPoolOptions::test_maxConnecting_should_be_included_in_connection_pool_created_message_when_specified
# hangs?
test/asynchronous/test_grid_file.py::AsyncTestGridFile::test_small_chunks
)
local run_separately=(
# need to run some tests separately and then restart mongodb
# to prevent it from crashing
# https://bugs.gentoo.org/934389
# note that this list must not overlap with EPYTEST_DESELECT
test/test_bulk.py
test/test_change_stream.py
test/test_collection.py
test/test_crud_unified.py
test/test_gridfs.py
test/test_gridfs_bucket.py
)
local run_separately2=(
test/test_command_monitoring.py
test/test_connection_monitoring.py
test/test_cursor.py
test/test_database.py
test/test_grid_file.py
test/test_monitoring.py
)
local run_separately_async=(
test/asynchronous/test_database.py
test/asynchronous/test_grid_file.py
)
if ! use test-full; then
# .invalid is guaranteed to return NXDOMAIN per RFC 6761
local -x DB_IP=mongodb.invalid
epytest
return
fi
# Yes, we need TCP/IP for that...
local -x DB_IP=127.0.0.1
local -x DB_PORT=27000
local dbpath=${TMPDIR}/mongo.db
local logpath=${TMPDIR}/mongod.log
local stage failed=
for stage in {1..5}; do
# Now, the hard part: we need to find a free port for mongod.
# We're just trying to run it random port numbers and check the log
# for bind errors. It shall be noted that 'mongod --fork' does not
# return failure when it fails to bind.
mkdir -p "${dbpath}" || die
while true; do
ebegin "Trying to start mongod on port ${DB_PORT}"
LC_ALL=C \
mongod --dbpath "${dbpath}" --nojournal \
--bind_ip ${DB_IP} --port ${DB_PORT} \
--unixSocketPrefix "${TMPDIR}" \
--logpath "${logpath}" --fork \
&& sleep 2
# Now we need to check if the server actually started...
if [[ ${?} -eq 0 && -S "${TMPDIR}"/mongodb-${DB_PORT}.sock ]]; then
# yay!
eend 0
break
elif grep -q 'Address already in use' "${logpath}"; then
# ay, someone took our port!
eend 1
: $(( DB_PORT += 1 ))
continue
else
eend 1
eerror "Unable to start mongod for tests. See the server log:"
eerror " ${logpath}"
die "Unable to start mongod for tests."
fi
done
local async=( -p asyncio -m default_async )
local def=( -p asyncio -m "default or encryption" )
case ${stage} in
1)
nonfatal epytest "${def[@]}" "${run_separately[@]}" || failed=1
;;
2)
nonfatal epytest "${def[@]}" "${run_separately2[@]}" || failed=1
;;
3)
EPYTEST_DESELECT+=(
"${run_separately[@]}"
"${run_separately2[@]}"
)
nonfatal epytest "${def[@]}" || failed=1
;;
4)
nonfatal epytest "${async[@]}" "${run_separately_async[@]}" || failed=1
;;
5)
EPYTEST_DESELECT+=(
"${run_separately_async[@]}"
)
nonfatal epytest "${async[@]}" || failed=1
;;
esac
mongod --dbpath "${dbpath}" --shutdown || die
done
[[ ${failed} ]] && die "Tests fail with ${EPYTHON}"
rm -rf "${dbpath}" || die
}
|