nucliadb 2.46.1.post382__py3-none-any.whl → 6.2.1.post2777__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. migrations/0002_rollover_shards.py +1 -2
  2. migrations/0003_allfields_key.py +2 -37
  3. migrations/0004_rollover_shards.py +1 -2
  4. migrations/0005_rollover_shards.py +1 -2
  5. migrations/0006_rollover_shards.py +2 -4
  6. migrations/0008_cleanup_leftover_rollover_metadata.py +1 -2
  7. migrations/0009_upgrade_relations_and_texts_to_v2.py +5 -4
  8. migrations/0010_fix_corrupt_indexes.py +11 -12
  9. migrations/0011_materialize_labelset_ids.py +2 -18
  10. migrations/0012_rollover_shards.py +6 -12
  11. migrations/0013_rollover_shards.py +2 -4
  12. migrations/0014_rollover_shards.py +5 -7
  13. migrations/0015_targeted_rollover.py +6 -12
  14. migrations/0016_upgrade_to_paragraphs_v2.py +27 -32
  15. migrations/0017_multiple_writable_shards.py +3 -6
  16. migrations/0018_purge_orphan_kbslugs.py +59 -0
  17. migrations/0019_upgrade_to_paragraphs_v3.py +66 -0
  18. migrations/0020_drain_nodes_from_cluster.py +83 -0
  19. nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +17 -18
  20. nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
  21. migrations/0023_backfill_pg_catalog.py +80 -0
  22. migrations/0025_assign_models_to_kbs_v2.py +113 -0
  23. migrations/0026_fix_high_cardinality_content_types.py +61 -0
  24. migrations/0027_rollover_texts3.py +73 -0
  25. nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
  26. migrations/pg/0002_catalog.py +42 -0
  27. nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
  28. nucliadb/common/cluster/base.py +41 -24
  29. nucliadb/common/cluster/discovery/base.py +6 -14
  30. nucliadb/common/cluster/discovery/k8s.py +9 -19
  31. nucliadb/common/cluster/discovery/manual.py +1 -3
  32. nucliadb/common/cluster/discovery/single.py +1 -2
  33. nucliadb/common/cluster/discovery/utils.py +1 -3
  34. nucliadb/common/cluster/grpc_node_dummy.py +11 -16
  35. nucliadb/common/cluster/index_node.py +10 -19
  36. nucliadb/common/cluster/manager.py +223 -102
  37. nucliadb/common/cluster/rebalance.py +42 -37
  38. nucliadb/common/cluster/rollover.py +377 -204
  39. nucliadb/common/cluster/settings.py +16 -9
  40. nucliadb/common/cluster/standalone/grpc_node_binding.py +24 -76
  41. nucliadb/common/cluster/standalone/index_node.py +4 -11
  42. nucliadb/common/cluster/standalone/service.py +2 -6
  43. nucliadb/common/cluster/standalone/utils.py +9 -6
  44. nucliadb/common/cluster/utils.py +43 -29
  45. nucliadb/common/constants.py +20 -0
  46. nucliadb/common/context/__init__.py +6 -4
  47. nucliadb/common/context/fastapi.py +8 -5
  48. nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
  49. nucliadb/common/datamanagers/__init__.py +24 -5
  50. nucliadb/common/datamanagers/atomic.py +102 -0
  51. nucliadb/common/datamanagers/cluster.py +5 -5
  52. nucliadb/common/datamanagers/entities.py +6 -16
  53. nucliadb/common/datamanagers/fields.py +84 -0
  54. nucliadb/common/datamanagers/kb.py +101 -24
  55. nucliadb/common/datamanagers/labels.py +26 -56
  56. nucliadb/common/datamanagers/processing.py +2 -6
  57. nucliadb/common/datamanagers/resources.py +214 -117
  58. nucliadb/common/datamanagers/rollover.py +77 -16
  59. nucliadb/{ingest/orm → common/datamanagers}/synonyms.py +16 -28
  60. nucliadb/common/datamanagers/utils.py +19 -11
  61. nucliadb/common/datamanagers/vectorsets.py +110 -0
  62. nucliadb/common/external_index_providers/base.py +257 -0
  63. nucliadb/{ingest/tests/unit/test_cache.py → common/external_index_providers/exceptions.py} +9 -8
  64. nucliadb/common/external_index_providers/manager.py +101 -0
  65. nucliadb/common/external_index_providers/pinecone.py +933 -0
  66. nucliadb/common/external_index_providers/settings.py +52 -0
  67. nucliadb/common/http_clients/auth.py +3 -6
  68. nucliadb/common/http_clients/processing.py +6 -11
  69. nucliadb/common/http_clients/utils.py +1 -3
  70. nucliadb/common/ids.py +240 -0
  71. nucliadb/common/locking.py +43 -13
  72. nucliadb/common/maindb/driver.py +11 -35
  73. nucliadb/common/maindb/exceptions.py +6 -6
  74. nucliadb/common/maindb/local.py +22 -9
  75. nucliadb/common/maindb/pg.py +206 -111
  76. nucliadb/common/maindb/utils.py +13 -44
  77. nucliadb/common/models_utils/from_proto.py +479 -0
  78. nucliadb/common/models_utils/to_proto.py +60 -0
  79. nucliadb/common/nidx.py +260 -0
  80. nucliadb/export_import/datamanager.py +25 -19
  81. nucliadb/export_import/exceptions.py +8 -0
  82. nucliadb/export_import/exporter.py +20 -7
  83. nucliadb/export_import/importer.py +6 -11
  84. nucliadb/export_import/models.py +5 -5
  85. nucliadb/export_import/tasks.py +4 -4
  86. nucliadb/export_import/utils.py +94 -54
  87. nucliadb/health.py +1 -3
  88. nucliadb/ingest/app.py +15 -11
  89. nucliadb/ingest/consumer/auditing.py +30 -147
  90. nucliadb/ingest/consumer/consumer.py +96 -52
  91. nucliadb/ingest/consumer/materializer.py +10 -12
  92. nucliadb/ingest/consumer/pull.py +12 -27
  93. nucliadb/ingest/consumer/service.py +20 -19
  94. nucliadb/ingest/consumer/shard_creator.py +7 -14
  95. nucliadb/ingest/consumer/utils.py +1 -3
  96. nucliadb/ingest/fields/base.py +139 -188
  97. nucliadb/ingest/fields/conversation.py +18 -5
  98. nucliadb/ingest/fields/exceptions.py +1 -4
  99. nucliadb/ingest/fields/file.py +7 -25
  100. nucliadb/ingest/fields/link.py +11 -16
  101. nucliadb/ingest/fields/text.py +9 -4
  102. nucliadb/ingest/orm/brain.py +255 -262
  103. nucliadb/ingest/orm/broker_message.py +181 -0
  104. nucliadb/ingest/orm/entities.py +36 -51
  105. nucliadb/ingest/orm/exceptions.py +12 -0
  106. nucliadb/ingest/orm/knowledgebox.py +334 -278
  107. nucliadb/ingest/orm/processor/__init__.py +2 -697
  108. nucliadb/ingest/orm/processor/auditing.py +117 -0
  109. nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
  110. nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
  111. nucliadb/ingest/orm/processor/processor.py +752 -0
  112. nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
  113. nucliadb/ingest/orm/resource.py +280 -520
  114. nucliadb/ingest/orm/utils.py +25 -31
  115. nucliadb/ingest/partitions.py +3 -9
  116. nucliadb/ingest/processing.py +76 -81
  117. nucliadb/ingest/py.typed +0 -0
  118. nucliadb/ingest/serialize.py +37 -173
  119. nucliadb/ingest/service/__init__.py +1 -3
  120. nucliadb/ingest/service/writer.py +186 -577
  121. nucliadb/ingest/settings.py +13 -22
  122. nucliadb/ingest/utils.py +3 -6
  123. nucliadb/learning_proxy.py +264 -51
  124. nucliadb/metrics_exporter.py +30 -19
  125. nucliadb/middleware/__init__.py +1 -3
  126. nucliadb/migrator/command.py +1 -3
  127. nucliadb/migrator/datamanager.py +13 -13
  128. nucliadb/migrator/migrator.py +57 -37
  129. nucliadb/migrator/settings.py +2 -1
  130. nucliadb/migrator/utils.py +18 -10
  131. nucliadb/purge/__init__.py +139 -33
  132. nucliadb/purge/orphan_shards.py +7 -13
  133. nucliadb/reader/__init__.py +1 -3
  134. nucliadb/reader/api/models.py +3 -14
  135. nucliadb/reader/api/v1/__init__.py +0 -1
  136. nucliadb/reader/api/v1/download.py +27 -94
  137. nucliadb/reader/api/v1/export_import.py +4 -4
  138. nucliadb/reader/api/v1/knowledgebox.py +13 -13
  139. nucliadb/reader/api/v1/learning_config.py +8 -12
  140. nucliadb/reader/api/v1/resource.py +67 -93
  141. nucliadb/reader/api/v1/services.py +70 -125
  142. nucliadb/reader/app.py +16 -46
  143. nucliadb/reader/lifecycle.py +18 -4
  144. nucliadb/reader/py.typed +0 -0
  145. nucliadb/reader/reader/notifications.py +10 -31
  146. nucliadb/search/__init__.py +1 -3
  147. nucliadb/search/api/v1/__init__.py +2 -2
  148. nucliadb/search/api/v1/ask.py +112 -0
  149. nucliadb/search/api/v1/catalog.py +184 -0
  150. nucliadb/search/api/v1/feedback.py +17 -25
  151. nucliadb/search/api/v1/find.py +41 -41
  152. nucliadb/search/api/v1/knowledgebox.py +90 -62
  153. nucliadb/search/api/v1/predict_proxy.py +2 -2
  154. nucliadb/search/api/v1/resource/ask.py +66 -117
  155. nucliadb/search/api/v1/resource/search.py +51 -72
  156. nucliadb/search/api/v1/router.py +1 -0
  157. nucliadb/search/api/v1/search.py +50 -197
  158. nucliadb/search/api/v1/suggest.py +40 -54
  159. nucliadb/search/api/v1/summarize.py +9 -5
  160. nucliadb/search/api/v1/utils.py +2 -1
  161. nucliadb/search/app.py +16 -48
  162. nucliadb/search/lifecycle.py +10 -3
  163. nucliadb/search/predict.py +176 -188
  164. nucliadb/search/py.typed +0 -0
  165. nucliadb/search/requesters/utils.py +41 -63
  166. nucliadb/search/search/cache.py +149 -20
  167. nucliadb/search/search/chat/ask.py +918 -0
  168. nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -13
  169. nucliadb/search/search/chat/images.py +41 -17
  170. nucliadb/search/search/chat/prompt.py +851 -282
  171. nucliadb/search/search/chat/query.py +274 -267
  172. nucliadb/{writer/resource/slug.py → search/search/cut.py} +8 -6
  173. nucliadb/search/search/fetch.py +43 -36
  174. nucliadb/search/search/filters.py +9 -15
  175. nucliadb/search/search/find.py +214 -54
  176. nucliadb/search/search/find_merge.py +408 -391
  177. nucliadb/search/search/hydrator.py +191 -0
  178. nucliadb/search/search/merge.py +198 -234
  179. nucliadb/search/search/metrics.py +73 -2
  180. nucliadb/search/search/paragraphs.py +64 -106
  181. nucliadb/search/search/pgcatalog.py +233 -0
  182. nucliadb/search/search/predict_proxy.py +1 -1
  183. nucliadb/search/search/query.py +386 -257
  184. nucliadb/search/search/query_parser/exceptions.py +22 -0
  185. nucliadb/search/search/query_parser/models.py +101 -0
  186. nucliadb/search/search/query_parser/parser.py +183 -0
  187. nucliadb/search/search/rank_fusion.py +204 -0
  188. nucliadb/search/search/rerankers.py +270 -0
  189. nucliadb/search/search/shards.py +4 -38
  190. nucliadb/search/search/summarize.py +14 -18
  191. nucliadb/search/search/utils.py +27 -4
  192. nucliadb/search/settings.py +15 -1
  193. nucliadb/standalone/api_router.py +4 -10
  194. nucliadb/standalone/app.py +17 -14
  195. nucliadb/standalone/auth.py +7 -21
  196. nucliadb/standalone/config.py +9 -12
  197. nucliadb/standalone/introspect.py +5 -5
  198. nucliadb/standalone/lifecycle.py +26 -25
  199. nucliadb/standalone/migrations.py +58 -0
  200. nucliadb/standalone/purge.py +9 -8
  201. nucliadb/standalone/py.typed +0 -0
  202. nucliadb/standalone/run.py +25 -18
  203. nucliadb/standalone/settings.py +10 -14
  204. nucliadb/standalone/versions.py +15 -5
  205. nucliadb/tasks/consumer.py +8 -12
  206. nucliadb/tasks/producer.py +7 -6
  207. nucliadb/tests/config.py +53 -0
  208. nucliadb/train/__init__.py +1 -3
  209. nucliadb/train/api/utils.py +1 -2
  210. nucliadb/train/api/v1/shards.py +2 -2
  211. nucliadb/train/api/v1/trainset.py +4 -6
  212. nucliadb/train/app.py +14 -47
  213. nucliadb/train/generator.py +10 -19
  214. nucliadb/train/generators/field_classifier.py +7 -19
  215. nucliadb/train/generators/field_streaming.py +156 -0
  216. nucliadb/train/generators/image_classifier.py +12 -18
  217. nucliadb/train/generators/paragraph_classifier.py +5 -9
  218. nucliadb/train/generators/paragraph_streaming.py +6 -9
  219. nucliadb/train/generators/question_answer_streaming.py +19 -20
  220. nucliadb/train/generators/sentence_classifier.py +9 -15
  221. nucliadb/train/generators/token_classifier.py +45 -36
  222. nucliadb/train/generators/utils.py +14 -18
  223. nucliadb/train/lifecycle.py +7 -3
  224. nucliadb/train/nodes.py +23 -32
  225. nucliadb/train/py.typed +0 -0
  226. nucliadb/train/servicer.py +13 -21
  227. nucliadb/train/settings.py +2 -6
  228. nucliadb/train/types.py +13 -10
  229. nucliadb/train/upload.py +3 -6
  230. nucliadb/train/uploader.py +20 -25
  231. nucliadb/train/utils.py +1 -1
  232. nucliadb/writer/__init__.py +1 -3
  233. nucliadb/writer/api/constants.py +0 -5
  234. nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
  235. nucliadb/writer/api/v1/export_import.py +102 -49
  236. nucliadb/writer/api/v1/field.py +196 -620
  237. nucliadb/writer/api/v1/knowledgebox.py +221 -71
  238. nucliadb/writer/api/v1/learning_config.py +2 -2
  239. nucliadb/writer/api/v1/resource.py +114 -216
  240. nucliadb/writer/api/v1/services.py +64 -132
  241. nucliadb/writer/api/v1/slug.py +61 -0
  242. nucliadb/writer/api/v1/transaction.py +67 -0
  243. nucliadb/writer/api/v1/upload.py +184 -215
  244. nucliadb/writer/app.py +11 -61
  245. nucliadb/writer/back_pressure.py +62 -43
  246. nucliadb/writer/exceptions.py +0 -4
  247. nucliadb/writer/lifecycle.py +21 -15
  248. nucliadb/writer/py.typed +0 -0
  249. nucliadb/writer/resource/audit.py +2 -1
  250. nucliadb/writer/resource/basic.py +48 -62
  251. nucliadb/writer/resource/field.py +45 -135
  252. nucliadb/writer/resource/origin.py +1 -2
  253. nucliadb/writer/settings.py +14 -5
  254. nucliadb/writer/tus/__init__.py +17 -15
  255. nucliadb/writer/tus/azure.py +111 -0
  256. nucliadb/writer/tus/dm.py +17 -5
  257. nucliadb/writer/tus/exceptions.py +1 -3
  258. nucliadb/writer/tus/gcs.py +56 -84
  259. nucliadb/writer/tus/local.py +21 -37
  260. nucliadb/writer/tus/s3.py +28 -68
  261. nucliadb/writer/tus/storage.py +5 -56
  262. nucliadb/writer/vectorsets.py +125 -0
  263. nucliadb-6.2.1.post2777.dist-info/METADATA +148 -0
  264. nucliadb-6.2.1.post2777.dist-info/RECORD +343 -0
  265. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/WHEEL +1 -1
  266. nucliadb/common/maindb/redis.py +0 -194
  267. nucliadb/common/maindb/tikv.py +0 -412
  268. nucliadb/ingest/fields/layout.py +0 -58
  269. nucliadb/ingest/tests/conftest.py +0 -30
  270. nucliadb/ingest/tests/fixtures.py +0 -771
  271. nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
  272. nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -80
  273. nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -89
  274. nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
  275. nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
  276. nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
  277. nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -691
  278. nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
  279. nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
  280. nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
  281. nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -140
  282. nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
  283. nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
  284. nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -139
  285. nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
  286. nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
  287. nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
  288. nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
  289. nucliadb/ingest/tests/unit/orm/test_resource.py +0 -275
  290. nucliadb/ingest/tests/unit/test_partitions.py +0 -40
  291. nucliadb/ingest/tests/unit/test_processing.py +0 -171
  292. nucliadb/middleware/transaction.py +0 -117
  293. nucliadb/reader/api/v1/learning_collector.py +0 -63
  294. nucliadb/reader/tests/__init__.py +0 -19
  295. nucliadb/reader/tests/conftest.py +0 -31
  296. nucliadb/reader/tests/fixtures.py +0 -136
  297. nucliadb/reader/tests/test_list_resources.py +0 -75
  298. nucliadb/reader/tests/test_reader_file_download.py +0 -273
  299. nucliadb/reader/tests/test_reader_resource.py +0 -379
  300. nucliadb/reader/tests/test_reader_resource_field.py +0 -219
  301. nucliadb/search/api/v1/chat.py +0 -258
  302. nucliadb/search/api/v1/resource/chat.py +0 -94
  303. nucliadb/search/tests/__init__.py +0 -19
  304. nucliadb/search/tests/conftest.py +0 -33
  305. nucliadb/search/tests/fixtures.py +0 -199
  306. nucliadb/search/tests/node.py +0 -465
  307. nucliadb/search/tests/unit/__init__.py +0 -18
  308. nucliadb/search/tests/unit/api/__init__.py +0 -19
  309. nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
  310. nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
  311. nucliadb/search/tests/unit/api/v1/resource/test_ask.py +0 -67
  312. nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -97
  313. nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
  314. nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
  315. nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -93
  316. nucliadb/search/tests/unit/search/__init__.py +0 -18
  317. nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
  318. nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -210
  319. nucliadb/search/tests/unit/search/search/__init__.py +0 -19
  320. nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
  321. nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
  322. nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -266
  323. nucliadb/search/tests/unit/search/test_fetch.py +0 -108
  324. nucliadb/search/tests/unit/search/test_filters.py +0 -125
  325. nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
  326. nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
  327. nucliadb/search/tests/unit/search/test_query.py +0 -201
  328. nucliadb/search/tests/unit/test_app.py +0 -79
  329. nucliadb/search/tests/unit/test_find_merge.py +0 -112
  330. nucliadb/search/tests/unit/test_merge.py +0 -34
  331. nucliadb/search/tests/unit/test_predict.py +0 -584
  332. nucliadb/standalone/tests/__init__.py +0 -19
  333. nucliadb/standalone/tests/conftest.py +0 -33
  334. nucliadb/standalone/tests/fixtures.py +0 -38
  335. nucliadb/standalone/tests/unit/__init__.py +0 -18
  336. nucliadb/standalone/tests/unit/test_api_router.py +0 -61
  337. nucliadb/standalone/tests/unit/test_auth.py +0 -169
  338. nucliadb/standalone/tests/unit/test_introspect.py +0 -35
  339. nucliadb/standalone/tests/unit/test_versions.py +0 -68
  340. nucliadb/tests/benchmarks/__init__.py +0 -19
  341. nucliadb/tests/benchmarks/test_search.py +0 -99
  342. nucliadb/tests/conftest.py +0 -32
  343. nucliadb/tests/fixtures.py +0 -736
  344. nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -203
  345. nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -109
  346. nucliadb/tests/migrations/__init__.py +0 -19
  347. nucliadb/tests/migrations/test_migration_0017.py +0 -80
  348. nucliadb/tests/tikv.py +0 -240
  349. nucliadb/tests/unit/__init__.py +0 -19
  350. nucliadb/tests/unit/common/__init__.py +0 -19
  351. nucliadb/tests/unit/common/cluster/__init__.py +0 -19
  352. nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
  353. nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -170
  354. nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
  355. nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -113
  356. nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -59
  357. nucliadb/tests/unit/common/cluster/test_cluster.py +0 -399
  358. nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -178
  359. nucliadb/tests/unit/common/cluster/test_rollover.py +0 -279
  360. nucliadb/tests/unit/common/maindb/__init__.py +0 -18
  361. nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
  362. nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
  363. nucliadb/tests/unit/common/maindb/test_utils.py +0 -81
  364. nucliadb/tests/unit/common/test_context.py +0 -36
  365. nucliadb/tests/unit/export_import/__init__.py +0 -19
  366. nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
  367. nucliadb/tests/unit/export_import/test_utils.py +0 -294
  368. nucliadb/tests/unit/migrator/__init__.py +0 -19
  369. nucliadb/tests/unit/migrator/test_migrator.py +0 -87
  370. nucliadb/tests/unit/tasks/__init__.py +0 -19
  371. nucliadb/tests/unit/tasks/conftest.py +0 -42
  372. nucliadb/tests/unit/tasks/test_consumer.py +0 -93
  373. nucliadb/tests/unit/tasks/test_producer.py +0 -95
  374. nucliadb/tests/unit/tasks/test_tasks.py +0 -60
  375. nucliadb/tests/unit/test_field_ids.py +0 -49
  376. nucliadb/tests/unit/test_health.py +0 -84
  377. nucliadb/tests/unit/test_kb_slugs.py +0 -54
  378. nucliadb/tests/unit/test_learning_proxy.py +0 -252
  379. nucliadb/tests/unit/test_metrics_exporter.py +0 -77
  380. nucliadb/tests/unit/test_purge.py +0 -138
  381. nucliadb/tests/utils/__init__.py +0 -74
  382. nucliadb/tests/utils/aiohttp_session.py +0 -44
  383. nucliadb/tests/utils/broker_messages/__init__.py +0 -167
  384. nucliadb/tests/utils/broker_messages/fields.py +0 -181
  385. nucliadb/tests/utils/broker_messages/helpers.py +0 -33
  386. nucliadb/tests/utils/entities.py +0 -78
  387. nucliadb/train/api/v1/check.py +0 -60
  388. nucliadb/train/tests/__init__.py +0 -19
  389. nucliadb/train/tests/conftest.py +0 -29
  390. nucliadb/train/tests/fixtures.py +0 -342
  391. nucliadb/train/tests/test_field_classification.py +0 -122
  392. nucliadb/train/tests/test_get_entities.py +0 -80
  393. nucliadb/train/tests/test_get_info.py +0 -51
  394. nucliadb/train/tests/test_get_ontology.py +0 -34
  395. nucliadb/train/tests/test_get_ontology_count.py +0 -63
  396. nucliadb/train/tests/test_image_classification.py +0 -222
  397. nucliadb/train/tests/test_list_fields.py +0 -39
  398. nucliadb/train/tests/test_list_paragraphs.py +0 -73
  399. nucliadb/train/tests/test_list_resources.py +0 -39
  400. nucliadb/train/tests/test_list_sentences.py +0 -71
  401. nucliadb/train/tests/test_paragraph_classification.py +0 -123
  402. nucliadb/train/tests/test_paragraph_streaming.py +0 -118
  403. nucliadb/train/tests/test_question_answer_streaming.py +0 -239
  404. nucliadb/train/tests/test_sentence_classification.py +0 -143
  405. nucliadb/train/tests/test_token_classification.py +0 -136
  406. nucliadb/train/tests/utils.py +0 -108
  407. nucliadb/writer/layouts/__init__.py +0 -51
  408. nucliadb/writer/layouts/v1.py +0 -59
  409. nucliadb/writer/resource/vectors.py +0 -120
  410. nucliadb/writer/tests/__init__.py +0 -19
  411. nucliadb/writer/tests/conftest.py +0 -31
  412. nucliadb/writer/tests/fixtures.py +0 -192
  413. nucliadb/writer/tests/test_fields.py +0 -486
  414. nucliadb/writer/tests/test_files.py +0 -743
  415. nucliadb/writer/tests/test_knowledgebox.py +0 -49
  416. nucliadb/writer/tests/test_reprocess_file_field.py +0 -139
  417. nucliadb/writer/tests/test_resources.py +0 -546
  418. nucliadb/writer/tests/test_service.py +0 -137
  419. nucliadb/writer/tests/test_tus.py +0 -203
  420. nucliadb/writer/tests/utils.py +0 -35
  421. nucliadb/writer/tus/pg.py +0 -125
  422. nucliadb-2.46.1.post382.dist-info/METADATA +0 -134
  423. nucliadb-2.46.1.post382.dist-info/RECORD +0 -451
  424. {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
  425. /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
  426. /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
  427. /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
  428. /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
  429. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/entry_points.txt +0 -0
  430. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/top_level.txt +0 -0
  431. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/zip-safe +0 -0
@@ -1,736 +0,0 @@
1
- # Copyright (C) 2021 Bosutech XXI S.L.
2
- #
3
- # nucliadb is offered under the AGPL v3.0 and as commercial software.
4
- # For commercial licensing, contact us at info@nuclia.com.
5
- #
6
- # AGPL:
7
- # This program is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU Affero General Public License as
9
- # published by the Free Software Foundation, either version 3 of the
10
- # License, or (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU Affero General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU Affero General Public License
18
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
- #
20
- import logging
21
- import os
22
- import tempfile
23
- from os.path import dirname
24
- from typing import AsyncIterator
25
- from unittest.mock import Mock
26
-
27
- import asyncpg
28
- import pytest
29
- import tikv_client # type: ignore
30
- from grpc import aio
31
- from httpx import AsyncClient
32
- from nucliadb_protos.train_pb2_grpc import TrainStub
33
- from nucliadb_protos.utils_pb2 import Relation, RelationNode
34
- from nucliadb_protos.writer_pb2 import BrokerMessage
35
- from nucliadb_protos.writer_pb2_grpc import WriterStub
36
- from pytest_lazy_fixtures import lazy_fixture
37
- from redis import asyncio as aioredis
38
-
39
- from nucliadb.common.cluster import manager as cluster_manager
40
- from nucliadb.common.maindb.driver import Driver
41
- from nucliadb.common.maindb.exceptions import UnsetUtility
42
- from nucliadb.common.maindb.local import LocalDriver
43
- from nucliadb.common.maindb.pg import PGDriver
44
- from nucliadb.common.maindb.redis import RedisDriver
45
- from nucliadb.common.maindb.tikv import TiKVDriver
46
- from nucliadb.common.maindb.utils import get_driver
47
- from nucliadb.ingest.settings import DriverConfig, DriverSettings
48
- from nucliadb.ingest.settings import settings as ingest_settings
49
- from nucliadb.standalone.config import config_nucliadb
50
- from nucliadb.standalone.run import run_async_nucliadb
51
- from nucliadb.standalone.settings import Settings
52
- from nucliadb.tests.utils import inject_message
53
- from nucliadb.writer import API_PREFIX
54
- from nucliadb_telemetry.logs import setup_logging
55
- from nucliadb_telemetry.settings import (
56
- LogFormatType,
57
- LogLevel,
58
- LogOutputType,
59
- LogSettings,
60
- )
61
- from nucliadb_utils.storages.settings import settings as storage_settings
62
- from nucliadb_utils.tests import free_port
63
- from nucliadb_utils.utilities import (
64
- Utility,
65
- clean_utility,
66
- clear_global_cache,
67
- get_utility,
68
- set_utility,
69
- )
70
-
71
- logger = logging.getLogger(__name__)
72
-
73
-
74
- @pytest.fixture(scope="function")
75
- async def dummy_processing():
76
- from nucliadb_utils.settings import nuclia_settings
77
-
78
- nuclia_settings.dummy_processing = True
79
-
80
-
81
- @pytest.fixture(scope="function", autouse=True)
82
- def analytics_disabled():
83
- os.environ["NUCLIADB_DISABLE_ANALYTICS"] = "True"
84
- yield
85
- os.environ.pop("NUCLIADB_DISABLE_ANALYTICS")
86
-
87
-
88
- def reset_config():
89
- from nucliadb.common.cluster import settings as cluster_settings
90
- from nucliadb.ingest import settings as ingest_settings
91
- from nucliadb.train import settings as train_settings
92
- from nucliadb.writer import settings as writer_settings
93
- from nucliadb_utils import settings as utils_settings
94
- from nucliadb_utils.cache import settings as cache_settings
95
-
96
- all_settings = [
97
- cluster_settings.settings,
98
- ingest_settings.settings,
99
- train_settings.settings,
100
- writer_settings.settings,
101
- cache_settings.settings,
102
- utils_settings.audit_settings,
103
- utils_settings.http_settings,
104
- utils_settings.indexing_settings,
105
- utils_settings.nuclia_settings,
106
- utils_settings.nucliadb_settings,
107
- utils_settings.storage_settings,
108
- utils_settings.transaction_settings,
109
- ]
110
- for settings in all_settings:
111
- defaults = type(settings)()
112
- for attr, _value in settings:
113
- default_value = getattr(defaults, attr)
114
- setattr(settings, attr, default_value)
115
-
116
- from nucliadb.common.cluster import manager
117
-
118
- manager.INDEX_NODES.clear()
119
-
120
-
121
- @pytest.fixture(scope="function")
122
- def tmpdir():
123
- try:
124
- with tempfile.TemporaryDirectory() as tmpdir:
125
- yield tmpdir
126
- except OSError:
127
- # Python error on tempfile when tearing down the fixture.
128
- # Solved in version 3.11
129
- pass
130
-
131
-
132
- @pytest.fixture(scope="function")
133
- async def nucliadb(
134
- dummy_processing, analytics_disabled, driver_settings, tmpdir, learning_config
135
- ):
136
- from nucliadb.common.cluster import manager
137
-
138
- manager.INDEX_NODES.clear()
139
-
140
- # we need to force DATA_PATH updates to run every test on the proper
141
- # temporary directory
142
- data_path = f"{tmpdir}/node"
143
- local_files = f"{tmpdir}/blob"
144
- os.environ["DATA_PATH"] = data_path
145
-
146
- settings = Settings(
147
- file_backend="local",
148
- local_files=local_files,
149
- data_path=data_path,
150
- http_port=free_port(),
151
- ingest_grpc_port=free_port(),
152
- train_grpc_port=free_port(),
153
- standalone_node_port=free_port(),
154
- log_format_type=LogFormatType.PLAIN,
155
- log_output_type=LogOutputType.FILE,
156
- **driver_settings.dict(),
157
- )
158
-
159
- config_nucliadb(settings)
160
-
161
- # Make sure tests don't write logs outside of the tmpdir
162
- os.environ["ERROR_LOG"] = f"{tmpdir}/logs/error.log"
163
- os.environ["ACCESS_LOG"] = f"{tmpdir}/logs/access.log"
164
- os.environ["INFO_LOG"] = f"{tmpdir}/logs/info.log"
165
-
166
- setup_logging(
167
- settings=LogSettings(
168
- log_output_type=LogOutputType.FILE,
169
- log_format_type=LogFormatType.PLAIN,
170
- debug=False,
171
- log_level=LogLevel.WARNING,
172
- )
173
- )
174
- server = await run_async_nucliadb(settings)
175
-
176
- yield settings
177
-
178
- await maybe_cleanup_maindb()
179
-
180
- reset_config()
181
- clear_global_cache()
182
- await server.shutdown()
183
-
184
-
185
- @pytest.fixture(scope="function")
186
- async def nucliadb_reader(nucliadb: Settings):
187
- async with AsyncClient(
188
- headers={"X-NUCLIADB-ROLES": "READER"},
189
- base_url=f"http://localhost:{nucliadb.http_port}/{API_PREFIX}/v1",
190
- ) as client:
191
- yield client
192
-
193
-
194
- @pytest.fixture(scope="function")
195
- async def nucliadb_writer(nucliadb: Settings):
196
- async with AsyncClient(
197
- headers={"X-NUCLIADB-ROLES": "WRITER"},
198
- base_url=f"http://localhost:{nucliadb.http_port}/{API_PREFIX}/v1",
199
- ) as client:
200
- yield client
201
-
202
-
203
- @pytest.fixture(scope="function")
204
- async def nucliadb_manager(nucliadb: Settings):
205
- async with AsyncClient(
206
- headers={"X-NUCLIADB-ROLES": "MANAGER"},
207
- base_url=f"http://localhost:{nucliadb.http_port}/{API_PREFIX}/v1",
208
- ) as client:
209
- yield client
210
-
211
-
212
- @pytest.fixture(scope="function")
213
- async def knowledgebox(nucliadb_manager: AsyncClient, request):
214
- resp = await nucliadb_manager.post(
215
- "/kbs", json={"slug": "knowledgebox", "release_channel": request.param}
216
- )
217
- assert resp.status_code == 201
218
- uuid = resp.json().get("uuid")
219
-
220
- yield uuid
221
-
222
- resp = await nucliadb_manager.delete(f"/kb/{uuid}")
223
- assert resp.status_code == 200
224
-
225
-
226
- @pytest.fixture(scope="function")
227
- async def nucliadb_grpc(nucliadb: Settings):
228
- stub = WriterStub(aio.insecure_channel(f"localhost:{nucliadb.ingest_grpc_port}")) # type: ignore
229
- return stub
230
-
231
-
232
- @pytest.fixture(scope="function")
233
- async def nucliadb_train(nucliadb: Settings):
234
- stub = TrainStub(aio.insecure_channel(f"localhost:{nucliadb.train_grpc_port}")) # type: ignore
235
- return stub
236
-
237
-
238
- @pytest.fixture(scope="function")
239
- async def knowledge_graph(
240
- nucliadb_writer: AsyncClient, nucliadb_grpc: WriterStub, knowledgebox
241
- ):
242
- resp = await nucliadb_writer.post(
243
- f"/kb/{knowledgebox}/resources",
244
- headers={"X-SYNCHRONOUS": "True"},
245
- json={
246
- "title": "Knowledge graph",
247
- "slug": "knowledgegraph",
248
- "summary": "Test knowledge graph",
249
- },
250
- )
251
- assert resp.status_code == 201
252
- rid = resp.json()["uuid"]
253
-
254
- nodes = {
255
- "Animal": RelationNode(
256
- value="Animal", ntype=RelationNode.NodeType.ENTITY, subtype=""
257
- ),
258
- "Batman": RelationNode(
259
- value="Batman", ntype=RelationNode.NodeType.ENTITY, subtype=""
260
- ),
261
- "Becquer": RelationNode(
262
- value="Becquer", ntype=RelationNode.NodeType.ENTITY, subtype=""
263
- ),
264
- "Cat": RelationNode(
265
- value="Cat", ntype=RelationNode.NodeType.ENTITY, subtype=""
266
- ),
267
- "Catwoman": RelationNode(
268
- value="Catwoman", ntype=RelationNode.NodeType.ENTITY, subtype=""
269
- ),
270
- "Eric": RelationNode(
271
- value="Eric", ntype=RelationNode.NodeType.ENTITY, subtype=""
272
- ),
273
- "Fly": RelationNode(
274
- value="Fly", ntype=RelationNode.NodeType.ENTITY, subtype=""
275
- ),
276
- "Gravity": RelationNode(
277
- value="Gravity", ntype=RelationNode.NodeType.ENTITY, subtype=""
278
- ),
279
- "Joan Antoni": RelationNode(
280
- value="Joan Antoni", ntype=RelationNode.NodeType.ENTITY, subtype=""
281
- ),
282
- "Joker": RelationNode(
283
- value="Joker", ntype=RelationNode.NodeType.ENTITY, subtype=""
284
- ),
285
- "Newton": RelationNode(
286
- value="Newton", ntype=RelationNode.NodeType.ENTITY, subtype="science"
287
- ),
288
- "Isaac Newsome": RelationNode(
289
- value="Isaac Newsome", ntype=RelationNode.NodeType.ENTITY, subtype="science"
290
- ),
291
- "Physics": RelationNode(
292
- value="Physics", ntype=RelationNode.NodeType.ENTITY, subtype="science"
293
- ),
294
- "Poetry": RelationNode(
295
- value="Poetry", ntype=RelationNode.NodeType.ENTITY, subtype=""
296
- ),
297
- "Swallow": RelationNode(
298
- value="Swallow", ntype=RelationNode.NodeType.ENTITY, subtype=""
299
- ),
300
- }
301
-
302
- edges = [
303
- Relation(
304
- relation=Relation.RelationType.ENTITY,
305
- source=nodes["Batman"],
306
- to=nodes["Catwoman"],
307
- relation_label="love",
308
- ),
309
- Relation(
310
- relation=Relation.RelationType.ENTITY,
311
- source=nodes["Batman"],
312
- to=nodes["Joker"],
313
- relation_label="fight",
314
- ),
315
- Relation(
316
- relation=Relation.RelationType.ENTITY,
317
- source=nodes["Joker"],
318
- to=nodes["Physics"],
319
- relation_label="enjoy",
320
- ),
321
- Relation(
322
- relation=Relation.RelationType.ENTITY,
323
- source=nodes["Catwoman"],
324
- to=nodes["Cat"],
325
- relation_label="imitate",
326
- ),
327
- Relation(
328
- relation=Relation.RelationType.ENTITY,
329
- source=nodes["Cat"],
330
- to=nodes["Animal"],
331
- relation_label="species",
332
- ),
333
- Relation(
334
- relation=Relation.RelationType.ENTITY,
335
- source=nodes["Newton"],
336
- to=nodes["Physics"],
337
- relation_label="study",
338
- ),
339
- Relation(
340
- relation=Relation.RelationType.ENTITY,
341
- source=nodes["Newton"],
342
- to=nodes["Gravity"],
343
- relation_label="formulate",
344
- ),
345
- Relation(
346
- relation=Relation.RelationType.ENTITY,
347
- source=nodes["Isaac Newsome"],
348
- to=nodes["Physics"],
349
- relation_label="study",
350
- ),
351
- Relation(
352
- relation=Relation.RelationType.ENTITY,
353
- source=nodes["Isaac Newsome"],
354
- to=nodes["Gravity"],
355
- relation_label="formulate",
356
- ),
357
- Relation(
358
- relation=Relation.RelationType.ENTITY,
359
- source=nodes["Eric"],
360
- to=nodes["Cat"],
361
- relation_label="like",
362
- ),
363
- Relation(
364
- relation=Relation.RelationType.ENTITY,
365
- source=nodes["Eric"],
366
- to=nodes["Joan Antoni"],
367
- relation_label="collaborate",
368
- ),
369
- Relation(
370
- relation=Relation.RelationType.ENTITY,
371
- source=nodes["Joan Antoni"],
372
- to=nodes["Eric"],
373
- relation_label="collaborate",
374
- ),
375
- Relation(
376
- relation=Relation.RelationType.ENTITY,
377
- source=nodes["Joan Antoni"],
378
- to=nodes["Becquer"],
379
- relation_label="read",
380
- ),
381
- Relation(
382
- relation=Relation.RelationType.ENTITY,
383
- source=nodes["Becquer"],
384
- to=nodes["Poetry"],
385
- relation_label="write",
386
- ),
387
- Relation(
388
- relation=Relation.RelationType.ENTITY,
389
- source=nodes["Becquer"],
390
- to=nodes["Poetry"],
391
- relation_label="like",
392
- ),
393
- Relation(
394
- relation=Relation.RelationType.ABOUT,
395
- source=nodes["Poetry"],
396
- to=nodes["Swallow"],
397
- relation_label="about",
398
- ),
399
- Relation(
400
- relation=Relation.RelationType.ENTITY,
401
- source=nodes["Swallow"],
402
- to=nodes["Animal"],
403
- relation_label="species",
404
- ),
405
- Relation(
406
- relation=Relation.RelationType.ENTITY,
407
- source=nodes["Swallow"],
408
- to=nodes["Fly"],
409
- relation_label="can",
410
- ),
411
- Relation(
412
- relation=Relation.RelationType.ENTITY,
413
- source=nodes["Fly"],
414
- to=nodes["Gravity"],
415
- relation_label="defy",
416
- ),
417
- ]
418
-
419
- bm = BrokerMessage()
420
- bm.uuid = rid
421
- bm.kbid = knowledgebox
422
- bm.relations.extend(edges)
423
- await inject_message(nucliadb_grpc, bm)
424
-
425
- resp = await nucliadb_writer.post(
426
- f"/kb/{knowledgebox}/entitiesgroups",
427
- json={
428
- "title": "scientist",
429
- "color": "",
430
- "entities": {
431
- "Isaac": {"value": "Isaac"},
432
- "Isaac Newton": {"value": "Isaac Newton", "represents": ["Newton"]},
433
- "Isaac Newsome": {"value": "Isaac Newsome"},
434
- },
435
- "custom": True,
436
- "group": "scientist",
437
- },
438
- )
439
- assert resp.status_code == 200, resp.content
440
- resp = await nucliadb_writer.patch(
441
- f"/kb/{knowledgebox}/entitiesgroup/scientist",
442
- json={"add": {}, "update": {}, "delete": ["Isaac Newsome"]},
443
- )
444
- assert resp.status_code == 200, resp.content
445
- resp = await nucliadb_writer.post(
446
- f"/kb/{knowledgebox}/entitiesgroups",
447
- json={
448
- "title": "poet",
449
- "color": "",
450
- "entities": {
451
- "Becquer": {
452
- "value": "Becquer",
453
- "represents": ["Gustavo Adolfo Bécquer"],
454
- },
455
- "Gustavo Adolfo Bécquer": {"value": "Gustavo Adolfo Bécquer"},
456
- },
457
- "custom": True,
458
- "group": "poet",
459
- },
460
- )
461
- assert resp.status_code == 200, resp.content
462
-
463
- return (nodes, edges)
464
-
465
-
466
- @pytest.fixture(scope="function")
467
- async def stream_audit(natsd: str):
468
- from nucliadb_utils.audit.stream import StreamAuditStorage
469
- from nucliadb_utils.settings import audit_settings
470
-
471
- audit = StreamAuditStorage(
472
- [natsd],
473
- audit_settings.audit_jetstream_target, # type: ignore
474
- audit_settings.audit_partitions,
475
- audit_settings.audit_hash_seed,
476
- )
477
- await audit.initialize()
478
- yield audit
479
- await audit.finalize()
480
-
481
-
482
- @pytest.fixture(scope="function")
483
- def predict_mock() -> Mock: # type: ignore
484
- predict = get_utility(Utility.PREDICT)
485
- mock = Mock()
486
- set_utility(Utility.PREDICT, mock)
487
-
488
- yield mock
489
-
490
- if predict is None:
491
- clean_utility(Utility.PREDICT)
492
- else:
493
- set_utility(Utility.PREDICT, predict)
494
-
495
-
496
- @pytest.fixture(scope="function")
497
- def metrics_registry():
498
- import prometheus_client.registry # type: ignore
499
-
500
- for collector in prometheus_client.registry.REGISTRY._names_to_collectors.values():
501
- if not hasattr(collector, "_metrics"):
502
- continue
503
- collector._metrics.clear()
504
- yield prometheus_client.registry.REGISTRY
505
-
506
-
507
- @pytest.fixture(scope="function")
508
- async def redis_config(redis):
509
- ingest_settings.driver_redis_url = f"redis://{redis[0]}:{redis[1]}"
510
- default_driver = ingest_settings.driver
511
-
512
- ingest_settings.driver = "redis"
513
-
514
- storage_settings.local_testing_files = f"{dirname(__file__)}"
515
- driver = aioredis.from_url(f"redis://{redis[0]}:{redis[1]}")
516
- await driver.flushall()
517
-
518
- yield ingest_settings.driver_redis_url
519
-
520
- ingest_settings.driver_redis_url = None
521
- ingest_settings.driver = default_driver
522
- await driver.flushall()
523
- await driver.close(close_connection_pool=True)
524
-
525
- pubsub = get_utility(Utility.PUBSUB)
526
- if pubsub is not None:
527
- await pubsub.finalize()
528
-
529
-
530
- @pytest.fixture(scope="function")
531
- def local_driver_settings(tmpdir):
532
- return DriverSettings(
533
- driver=DriverConfig.LOCAL,
534
- driver_local_url=f"{tmpdir}/main",
535
- )
536
-
537
-
538
- @pytest.fixture(scope="function")
539
- async def local_driver(local_driver_settings) -> AsyncIterator[Driver]:
540
- path = local_driver_settings.driver_local_url
541
- ingest_settings.driver = DriverConfig.LOCAL
542
- ingest_settings.driver_local_url = path
543
-
544
- driver: Driver = LocalDriver(url=path)
545
- await driver.initialize()
546
-
547
- yield driver
548
-
549
- await driver.finalize()
550
-
551
- ingest_settings.driver_local_url = None
552
- clean_utility(Utility.MAINDB_DRIVER)
553
-
554
-
555
- @pytest.fixture(scope="function")
556
- def tikv_driver_settings(tikvd):
557
- if os.environ.get("TESTING_TIKV_LOCAL", None):
558
- url = "localhost:2379"
559
- else:
560
- url = f"{tikvd[0]}:{tikvd[2]}"
561
-
562
- # before using tikv, clear the db
563
- # delete here instead of `tikv_driver` fixture because
564
- # these settings are used in tests that the driver fixture
565
- # is not used
566
- client = tikv_client.TransactionClient.connect([url])
567
- txn = client.begin(pessimistic=False)
568
- for key in txn.scan_keys(start=b"", end=None, limit=99999):
569
- txn.delete(key)
570
- txn.commit()
571
-
572
- return DriverSettings(driver=DriverConfig.TIKV, driver_tikv_url=[url])
573
-
574
-
575
- @pytest.fixture(scope="function")
576
- async def tikv_driver(tikv_driver_settings) -> AsyncIterator[Driver]:
577
- url = tikv_driver_settings.driver_tikv_url
578
- ingest_settings.driver = DriverConfig.TIKV
579
- ingest_settings.driver_tikv_url = url
580
-
581
- driver: Driver = TiKVDriver(url=url)
582
- await driver.initialize()
583
-
584
- yield driver
585
-
586
- await driver.finalize()
587
- ingest_settings.driver_tikv_url = None
588
- clean_utility(Utility.MAINDB_DRIVER)
589
-
590
-
591
- @pytest.fixture(scope="function")
592
- def redis_driver_settings(redis):
593
- return DriverSettings(
594
- driver=DriverConfig.REDIS,
595
- driver_redis_url=f"redis://{redis[0]}:{redis[1]}",
596
- )
597
-
598
-
599
- @pytest.fixture(scope="function")
600
- async def redis_driver(redis_driver_settings) -> AsyncIterator[RedisDriver]:
601
- url = redis_driver_settings.driver_redis_url
602
- ingest_settings.driver = DriverConfig.REDIS
603
- ingest_settings.driver_redis_url = url
604
-
605
- driver = RedisDriver(url=url)
606
- await driver.initialize()
607
-
608
- assert driver.redis is not None
609
- await driver.redis.flushall()
610
- logging.info(f"Redis driver ready at {url}")
611
-
612
- set_utility(Utility.MAINDB_DRIVER, driver)
613
-
614
- yield driver
615
-
616
- await driver.finalize()
617
- ingest_settings.driver_redis_url = None
618
- clean_utility(Utility.MAINDB_DRIVER)
619
-
620
-
621
- @pytest.fixture(scope="function")
622
- def pg_driver_settings(pg):
623
- url = f"postgresql://postgres:postgres@{pg[0]}:{pg[1]}/postgres"
624
- return DriverSettings(
625
- driver=DriverConfig.PG,
626
- driver_pg_url=url,
627
- )
628
-
629
-
630
- @pytest.fixture(scope="function")
631
- async def pg_driver(pg_driver_settings):
632
- url = pg_driver_settings.driver_pg_url
633
- ingest_settings.driver = DriverConfig.PG
634
- ingest_settings.driver_pg_url = url
635
-
636
- conn = await asyncpg.connect(url)
637
- await conn.execute(
638
- """
639
- DROP table IF EXISTS resources;
640
- """
641
- )
642
- await conn.close()
643
- driver = PGDriver(url=url)
644
- await driver.initialize()
645
-
646
- yield driver
647
-
648
- await driver.finalize()
649
- ingest_settings.driver_pg_url = None
650
-
651
-
652
- def driver_settings_lazy_fixtures(default_drivers="local"):
653
- driver_types = os.environ.get("TESTING_MAINDB_DRIVERS", default_drivers)
654
- return [
655
- lazy_fixture.lf(f"{driver_type}_driver_settings")
656
- for driver_type in driver_types.split(",")
657
- ]
658
-
659
-
660
- @pytest.fixture(scope="function", params=driver_settings_lazy_fixtures())
661
- def driver_settings(request):
662
- """
663
- Allows dynamically loading the driver fixtures via env vars.
664
-
665
- MAINDB_DRIVER=redis,local pytest nucliadb/nucliadb/tests/
666
-
667
- Any test using the nucliadb fixture will be run twice, once with redis driver and once with local driver.
668
- """
669
- yield request.param
670
-
671
-
672
- def driver_lazy_fixtures(default_drivers: str = "redis"):
673
- """
674
- Allows running tests using maindb_driver for each supported driver type via env vars.
675
-
676
- MAINDB_DRIVER=redis,local pytest nucliadb/nucliadb/ingest/tests/
677
-
678
- Any test using the maindb_driver fixture will be run twice, once with redis_driver and once with local_driver.
679
- """
680
- driver_types = os.environ.get("TESTING_MAINDB_DRIVERS", default_drivers)
681
- return [
682
- lazy_fixture.lf(f"{driver_type}_driver")
683
- for driver_type in driver_types.split(",")
684
- ]
685
-
686
-
687
- @pytest.fixture(
688
- scope="function",
689
- params=driver_lazy_fixtures(),
690
- )
691
- async def maindb_driver(request):
692
- driver = request.param
693
- set_utility(Utility.MAINDB_DRIVER, driver)
694
-
695
- yield driver
696
-
697
- await cleanup_maindb(driver)
698
- clean_utility(Utility.MAINDB_DRIVER)
699
-
700
-
701
- async def maybe_cleanup_maindb():
702
- try:
703
- driver = get_driver()
704
- except UnsetUtility:
705
- pass
706
- else:
707
- try:
708
- await cleanup_maindb(driver)
709
- except Exception:
710
- logger.error("Could not cleanup maindb on test teardown")
711
- pass
712
-
713
-
714
- async def cleanup_maindb(driver: Driver):
715
- if not driver.initialized:
716
- return
717
- async with driver.transaction() as txn:
718
- all_keys = [k async for k in txn.keys("", count=-1)]
719
- for key in all_keys:
720
- await txn.delete(key)
721
- await txn.commit()
722
-
723
-
724
- @pytest.fixture(scope="function")
725
- async def txn(maindb_driver):
726
- txn = await maindb_driver.begin()
727
- yield txn
728
- await txn.abort()
729
-
730
-
731
- @pytest.fixture(scope="function")
732
- async def shard_manager(storage, maindb_driver):
733
- mng = cluster_manager.KBShardManager()
734
- set_utility(Utility.SHARD_MANAGER, mng)
735
- yield mng
736
- clean_utility(Utility.SHARD_MANAGER)