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,279 +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
- from datetime import datetime
21
- from unittest.mock import ANY, AsyncMock, MagicMock, patch
22
-
23
- import pytest
24
-
25
- from nucliadb.common.cluster import manager, rollover
26
- from nucliadb.common.cluster.index_node import IndexNode
27
- from nucliadb_protos import writer_pb2
28
-
29
- pytestmark = pytest.mark.asyncio
30
-
31
-
32
- @pytest.fixture()
33
- def available_nodes():
34
- nodes = {
35
- "0": IndexNode(
36
- id="0", address="node-0", available_disk=100, shard_count=0, dummy=True
37
- ),
38
- "1": IndexNode(
39
- id="1", address="node-1", available_disk=100, shard_count=0, dummy=True
40
- ),
41
- "2": IndexNode(
42
- id="2", address="node-2", available_disk=100, shard_count=0, dummy=True
43
- ),
44
- }
45
- with patch.object(manager, "INDEX_NODES", new=nodes):
46
- yield nodes
47
-
48
-
49
- @pytest.fixture()
50
- def shards():
51
- yield writer_pb2.Shards(
52
- shards=[
53
- writer_pb2.ShardObject(
54
- shard="1",
55
- replicas=[
56
- writer_pb2.ShardReplica(shard=writer_pb2.ShardCreated(id="1")),
57
- writer_pb2.ShardReplica(shard=writer_pb2.ShardCreated(id="2")),
58
- ],
59
- read_only=True,
60
- ),
61
- writer_pb2.ShardObject(
62
- shard="2",
63
- replicas=[
64
- writer_pb2.ShardReplica(shard=writer_pb2.ShardCreated(id="3")),
65
- writer_pb2.ShardReplica(shard=writer_pb2.ShardCreated(id="4")),
66
- ],
67
- read_only=False,
68
- ),
69
- ],
70
- kbid="kbid",
71
- actual=1,
72
- )
73
-
74
-
75
- @pytest.fixture()
76
- def resource_ids():
77
- yield ["1", "2", "3"]
78
-
79
-
80
- @pytest.fixture()
81
- def resources_datamanager(resource_ids):
82
- mock = MagicMock()
83
-
84
- async def iterate_resource_ids(kbid):
85
- for id in resource_ids:
86
- yield id
87
-
88
- mock.iterate_resource_ids = iterate_resource_ids
89
- mock.get_resource_shard_id = AsyncMock()
90
- mock.get_resource_shard_id.return_value = "1"
91
-
92
- res = MagicMock()
93
-
94
- res.basic.modified.ToDatetime.return_value = datetime.now()
95
-
96
- mock.get_resource = AsyncMock()
97
- mock.get_resource.return_value = res
98
-
99
- mock.get_resource_index_message = AsyncMock()
100
- metadata = MagicMock()
101
- metadata.modified.ToDatetime.return_value = datetime.now()
102
- mock.get_resource_index_message.return_value = metadata
103
-
104
- with patch("nucliadb.common.cluster.rollover.datamanagers.resources", mock):
105
- yield mock
106
-
107
-
108
- @pytest.fixture()
109
- def cluster_datamanager(resource_ids, shards):
110
- mock = MagicMock()
111
- mock.get_kb_shards = AsyncMock()
112
- mock.get_kb_shards.return_value = shards
113
- mock.update_kb_shards = AsyncMock()
114
-
115
- with patch("nucliadb.common.cluster.rollover.datamanagers.cluster", mock):
116
- yield mock
117
-
118
-
119
- @pytest.fixture()
120
- def rollover_datamanager(resource_ids, cluster_datamanager):
121
- mock = MagicMock()
122
- mock.get_kb_rollover_shards = AsyncMock()
123
- mock.get_kb_rollover_shards.return_value = None
124
- mock.update_kb_rollover_shards = AsyncMock()
125
- mock.delete_kb_rollover_shard = AsyncMock()
126
- mock.delete_kb_rollover_shards = AsyncMock()
127
- mock.get_to_index = AsyncMock(side_effect=["1", None])
128
- mock.add_indexed = AsyncMock()
129
- mock.remove_to_index = AsyncMock()
130
- mock.get_indexed_data = AsyncMock(return_value=("1", 1))
131
- mock.remove_indexed = AsyncMock()
132
-
133
- async def _mock_indexed_keys(kbid):
134
- yield "1"
135
-
136
- mock.iter_indexed_keys = _mock_indexed_keys
137
-
138
- with patch("nucliadb.common.cluster.rollover.datamanagers.rollover", mock), patch(
139
- "nucliadb.common.cluster.rollover.datamanagers.with_transaction",
140
- return_value=AsyncMock(),
141
- ), patch(
142
- "nucliadb.ingest.consumer.shard_creator.locking.distributed_lock",
143
- return_value=AsyncMock(),
144
- ):
145
- yield mock
146
-
147
-
148
- @pytest.fixture()
149
- def app_context(rollover_datamanager, resources_datamanager, available_nodes):
150
- mock = MagicMock()
151
- mock.shard_manager = MagicMock()
152
- mock.shard_manager.rollback_shard = AsyncMock()
153
- mock.shard_manager.add_resource = AsyncMock()
154
- mock.shard_manager.delete_resource = AsyncMock()
155
- mock.kv_driver = MagicMock()
156
-
157
- consumer_info = MagicMock()
158
- consumer_info.delivered.stream_seq = 0
159
- mock.nats_manager.js.consumer_info.return_value = consumer_info
160
- yield mock
161
-
162
-
163
- async def test_create_rollover_shards(
164
- app_context, available_nodes, shards: writer_pb2.Shards, rollover_datamanager
165
- ):
166
- new_shards = await rollover.create_rollover_shards(app_context, "kbid")
167
-
168
- assert new_shards.kbid == "kbid"
169
- assert sum(
170
- [len(node.writer.calls["NewShard"]) for node in available_nodes.values()]
171
- ) == sum([len(s.replicas) for s in shards.shards])
172
- rollover_datamanager.update_kb_rollover_shards.assert_called_with(
173
- ANY, kbid="kbid", kb_shards=new_shards
174
- )
175
-
176
-
177
- async def test_create_rollover_shards_does_not_recreate(
178
- app_context, shards: writer_pb2.Shards, rollover_datamanager
179
- ):
180
- rollover_datamanager.get_kb_rollover_shards.return_value = shards
181
-
182
- await rollover.create_rollover_shards(app_context, "kbid")
183
-
184
- app_context.shard_manager.rollback_shard.assert_not_called()
185
- rollover_datamanager.update_kb_rollover_shards.assert_not_called()
186
-
187
-
188
- async def test_index_rollover_shards(
189
- app_context, rollover_datamanager, resources_datamanager, shards, resource_ids
190
- ):
191
- rollover_datamanager.get_kb_rollover_shards.return_value = shards
192
-
193
- await rollover.index_rollover_shards(app_context, "kbid")
194
- rollover_datamanager.add_indexed.assert_called_with(
195
- ANY, kbid="kbid", resource_id="1", shard_id="1", modification_time=1
196
- )
197
-
198
-
199
- async def test_index_rollover_shards_handles_missing_shards(
200
- app_context, rollover_datamanager, resources_datamanager, shards, resource_ids
201
- ):
202
- rollover_datamanager.get_kb_rollover_shards.return_value = None
203
- with pytest.raises(rollover.UnexpectedRolloverError):
204
- await rollover.index_rollover_shards(app_context, "kbid")
205
-
206
-
207
- async def test_index_rollover_shards_handles_missing_shard_id(
208
- app_context, rollover_datamanager, resources_datamanager, shards, resource_ids
209
- ):
210
- rollover_datamanager.get_kb_rollover_shards.return_value = shards
211
- resources_datamanager.get_resource_shard_id.return_value = None
212
- with pytest.raises(rollover.UnexpectedRolloverError):
213
- await rollover.index_rollover_shards(app_context, "kbid")
214
-
215
-
216
- async def test_index_rollover_shards_handles_missing_res(
217
- app_context, rollover_datamanager, resources_datamanager, shards, resource_ids
218
- ):
219
- rollover_datamanager.get_kb_rollover_shards.return_value = shards
220
- resources_datamanager.get_resource_index_message.return_value = None
221
-
222
- await rollover.index_rollover_shards(app_context, "kbid")
223
-
224
- rollover_datamanager.remove_to_index.assert_called_with(
225
- ANY, kbid="kbid", resource="1"
226
- )
227
-
228
-
229
- async def test_cutover_shards(
230
- app_context, rollover_datamanager, cluster_datamanager, shards
231
- ):
232
- rollover_datamanager.get_kb_rollover_shards.return_value = shards
233
-
234
- await rollover.cutover_shards(app_context, "kbid")
235
-
236
- cluster_datamanager.update_kb_shards.assert_called_with(
237
- ANY, kbid="kbid", shards=ANY
238
- )
239
- [
240
- app_context.shard_manager.rollback_shard.assert_any_call(shard)
241
- for shard in shards.shards
242
- ]
243
-
244
-
245
- async def test_cutover_shards_missing(app_context, rollover_datamanager):
246
- rollover_datamanager.get_kb_rollover_shards.return_value = None
247
-
248
- with pytest.raises(rollover.UnexpectedRolloverError):
249
- await rollover.cutover_shards(app_context, "kbid")
250
-
251
-
252
- async def test_validate_indexed_data(
253
- app_context, rollover_datamanager, resources_datamanager, shards, resource_ids
254
- ):
255
- rollover_datamanager.get_kb_rollover_shards.return_value = shards
256
-
257
- indexed_res = await rollover.validate_indexed_data(app_context, "kbid")
258
- assert len(indexed_res) == len(resource_ids)
259
- [
260
- resources_datamanager.get_resource_index_message.assert_any_call(
261
- ANY, kbid="kbid", rid=res_id
262
- )
263
- for res_id in resource_ids
264
- ]
265
-
266
-
267
- async def test_validate_indexed_data_handles_missing_res(
268
- app_context, rollover_datamanager, resources_datamanager, shards, resource_ids
269
- ):
270
- rollover_datamanager.get_kb_rollover_shards.return_value = shards
271
- resources_datamanager.get_resource_index_message.return_value = None
272
- assert len(await rollover.validate_indexed_data(app_context, "kbid")) == 0
273
-
274
-
275
- async def test_rollover_shards(app_context, rollover_datamanager, shards, resource_ids):
276
- rollover_datamanager.get_kb_rollover_shards.return_value = shards
277
- resource_ids.clear()
278
-
279
- await rollover.rollover_kb_shards(app_context, "kbid")
@@ -1,18 +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/>.
@@ -1,127 +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 asyncio
21
- from unittest import mock
22
-
23
- import pytest
24
-
25
- from nucliadb.common.maindb.driver import Driver
26
-
27
-
28
- class TransactionTest:
29
- def __init__(self):
30
- self.abort = mock.AsyncMock()
31
- self.open = True
32
-
33
- async def commit(self, **kw):
34
- self.open = False
35
-
36
-
37
- @pytest.fixture(scope="function")
38
- def txn():
39
- return TransactionTest()
40
-
41
-
42
- @pytest.fixture(scope="function")
43
- def driver(txn) -> Driver: # type: ignore
44
- driver = Driver()
45
- with mock.patch.object(driver, "begin", new=mock.AsyncMock(return_value=txn)):
46
- yield driver
47
-
48
-
49
- @pytest.mark.asyncio
50
- async def test_driver_async_abort(driver, txn):
51
- async with driver.transaction(wait_for_abort=False):
52
- pass
53
-
54
- assert len(driver._abort_tasks) == 1
55
- await asyncio.sleep(0.1)
56
-
57
- txn.abort.assert_called_once()
58
- assert len(driver._abort_tasks) == 0
59
-
60
-
61
- @pytest.mark.asyncio
62
- async def test_driver_finalize_aborts_transactions(driver, txn):
63
- async with driver.transaction(wait_for_abort=False):
64
- pass
65
-
66
- assert len(driver._abort_tasks) == 1
67
-
68
- await driver.finalize()
69
-
70
- txn.abort.assert_called_once()
71
-
72
- assert len(driver._abort_tasks) == 0
73
-
74
-
75
- @pytest.mark.asyncio
76
- async def test_transaction_handles_txn_begin_errors(driver):
77
- driver.begin.side_effect = ValueError()
78
- testmock = mock.AsyncMock()
79
- with pytest.raises(ValueError):
80
- async with driver.transaction():
81
- testmock()
82
- testmock.assert_not_called()
83
-
84
-
85
- @pytest.mark.asyncio
86
- async def test_transaction_does_not_abotr_if_commited(driver):
87
- async with driver.transaction() as txn:
88
- await txn.commit()
89
- txn.abort.assert_not_awaited()
90
-
91
-
92
- @pytest.mark.asyncio
93
- async def test_transaction_aborts_if_txn_open(driver):
94
- async with driver.transaction() as txn:
95
- pass
96
- txn.abort.assert_awaited_once()
97
-
98
-
99
- @pytest.mark.asyncio
100
- async def test_transaction_aborts_on_errors(driver):
101
- with pytest.raises(ValueError):
102
- async with driver.transaction() as txn:
103
- raise ValueError()
104
- txn.abort.assert_awaited_once()
105
-
106
-
107
- @pytest.mark.asyncio
108
- async def test_transaction_wait_for_abort(driver):
109
- async with driver.transaction(wait_for_abort=False) as txn:
110
- pass
111
- txn.abort.assert_not_awaited()
112
- txn.abort.assert_called_once()
113
- txn.abort.reset_mock()
114
-
115
- # Should wait for abort if there are errors
116
- with pytest.raises(ValueError):
117
- async with driver.transaction(wait_for_abort=False) as txn:
118
- raise ValueError()
119
- txn.abort.assert_awaited_once()
120
- txn.abort.assert_called_once()
121
- txn.abort.reset_mock()
122
-
123
- async with driver.transaction(wait_for_abort=True) as txn:
124
- pass
125
- txn.abort.assert_awaited_once()
126
- txn.abort.assert_called_once()
127
- txn.abort.reset_mock()
@@ -1,53 +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
- from unittest.mock import AsyncMock, MagicMock
21
-
22
- import pytest
23
-
24
- from nucliadb.common.maindb.exceptions import ConflictError
25
- from nucliadb.common.maindb.tikv import LeaderNotFoundError, TiKVDataLayer
26
-
27
-
28
- @pytest.mark.parametrize(
29
- "tikv_exception,handled_exception",
30
- [
31
- (
32
- Exception("gRPC error: RpcFailure: 4-DEADLINE_EXCEEDED Deadline Exceeded"),
33
- TimeoutError,
34
- ),
35
- (Exception("Leader of region 34234 is not found"), LeaderNotFoundError),
36
- ],
37
- )
38
- async def test_get_retrials(tikv_exception, handled_exception):
39
- inner_txn = MagicMock(get=AsyncMock(side_effect=tikv_exception))
40
- tikv_txn = TiKVDataLayer(inner_txn)
41
-
42
- with pytest.raises(handled_exception):
43
- await tikv_txn.get("key")
44
-
45
- assert inner_txn.get.call_count == 2
46
-
47
-
48
- async def test_commit_raises_conflict_error():
49
- inner_txn = MagicMock(commit=AsyncMock(side_effect=Exception("WriteConflict")))
50
- tikv_txn = TiKVDataLayer(inner_txn)
51
-
52
- with pytest.raises(ConflictError):
53
- await tikv_txn.commit()
@@ -1,81 +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
- from unittest.mock import AsyncMock, patch
21
-
22
- import pytest
23
-
24
- from nucliadb.common.maindb.utils import settings, setup_driver
25
- from nucliadb_utils.exceptions import ConfigurationError
26
- from nucliadb_utils.utilities import Utility, clean_utility
27
-
28
-
29
- @pytest.fixture(autouse=True)
30
- def reset_driver_utils():
31
- clean_utility(Utility.MAINDB_DRIVER)
32
- yield
33
- clean_utility(Utility.MAINDB_DRIVER)
34
-
35
-
36
- @pytest.mark.asyncio
37
- async def test_setup_driver_redis():
38
- mock = AsyncMock(initialized=False)
39
- with patch.object(settings, "driver", "redis"), patch.object(
40
- settings, "driver_redis_url", "driver_redis_url"
41
- ), patch("nucliadb.common.maindb.utils.RedisDriver", return_value=mock):
42
- assert await setup_driver() == mock
43
- mock.initialize.assert_awaited_once()
44
-
45
-
46
- @pytest.mark.asyncio
47
- async def test_setup_driver_tikv():
48
- mock = AsyncMock(initialized=False)
49
- with patch.object(settings, "driver", "tikv"), patch.object(
50
- settings, "driver_tikv_url", "driver_tikv_url"
51
- ), patch("nucliadb.common.maindb.utils.TiKVDriver", return_value=mock):
52
- assert await setup_driver() == mock
53
- mock.initialize.assert_awaited_once()
54
-
55
-
56
- @pytest.mark.asyncio
57
- async def test_setup_driver_pg():
58
- mock = AsyncMock(initialized=False)
59
- with patch.object(settings, "driver", "pg"), patch.object(
60
- settings, "driver_pg_url", "driver_pg_url"
61
- ), patch("nucliadb.common.maindb.utils.PGDriver", return_value=mock):
62
- assert await setup_driver() == mock
63
- mock.initialize.assert_awaited_once()
64
-
65
-
66
- @pytest.mark.asyncio
67
- async def test_setup_driver_local():
68
- mock = AsyncMock(initialized=False)
69
- with patch.object(settings, "driver", "local"), patch.object(
70
- settings, "driver_local_url", "driver_local_url"
71
- ), patch("nucliadb.common.maindb.utils.LocalDriver", return_value=mock):
72
- assert await setup_driver() == mock
73
- mock.initialize.assert_awaited_once()
74
-
75
-
76
- @pytest.mark.asyncio
77
- async def test_setup_driver_error():
78
- with patch.object(settings, "driver", "pg"), patch.object(
79
- settings, "driver_pg_url", None
80
- ), pytest.raises(ConfigurationError):
81
- await setup_driver()
@@ -1,36 +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 asyncio
21
- from unittest.mock import AsyncMock
22
-
23
- from nucliadb.common.context import ApplicationContext
24
-
25
-
26
- async def test_initialize_happens_only_once():
27
- context = ApplicationContext()
28
- context._initialize = AsyncMock() # noqa
29
-
30
- tasks = []
31
- for _ in range(10):
32
- tasks.append(context.initialize())
33
- await asyncio.gather(*tasks)
34
-
35
- context._initialize.assert_awaited_once()
36
- context._initialized is True
@@ -1,19 +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
- #
@@ -1,37 +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
- from unittest.mock import AsyncMock, Mock
21
-
22
- from nucliadb.export_import.datamanager import ExportImportDataManager
23
-
24
-
25
- async def test_try_delete_from_storage():
26
- driver = Mock()
27
- storage = Mock()
28
-
29
- dm = ExportImportDataManager(driver, storage)
30
- dm.delete_export = AsyncMock(side_effect=ValueError()) # type: ignore
31
- dm.delete_import = AsyncMock(side_effect=ValueError()) # type: ignore
32
-
33
- await dm.try_delete_from_storage("export", "kbid", "foo")
34
- await dm.try_delete_from_storage("import", "kbid", "foo")
35
-
36
- dm.delete_export.assert_called()
37
- dm.delete_import.assert_called()