nucliadb 4.0.0.post542__py3-none-any.whl → 6.2.1.post2798__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 (418) hide show
  1. migrations/0003_allfields_key.py +1 -35
  2. migrations/0009_upgrade_relations_and_texts_to_v2.py +4 -2
  3. migrations/0010_fix_corrupt_indexes.py +10 -10
  4. migrations/0011_materialize_labelset_ids.py +1 -16
  5. migrations/0012_rollover_shards.py +5 -10
  6. migrations/0014_rollover_shards.py +4 -5
  7. migrations/0015_targeted_rollover.py +5 -10
  8. migrations/0016_upgrade_to_paragraphs_v2.py +25 -28
  9. migrations/0017_multiple_writable_shards.py +2 -4
  10. migrations/0018_purge_orphan_kbslugs.py +5 -7
  11. migrations/0019_upgrade_to_paragraphs_v3.py +25 -28
  12. migrations/0020_drain_nodes_from_cluster.py +3 -3
  13. nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +16 -19
  14. nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
  15. migrations/0023_backfill_pg_catalog.py +80 -0
  16. migrations/0025_assign_models_to_kbs_v2.py +113 -0
  17. migrations/0026_fix_high_cardinality_content_types.py +61 -0
  18. migrations/0027_rollover_texts3.py +73 -0
  19. nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
  20. migrations/pg/0002_catalog.py +42 -0
  21. nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
  22. nucliadb/common/cluster/base.py +30 -16
  23. nucliadb/common/cluster/discovery/base.py +6 -14
  24. nucliadb/common/cluster/discovery/k8s.py +9 -19
  25. nucliadb/common/cluster/discovery/manual.py +1 -3
  26. nucliadb/common/cluster/discovery/utils.py +1 -3
  27. nucliadb/common/cluster/grpc_node_dummy.py +3 -11
  28. nucliadb/common/cluster/index_node.py +10 -19
  29. nucliadb/common/cluster/manager.py +174 -59
  30. nucliadb/common/cluster/rebalance.py +27 -29
  31. nucliadb/common/cluster/rollover.py +353 -194
  32. nucliadb/common/cluster/settings.py +6 -0
  33. nucliadb/common/cluster/standalone/grpc_node_binding.py +13 -64
  34. nucliadb/common/cluster/standalone/index_node.py +4 -11
  35. nucliadb/common/cluster/standalone/service.py +2 -6
  36. nucliadb/common/cluster/standalone/utils.py +2 -6
  37. nucliadb/common/cluster/utils.py +29 -22
  38. nucliadb/common/constants.py +20 -0
  39. nucliadb/common/context/__init__.py +3 -0
  40. nucliadb/common/context/fastapi.py +8 -5
  41. nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
  42. nucliadb/common/datamanagers/__init__.py +7 -1
  43. nucliadb/common/datamanagers/atomic.py +22 -4
  44. nucliadb/common/datamanagers/cluster.py +5 -5
  45. nucliadb/common/datamanagers/entities.py +6 -16
  46. nucliadb/common/datamanagers/fields.py +84 -0
  47. nucliadb/common/datamanagers/kb.py +83 -37
  48. nucliadb/common/datamanagers/labels.py +26 -56
  49. nucliadb/common/datamanagers/processing.py +2 -6
  50. nucliadb/common/datamanagers/resources.py +41 -103
  51. nucliadb/common/datamanagers/rollover.py +76 -15
  52. nucliadb/common/datamanagers/synonyms.py +1 -1
  53. nucliadb/common/datamanagers/utils.py +15 -6
  54. nucliadb/common/datamanagers/vectorsets.py +110 -0
  55. nucliadb/common/external_index_providers/base.py +257 -0
  56. nucliadb/{ingest/tests/unit/orm/test_orm_utils.py → common/external_index_providers/exceptions.py} +9 -8
  57. nucliadb/common/external_index_providers/manager.py +101 -0
  58. nucliadb/common/external_index_providers/pinecone.py +933 -0
  59. nucliadb/common/external_index_providers/settings.py +52 -0
  60. nucliadb/common/http_clients/auth.py +3 -6
  61. nucliadb/common/http_clients/processing.py +6 -11
  62. nucliadb/common/http_clients/utils.py +1 -3
  63. nucliadb/common/ids.py +240 -0
  64. nucliadb/common/locking.py +29 -7
  65. nucliadb/common/maindb/driver.py +11 -35
  66. nucliadb/common/maindb/exceptions.py +3 -0
  67. nucliadb/common/maindb/local.py +22 -9
  68. nucliadb/common/maindb/pg.py +206 -111
  69. nucliadb/common/maindb/utils.py +11 -42
  70. nucliadb/common/models_utils/from_proto.py +479 -0
  71. nucliadb/common/models_utils/to_proto.py +60 -0
  72. nucliadb/common/nidx.py +260 -0
  73. nucliadb/export_import/datamanager.py +25 -19
  74. nucliadb/export_import/exporter.py +5 -11
  75. nucliadb/export_import/importer.py +5 -7
  76. nucliadb/export_import/models.py +3 -3
  77. nucliadb/export_import/tasks.py +4 -4
  78. nucliadb/export_import/utils.py +25 -37
  79. nucliadb/health.py +1 -3
  80. nucliadb/ingest/app.py +15 -11
  81. nucliadb/ingest/consumer/auditing.py +21 -19
  82. nucliadb/ingest/consumer/consumer.py +82 -47
  83. nucliadb/ingest/consumer/materializer.py +5 -12
  84. nucliadb/ingest/consumer/pull.py +12 -27
  85. nucliadb/ingest/consumer/service.py +19 -17
  86. nucliadb/ingest/consumer/shard_creator.py +2 -4
  87. nucliadb/ingest/consumer/utils.py +1 -3
  88. nucliadb/ingest/fields/base.py +137 -105
  89. nucliadb/ingest/fields/conversation.py +18 -5
  90. nucliadb/ingest/fields/exceptions.py +1 -4
  91. nucliadb/ingest/fields/file.py +7 -16
  92. nucliadb/ingest/fields/link.py +5 -10
  93. nucliadb/ingest/fields/text.py +9 -4
  94. nucliadb/ingest/orm/brain.py +200 -213
  95. nucliadb/ingest/orm/broker_message.py +181 -0
  96. nucliadb/ingest/orm/entities.py +36 -51
  97. nucliadb/ingest/orm/exceptions.py +12 -0
  98. nucliadb/ingest/orm/knowledgebox.py +322 -197
  99. nucliadb/ingest/orm/processor/__init__.py +2 -700
  100. nucliadb/ingest/orm/processor/auditing.py +4 -23
  101. nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
  102. nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
  103. nucliadb/ingest/orm/processor/processor.py +752 -0
  104. nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
  105. nucliadb/ingest/orm/resource.py +249 -403
  106. nucliadb/ingest/orm/utils.py +4 -4
  107. nucliadb/ingest/partitions.py +3 -9
  108. nucliadb/ingest/processing.py +70 -73
  109. nucliadb/ingest/py.typed +0 -0
  110. nucliadb/ingest/serialize.py +37 -167
  111. nucliadb/ingest/service/__init__.py +1 -3
  112. nucliadb/ingest/service/writer.py +185 -412
  113. nucliadb/ingest/settings.py +10 -20
  114. nucliadb/ingest/utils.py +3 -6
  115. nucliadb/learning_proxy.py +242 -55
  116. nucliadb/metrics_exporter.py +30 -19
  117. nucliadb/middleware/__init__.py +1 -3
  118. nucliadb/migrator/command.py +1 -3
  119. nucliadb/migrator/datamanager.py +13 -13
  120. nucliadb/migrator/migrator.py +47 -30
  121. nucliadb/migrator/utils.py +18 -10
  122. nucliadb/purge/__init__.py +139 -33
  123. nucliadb/purge/orphan_shards.py +7 -13
  124. nucliadb/reader/__init__.py +1 -3
  125. nucliadb/reader/api/models.py +1 -12
  126. nucliadb/reader/api/v1/__init__.py +0 -1
  127. nucliadb/reader/api/v1/download.py +21 -88
  128. nucliadb/reader/api/v1/export_import.py +1 -1
  129. nucliadb/reader/api/v1/knowledgebox.py +10 -10
  130. nucliadb/reader/api/v1/learning_config.py +2 -6
  131. nucliadb/reader/api/v1/resource.py +62 -88
  132. nucliadb/reader/api/v1/services.py +64 -83
  133. nucliadb/reader/app.py +12 -29
  134. nucliadb/reader/lifecycle.py +18 -4
  135. nucliadb/reader/py.typed +0 -0
  136. nucliadb/reader/reader/notifications.py +10 -28
  137. nucliadb/search/__init__.py +1 -3
  138. nucliadb/search/api/v1/__init__.py +1 -2
  139. nucliadb/search/api/v1/ask.py +17 -10
  140. nucliadb/search/api/v1/catalog.py +184 -0
  141. nucliadb/search/api/v1/feedback.py +16 -24
  142. nucliadb/search/api/v1/find.py +36 -36
  143. nucliadb/search/api/v1/knowledgebox.py +89 -60
  144. nucliadb/search/api/v1/resource/ask.py +2 -8
  145. nucliadb/search/api/v1/resource/search.py +49 -70
  146. nucliadb/search/api/v1/search.py +44 -210
  147. nucliadb/search/api/v1/suggest.py +39 -54
  148. nucliadb/search/app.py +12 -32
  149. nucliadb/search/lifecycle.py +10 -3
  150. nucliadb/search/predict.py +136 -187
  151. nucliadb/search/py.typed +0 -0
  152. nucliadb/search/requesters/utils.py +25 -58
  153. nucliadb/search/search/cache.py +149 -20
  154. nucliadb/search/search/chat/ask.py +571 -123
  155. nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -14
  156. nucliadb/search/search/chat/images.py +41 -17
  157. nucliadb/search/search/chat/prompt.py +817 -266
  158. nucliadb/search/search/chat/query.py +213 -309
  159. nucliadb/{tests/migrations/__init__.py → search/search/cut.py} +8 -8
  160. nucliadb/search/search/fetch.py +43 -36
  161. nucliadb/search/search/filters.py +9 -15
  162. nucliadb/search/search/find.py +214 -53
  163. nucliadb/search/search/find_merge.py +408 -391
  164. nucliadb/search/search/hydrator.py +191 -0
  165. nucliadb/search/search/merge.py +187 -223
  166. nucliadb/search/search/metrics.py +73 -2
  167. nucliadb/search/search/paragraphs.py +64 -106
  168. nucliadb/search/search/pgcatalog.py +233 -0
  169. nucliadb/search/search/predict_proxy.py +1 -1
  170. nucliadb/search/search/query.py +305 -150
  171. nucliadb/search/search/query_parser/exceptions.py +22 -0
  172. nucliadb/search/search/query_parser/models.py +101 -0
  173. nucliadb/search/search/query_parser/parser.py +183 -0
  174. nucliadb/search/search/rank_fusion.py +204 -0
  175. nucliadb/search/search/rerankers.py +270 -0
  176. nucliadb/search/search/shards.py +3 -32
  177. nucliadb/search/search/summarize.py +7 -18
  178. nucliadb/search/search/utils.py +27 -4
  179. nucliadb/search/settings.py +15 -1
  180. nucliadb/standalone/api_router.py +4 -10
  181. nucliadb/standalone/app.py +8 -14
  182. nucliadb/standalone/auth.py +7 -21
  183. nucliadb/standalone/config.py +7 -10
  184. nucliadb/standalone/lifecycle.py +26 -25
  185. nucliadb/standalone/migrations.py +1 -3
  186. nucliadb/standalone/purge.py +1 -1
  187. nucliadb/standalone/py.typed +0 -0
  188. nucliadb/standalone/run.py +3 -6
  189. nucliadb/standalone/settings.py +9 -16
  190. nucliadb/standalone/versions.py +15 -5
  191. nucliadb/tasks/consumer.py +8 -12
  192. nucliadb/tasks/producer.py +7 -6
  193. nucliadb/tests/config.py +53 -0
  194. nucliadb/train/__init__.py +1 -3
  195. nucliadb/train/api/utils.py +1 -2
  196. nucliadb/train/api/v1/shards.py +1 -1
  197. nucliadb/train/api/v1/trainset.py +2 -4
  198. nucliadb/train/app.py +10 -31
  199. nucliadb/train/generator.py +10 -19
  200. nucliadb/train/generators/field_classifier.py +7 -19
  201. nucliadb/train/generators/field_streaming.py +156 -0
  202. nucliadb/train/generators/image_classifier.py +12 -18
  203. nucliadb/train/generators/paragraph_classifier.py +5 -9
  204. nucliadb/train/generators/paragraph_streaming.py +6 -9
  205. nucliadb/train/generators/question_answer_streaming.py +19 -20
  206. nucliadb/train/generators/sentence_classifier.py +9 -15
  207. nucliadb/train/generators/token_classifier.py +48 -39
  208. nucliadb/train/generators/utils.py +14 -18
  209. nucliadb/train/lifecycle.py +7 -3
  210. nucliadb/train/nodes.py +23 -32
  211. nucliadb/train/py.typed +0 -0
  212. nucliadb/train/servicer.py +13 -21
  213. nucliadb/train/settings.py +2 -6
  214. nucliadb/train/types.py +13 -10
  215. nucliadb/train/upload.py +3 -6
  216. nucliadb/train/uploader.py +19 -23
  217. nucliadb/train/utils.py +1 -1
  218. nucliadb/writer/__init__.py +1 -3
  219. nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
  220. nucliadb/writer/api/v1/export_import.py +67 -14
  221. nucliadb/writer/api/v1/field.py +16 -269
  222. nucliadb/writer/api/v1/knowledgebox.py +218 -68
  223. nucliadb/writer/api/v1/resource.py +68 -88
  224. nucliadb/writer/api/v1/services.py +51 -70
  225. nucliadb/writer/api/v1/slug.py +61 -0
  226. nucliadb/writer/api/v1/transaction.py +67 -0
  227. nucliadb/writer/api/v1/upload.py +143 -117
  228. nucliadb/writer/app.py +6 -43
  229. nucliadb/writer/back_pressure.py +16 -38
  230. nucliadb/writer/exceptions.py +0 -4
  231. nucliadb/writer/lifecycle.py +21 -15
  232. nucliadb/writer/py.typed +0 -0
  233. nucliadb/writer/resource/audit.py +2 -1
  234. nucliadb/writer/resource/basic.py +48 -46
  235. nucliadb/writer/resource/field.py +37 -128
  236. nucliadb/writer/resource/origin.py +1 -2
  237. nucliadb/writer/settings.py +6 -2
  238. nucliadb/writer/tus/__init__.py +17 -15
  239. nucliadb/writer/tus/azure.py +111 -0
  240. nucliadb/writer/tus/dm.py +17 -5
  241. nucliadb/writer/tus/exceptions.py +1 -3
  242. nucliadb/writer/tus/gcs.py +49 -84
  243. nucliadb/writer/tus/local.py +21 -37
  244. nucliadb/writer/tus/s3.py +28 -68
  245. nucliadb/writer/tus/storage.py +5 -56
  246. nucliadb/writer/vectorsets.py +125 -0
  247. nucliadb-6.2.1.post2798.dist-info/METADATA +148 -0
  248. nucliadb-6.2.1.post2798.dist-info/RECORD +343 -0
  249. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/WHEEL +1 -1
  250. nucliadb/common/maindb/redis.py +0 -194
  251. nucliadb/common/maindb/tikv.py +0 -433
  252. nucliadb/ingest/fields/layout.py +0 -58
  253. nucliadb/ingest/tests/conftest.py +0 -30
  254. nucliadb/ingest/tests/fixtures.py +0 -764
  255. nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
  256. nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -78
  257. nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -126
  258. nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
  259. nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
  260. nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
  261. nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -684
  262. nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
  263. nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
  264. nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
  265. nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -139
  266. nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
  267. nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
  268. nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -140
  269. nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
  270. nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
  271. nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
  272. nucliadb/ingest/tests/unit/orm/test_brain_vectors.py +0 -74
  273. nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
  274. nucliadb/ingest/tests/unit/orm/test_resource.py +0 -331
  275. nucliadb/ingest/tests/unit/test_cache.py +0 -31
  276. nucliadb/ingest/tests/unit/test_partitions.py +0 -40
  277. nucliadb/ingest/tests/unit/test_processing.py +0 -171
  278. nucliadb/middleware/transaction.py +0 -117
  279. nucliadb/reader/api/v1/learning_collector.py +0 -63
  280. nucliadb/reader/tests/__init__.py +0 -19
  281. nucliadb/reader/tests/conftest.py +0 -31
  282. nucliadb/reader/tests/fixtures.py +0 -136
  283. nucliadb/reader/tests/test_list_resources.py +0 -75
  284. nucliadb/reader/tests/test_reader_file_download.py +0 -273
  285. nucliadb/reader/tests/test_reader_resource.py +0 -353
  286. nucliadb/reader/tests/test_reader_resource_field.py +0 -219
  287. nucliadb/search/api/v1/chat.py +0 -263
  288. nucliadb/search/api/v1/resource/chat.py +0 -174
  289. nucliadb/search/tests/__init__.py +0 -19
  290. nucliadb/search/tests/conftest.py +0 -33
  291. nucliadb/search/tests/fixtures.py +0 -199
  292. nucliadb/search/tests/node.py +0 -466
  293. nucliadb/search/tests/unit/__init__.py +0 -18
  294. nucliadb/search/tests/unit/api/__init__.py +0 -19
  295. nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
  296. nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
  297. nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -98
  298. nucliadb/search/tests/unit/api/v1/test_ask.py +0 -120
  299. nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
  300. nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
  301. nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -99
  302. nucliadb/search/tests/unit/search/__init__.py +0 -18
  303. nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
  304. nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -211
  305. nucliadb/search/tests/unit/search/search/__init__.py +0 -19
  306. nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
  307. nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
  308. nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -270
  309. nucliadb/search/tests/unit/search/test_fetch.py +0 -108
  310. nucliadb/search/tests/unit/search/test_filters.py +0 -125
  311. nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
  312. nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
  313. nucliadb/search/tests/unit/search/test_query.py +0 -153
  314. nucliadb/search/tests/unit/test_app.py +0 -79
  315. nucliadb/search/tests/unit/test_find_merge.py +0 -112
  316. nucliadb/search/tests/unit/test_merge.py +0 -34
  317. nucliadb/search/tests/unit/test_predict.py +0 -525
  318. nucliadb/standalone/tests/__init__.py +0 -19
  319. nucliadb/standalone/tests/conftest.py +0 -33
  320. nucliadb/standalone/tests/fixtures.py +0 -38
  321. nucliadb/standalone/tests/unit/__init__.py +0 -18
  322. nucliadb/standalone/tests/unit/test_api_router.py +0 -61
  323. nucliadb/standalone/tests/unit/test_auth.py +0 -169
  324. nucliadb/standalone/tests/unit/test_introspect.py +0 -35
  325. nucliadb/standalone/tests/unit/test_migrations.py +0 -63
  326. nucliadb/standalone/tests/unit/test_versions.py +0 -68
  327. nucliadb/tests/benchmarks/__init__.py +0 -19
  328. nucliadb/tests/benchmarks/test_search.py +0 -99
  329. nucliadb/tests/conftest.py +0 -32
  330. nucliadb/tests/fixtures.py +0 -735
  331. nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -202
  332. nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -107
  333. nucliadb/tests/migrations/test_migration_0017.py +0 -76
  334. nucliadb/tests/migrations/test_migration_0018.py +0 -95
  335. nucliadb/tests/tikv.py +0 -240
  336. nucliadb/tests/unit/__init__.py +0 -19
  337. nucliadb/tests/unit/common/__init__.py +0 -19
  338. nucliadb/tests/unit/common/cluster/__init__.py +0 -19
  339. nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
  340. nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -172
  341. nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
  342. nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -114
  343. nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -61
  344. nucliadb/tests/unit/common/cluster/test_cluster.py +0 -408
  345. nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -173
  346. nucliadb/tests/unit/common/cluster/test_rebalance.py +0 -38
  347. nucliadb/tests/unit/common/cluster/test_rollover.py +0 -282
  348. nucliadb/tests/unit/common/maindb/__init__.py +0 -18
  349. nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
  350. nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
  351. nucliadb/tests/unit/common/maindb/test_utils.py +0 -92
  352. nucliadb/tests/unit/common/test_context.py +0 -36
  353. nucliadb/tests/unit/export_import/__init__.py +0 -19
  354. nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
  355. nucliadb/tests/unit/export_import/test_utils.py +0 -301
  356. nucliadb/tests/unit/migrator/__init__.py +0 -19
  357. nucliadb/tests/unit/migrator/test_migrator.py +0 -87
  358. nucliadb/tests/unit/tasks/__init__.py +0 -19
  359. nucliadb/tests/unit/tasks/conftest.py +0 -42
  360. nucliadb/tests/unit/tasks/test_consumer.py +0 -92
  361. nucliadb/tests/unit/tasks/test_producer.py +0 -95
  362. nucliadb/tests/unit/tasks/test_tasks.py +0 -58
  363. nucliadb/tests/unit/test_field_ids.py +0 -49
  364. nucliadb/tests/unit/test_health.py +0 -86
  365. nucliadb/tests/unit/test_kb_slugs.py +0 -54
  366. nucliadb/tests/unit/test_learning_proxy.py +0 -252
  367. nucliadb/tests/unit/test_metrics_exporter.py +0 -77
  368. nucliadb/tests/unit/test_purge.py +0 -136
  369. nucliadb/tests/utils/__init__.py +0 -74
  370. nucliadb/tests/utils/aiohttp_session.py +0 -44
  371. nucliadb/tests/utils/broker_messages/__init__.py +0 -171
  372. nucliadb/tests/utils/broker_messages/fields.py +0 -197
  373. nucliadb/tests/utils/broker_messages/helpers.py +0 -33
  374. nucliadb/tests/utils/entities.py +0 -78
  375. nucliadb/train/api/v1/check.py +0 -60
  376. nucliadb/train/tests/__init__.py +0 -19
  377. nucliadb/train/tests/conftest.py +0 -29
  378. nucliadb/train/tests/fixtures.py +0 -342
  379. nucliadb/train/tests/test_field_classification.py +0 -122
  380. nucliadb/train/tests/test_get_entities.py +0 -80
  381. nucliadb/train/tests/test_get_info.py +0 -51
  382. nucliadb/train/tests/test_get_ontology.py +0 -34
  383. nucliadb/train/tests/test_get_ontology_count.py +0 -63
  384. nucliadb/train/tests/test_image_classification.py +0 -221
  385. nucliadb/train/tests/test_list_fields.py +0 -39
  386. nucliadb/train/tests/test_list_paragraphs.py +0 -73
  387. nucliadb/train/tests/test_list_resources.py +0 -39
  388. nucliadb/train/tests/test_list_sentences.py +0 -71
  389. nucliadb/train/tests/test_paragraph_classification.py +0 -123
  390. nucliadb/train/tests/test_paragraph_streaming.py +0 -118
  391. nucliadb/train/tests/test_question_answer_streaming.py +0 -239
  392. nucliadb/train/tests/test_sentence_classification.py +0 -143
  393. nucliadb/train/tests/test_token_classification.py +0 -136
  394. nucliadb/train/tests/utils.py +0 -101
  395. nucliadb/writer/layouts/__init__.py +0 -51
  396. nucliadb/writer/layouts/v1.py +0 -59
  397. nucliadb/writer/tests/__init__.py +0 -19
  398. nucliadb/writer/tests/conftest.py +0 -31
  399. nucliadb/writer/tests/fixtures.py +0 -191
  400. nucliadb/writer/tests/test_fields.py +0 -475
  401. nucliadb/writer/tests/test_files.py +0 -740
  402. nucliadb/writer/tests/test_knowledgebox.py +0 -49
  403. nucliadb/writer/tests/test_reprocess_file_field.py +0 -133
  404. nucliadb/writer/tests/test_resources.py +0 -476
  405. nucliadb/writer/tests/test_service.py +0 -137
  406. nucliadb/writer/tests/test_tus.py +0 -203
  407. nucliadb/writer/tests/utils.py +0 -35
  408. nucliadb/writer/tus/pg.py +0 -125
  409. nucliadb-4.0.0.post542.dist-info/METADATA +0 -135
  410. nucliadb-4.0.0.post542.dist-info/RECORD +0 -462
  411. {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
  412. /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
  413. /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
  414. /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
  415. /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
  416. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/entry_points.txt +0 -0
  417. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/top_level.txt +0 -0
  418. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/zip-safe +0 -0
@@ -1,466 +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 dataclasses
21
- import logging
22
- import os
23
- import time
24
- from typing import Union
25
-
26
- import backoff
27
- import docker # type: ignore
28
- import pytest
29
- from grpc import insecure_channel
30
- from grpc_health.v1 import health_pb2_grpc
31
- from grpc_health.v1.health_pb2 import HealthCheckRequest
32
- from nucliadb_protos.nodewriter_pb2 import EmptyQuery, ShardId
33
- from nucliadb_protos.nodewriter_pb2_grpc import NodeWriterStub
34
- from pytest_docker_fixtures import images # type: ignore
35
- from pytest_docker_fixtures.containers._base import BaseImage # type: ignore
36
- from pytest_lazy_fixtures import lazy_fixture
37
-
38
- from nucliadb.common.cluster.settings import settings as cluster_settings
39
- from nucliadb_utils.tests.conftest import get_testing_storage_backend
40
-
41
- logger = logging.getLogger(__name__)
42
-
43
- images.settings["nucliadb_node_reader"] = {
44
- "image": "europe-west4-docker.pkg.dev/nuclia-internal/nuclia/node",
45
- "version": "latest",
46
- "env": {
47
- "FILE_BACKEND": "unset",
48
- "HOST_KEY_PATH": "/data/node.key",
49
- "DATA_PATH": "/data",
50
- "READER_LISTEN_ADDRESS": "0.0.0.0:4445",
51
- "NUCLIADB_DISABLE_ANALYTICS": "True",
52
- "RUST_BACKTRACE": "full",
53
- "RUST_LOG": "nucliadb_*=DEBUG",
54
- },
55
- "options": {
56
- "command": [
57
- "/usr/local/bin/node_reader",
58
- ],
59
- "ports": {"4445": ("0.0.0.0", 0)},
60
- "publish_all_ports": False,
61
- "mem_limit": "3g", # default is 1g, need to override
62
- "platform": "linux/amd64",
63
- },
64
- }
65
-
66
- images.settings["nucliadb_node_writer"] = {
67
- "image": "europe-west4-docker.pkg.dev/nuclia-internal/nuclia/node",
68
- "version": "latest",
69
- "env": {
70
- "FILE_BACKEND": "unset",
71
- "HOST_KEY_PATH": "/data/node.key",
72
- "DATA_PATH": "/data",
73
- "WRITER_LISTEN_ADDRESS": "0.0.0.0:4446",
74
- "NUCLIADB_DISABLE_ANALYTICS": "True",
75
- "RUST_BACKTRACE": "full",
76
- "RUST_LOG": "nucliadb_*=DEBUG",
77
- },
78
- "options": {
79
- "command": [
80
- "/usr/local/bin/node_writer",
81
- ],
82
- "ports": {"4446": ("0.0.0.0", 0)},
83
- "publish_all_ports": False,
84
- "mem_limit": "3g", # default is 1g, need to override
85
- "platform": "linux/amd64",
86
- },
87
- }
88
-
89
- images.settings["nucliadb_node_sidecar"] = {
90
- "image": "europe-west4-docker.pkg.dev/nuclia-internal/nuclia/node_sidecar",
91
- "version": "latest",
92
- "env": {
93
- "INDEX_JETSTREAM_SERVERS": "[]",
94
- "CACHE_PUBSUB_NATS_URL": "",
95
- "HOST_KEY_PATH": "/data/node.key",
96
- "DATA_PATH": "/data",
97
- "SIDECAR_LISTEN_ADDRESS": "0.0.0.0:4447",
98
- "READER_LISTEN_ADDRESS": "0.0.0.0:4445",
99
- "WRITER_LISTEN_ADDRESS": "0.0.0.0:4446",
100
- "PYTHONUNBUFFERED": "1",
101
- "LOG_LEVEL": "DEBUG",
102
- },
103
- "options": {
104
- "command": [
105
- "node_sidecar",
106
- ],
107
- "ports": {"4447": ("0.0.0.0", 0)},
108
- "publish_all_ports": False,
109
- "platform": "linux/amd64",
110
- },
111
- }
112
-
113
-
114
- def get_container_host(container_obj):
115
- return container_obj.attrs["NetworkSettings"]["IPAddress"]
116
-
117
-
118
- class nucliadbNodeReader(BaseImage):
119
- name = "nucliadb_node_reader"
120
- port = 4445
121
-
122
- def run(self, volume):
123
- self._volume = volume
124
- self._mount = "/data"
125
- return super(nucliadbNodeReader, self).run()
126
-
127
- def get_image_options(self):
128
- options = super(nucliadbNodeReader, self).get_image_options()
129
- options["volumes"] = {self._volume.name: {"bind": "/data"}}
130
- return options
131
-
132
- def check(self):
133
- channel = insecure_channel(f"{self.host}:{self.get_port()}")
134
- stub = health_pb2_grpc.HealthStub(channel)
135
- pb = HealthCheckRequest(service="nodereader.NodeReader")
136
- try:
137
- result = stub.Check(pb)
138
- return result.status == 1
139
- except: # noqa
140
- return False
141
-
142
-
143
- class nucliadbNodeWriter(BaseImage):
144
- name = "nucliadb_node_writer"
145
- port = 4446
146
-
147
- def run(self, volume):
148
- self._volume = volume
149
- self._mount = "/data"
150
- return super(nucliadbNodeWriter, self).run()
151
-
152
- def get_image_options(self):
153
- options = super(nucliadbNodeWriter, self).get_image_options()
154
- options["volumes"] = {self._volume.name: {"bind": "/data"}}
155
- return options
156
-
157
- def check(self):
158
- channel = insecure_channel(f"{self.host}:{self.get_port()}")
159
- stub = health_pb2_grpc.HealthStub(channel)
160
- pb = HealthCheckRequest(service="nodewriter.NodeWriter")
161
- try:
162
- result = stub.Check(pb)
163
- return result.status == 1
164
- except: # noqa
165
- return False
166
-
167
-
168
- class nucliadbNodeSidecar(BaseImage):
169
- name = "nucliadb_node_sidecar"
170
- port = 4447
171
-
172
- def run(self, volume):
173
- self._volume = volume
174
- self._mount = "/data"
175
- return super(nucliadbNodeSidecar, self).run()
176
-
177
- def get_image_options(self):
178
- options = super(nucliadbNodeSidecar, self).get_image_options()
179
- options["volumes"] = {self._volume.name: {"bind": "/data"}}
180
- return options
181
-
182
- def check(self):
183
- channel = insecure_channel(f"{self.host}:{self.get_port()}")
184
- stub = health_pb2_grpc.HealthStub(channel)
185
- pb = HealthCheckRequest(service="")
186
- try:
187
- result = stub.Check(pb)
188
- return result.status == 1
189
- except: # noqa
190
- return False
191
-
192
-
193
- nucliadb_node_1_reader = nucliadbNodeReader()
194
- nucliadb_node_1_writer = nucliadbNodeWriter()
195
- nucliadb_node_1_sidecar = nucliadbNodeSidecar()
196
-
197
- nucliadb_node_2_reader = nucliadbNodeReader()
198
- nucliadb_node_2_writer = nucliadbNodeWriter()
199
- nucliadb_node_2_sidecar = nucliadbNodeSidecar()
200
-
201
-
202
- @dataclasses.dataclass
203
- class NodeS3Storage:
204
- server: str
205
-
206
- def envs(self):
207
- return {
208
- "FILE_BACKEND": "s3",
209
- "S3_CLIENT_ID": "",
210
- "S3_CLIENT_SECRET": "",
211
- "S3_BUCKET": "test",
212
- "S3_INDEXING_BUCKET": "indexing",
213
- "S3_DEADLETTER_BUCKET": "deadletter",
214
- "S3_ENDPOINT": self.server,
215
- }
216
-
217
-
218
- @dataclasses.dataclass
219
- class NodeGCSStorage:
220
- server: str
221
-
222
- def envs(self):
223
- return {
224
- "FILE_BACKEND": "gcs",
225
- "GCS_BUCKET": "test",
226
- "GCS_INDEXING_BUCKET": "indexing",
227
- "GCS_DEADLETTER_BUCKET": "deadletter",
228
- "GCS_ENDPOINT_URL": self.server,
229
- }
230
-
231
-
232
- NodeStorage = Union[NodeGCSStorage, NodeS3Storage]
233
-
234
-
235
- class _NodeRunner:
236
- def __init__(self, natsd, storage: NodeStorage):
237
- self.docker_client = docker.from_env(version=BaseImage.docker_version)
238
- self.natsd = natsd
239
- self.storage = storage
240
- self.data = {} # type: ignore
241
-
242
- def start(self):
243
- docker_platform_name = self.docker_client.api.version()["Platform"][
244
- "Name"
245
- ].upper()
246
- if "GITHUB_ACTION" not in os.environ and (
247
- "DESKTOP" in docker_platform_name
248
- # newer versions use community
249
- or "DOCKER ENGINE - COMMUNITY" == docker_platform_name
250
- ):
251
- # Valid when using Docker desktop
252
- docker_internal_host = "host.docker.internal"
253
- else:
254
- # Valid when using github actions
255
- docker_internal_host = "172.17.0.1"
256
-
257
- self.volume_node_1 = self.docker_client.volumes.create(driver="local")
258
- self.volume_node_2 = self.docker_client.volumes.create(driver="local")
259
-
260
- writer1_host, writer1_port = nucliadb_node_1_writer.run(self.volume_node_1)
261
- writer2_host, writer2_port = nucliadb_node_2_writer.run(self.volume_node_2)
262
-
263
- reader1_host, reader1_port = nucliadb_node_1_reader.run(self.volume_node_1)
264
- reader2_host, reader2_port = nucliadb_node_2_reader.run(self.volume_node_2)
265
-
266
- natsd_server = self.natsd.replace("localhost", docker_internal_host)
267
- images.settings["nucliadb_node_sidecar"]["env"].update(
268
- {
269
- "INDEX_JETSTREAM_SERVERS": f'["{natsd_server}"]',
270
- "CACHE_PUBSUB_NATS_URL": f'["{natsd_server}"]',
271
- "READER_LISTEN_ADDRESS": f"{docker_internal_host}:{reader1_port}",
272
- "WRITER_LISTEN_ADDRESS": f"{docker_internal_host}:{writer1_port}",
273
- }
274
- )
275
- self.storage.server = self.storage.server.replace(
276
- "localhost", docker_internal_host
277
- )
278
- images.settings["nucliadb_node_sidecar"]["env"].update(self.storage.envs())
279
-
280
- sidecar1_host, sidecar1_port = nucliadb_node_1_sidecar.run(self.volume_node_1)
281
-
282
- images.settings["nucliadb_node_sidecar"]["env"][
283
- "READER_LISTEN_ADDRESS"
284
- ] = f"{docker_internal_host}:{reader2_port}"
285
- images.settings["nucliadb_node_sidecar"]["env"][
286
- "WRITER_LISTEN_ADDRESS"
287
- ] = f"{docker_internal_host}:{writer2_port}"
288
-
289
- sidecar2_host, sidecar2_port = nucliadb_node_2_sidecar.run(self.volume_node_2)
290
-
291
- writer1_internal_host = get_container_host(nucliadb_node_1_writer.container_obj)
292
- writer2_internal_host = get_container_host(nucliadb_node_2_writer.container_obj)
293
-
294
- self.data.update(
295
- {
296
- "writer1_internal_host": writer1_internal_host,
297
- "writer2_internal_host": writer2_internal_host,
298
- "writer1": {
299
- "host": writer1_host,
300
- "port": writer1_port,
301
- },
302
- "writer2": {
303
- "host": writer2_host,
304
- "port": writer2_port,
305
- },
306
- "reader1": {
307
- "host": reader1_host,
308
- "port": reader1_port,
309
- },
310
- "reader2": {
311
- "host": reader2_host,
312
- "port": reader2_port,
313
- },
314
- "sidecar1": {
315
- "host": sidecar1_host,
316
- "port": sidecar1_port,
317
- },
318
- "sidecar2": {
319
- "host": sidecar2_host,
320
- "port": sidecar2_port,
321
- },
322
- }
323
- )
324
- return self.data
325
-
326
- def stop(self):
327
- container_ids = []
328
- for component in [
329
- nucliadb_node_1_reader,
330
- nucliadb_node_1_writer,
331
- nucliadb_node_1_sidecar,
332
- nucliadb_node_2_writer,
333
- nucliadb_node_2_reader,
334
- nucliadb_node_2_sidecar,
335
- ]:
336
- container_obj = getattr(component, "container_obj", None)
337
- if container_obj:
338
- container_ids.append(container_obj.id)
339
- component.stop()
340
-
341
- for container_id in container_ids:
342
- for _ in range(5):
343
- try:
344
- self.docker_client.containers.get(container_id) # type: ignore
345
- except docker.errors.NotFound:
346
- break
347
- time.sleep(2)
348
-
349
- self.volume_node_1.remove()
350
- self.volume_node_2.remove()
351
-
352
- def setup_env(self):
353
- # reset on every test run in case something touches it
354
- cluster_settings.writer_port_map = {
355
- self.data["writer1_internal_host"]: self.data["writer1"]["port"],
356
- self.data["writer2_internal_host"]: self.data["writer2"]["port"],
357
- }
358
- cluster_settings.reader_port_map = {
359
- self.data["writer1_internal_host"]: self.data["reader1"]["port"],
360
- self.data["writer2_internal_host"]: self.data["reader2"]["port"],
361
- }
362
-
363
- cluster_settings.node_writer_port = None # type: ignore
364
- cluster_settings.node_reader_port = None # type: ignore
365
-
366
- cluster_settings.cluster_discovery_mode = "manual"
367
- cluster_settings.cluster_discovery_manual_addresses = [
368
- self.data["writer1_internal_host"],
369
- self.data["writer2_internal_host"],
370
- ]
371
-
372
-
373
- @pytest.fixture(scope="session")
374
- def gcs_node_storage(gcs):
375
- return NodeGCSStorage(server=gcs)
376
-
377
-
378
- @pytest.fixture(scope="session")
379
- def s3_node_storage(s3):
380
- return NodeS3Storage(server=s3)
381
-
382
-
383
- def lazy_load_storage_backend():
384
- backend = get_testing_storage_backend()
385
- if backend == "gcs":
386
- return [lazy_fixture.lf("gcs_node_storage")]
387
- elif backend == "s3":
388
- return [lazy_fixture.lf("s3_node_storage")]
389
- else:
390
- print(f"Unknown storage backend {backend}, using gcs")
391
- return [lazy_fixture.lf("gcs_node_storage")]
392
-
393
-
394
- @pytest.fixture(scope="session", params=lazy_load_storage_backend())
395
- def node_storage(request):
396
- return request.param
397
-
398
-
399
- @pytest.fixture(scope="session", autouse=False)
400
- def _node(natsd: str, node_storage):
401
- nr = _NodeRunner(natsd, node_storage)
402
- try:
403
- cluster_info = nr.start()
404
- except Exception:
405
- nr.stop()
406
- raise
407
- nr.setup_env()
408
- yield cluster_info
409
- nr.stop()
410
-
411
-
412
- @pytest.fixture(scope="function")
413
- def node(_node, request):
414
- # clean up all shard data before each test
415
- channel1 = insecure_channel(
416
- f"{_node['writer1']['host']}:{_node['writer1']['port']}"
417
- )
418
- channel2 = insecure_channel(
419
- f"{_node['writer2']['host']}:{_node['writer2']['port']}"
420
- )
421
- writer1 = NodeWriterStub(channel1)
422
- writer2 = NodeWriterStub(channel2)
423
-
424
- logger.debug("cleaning up shards data")
425
- try:
426
- cleanup_node(writer1)
427
- cleanup_node(writer2)
428
- except Exception:
429
- logger.error(
430
- "Error cleaning up shards data. Maybe the node fixture could not start properly?",
431
- exc_info=True,
432
- )
433
-
434
- client = docker.client.from_env()
435
- containers_by_port = {}
436
- for container in client.containers.list():
437
- name = container.name
438
- command = container.attrs["Config"]["Cmd"]
439
- ports = container.ports
440
- print(f"container {name} executing {command} is using ports: {ports}")
441
-
442
- for internal_port in container.ports:
443
- for host in container.ports[internal_port]:
444
- port = host["HostPort"]
445
- port_containers = containers_by_port.setdefault(port, [])
446
- if container not in port_containers:
447
- port_containers.append(container)
448
-
449
- for port, containers in containers_by_port.items():
450
- if len(containers) > 1:
451
- names = ", ".join([container.name for container in containers])
452
- print(f"ATENTION! Containers {names} share port {port}!")
453
- raise
454
- finally:
455
- channel1.close()
456
- channel2.close()
457
-
458
- yield _node
459
-
460
-
461
- @backoff.on_exception(
462
- backoff.expo, Exception, jitter=backoff.random_jitter, max_tries=5
463
- )
464
- def cleanup_node(writer: NodeWriterStub):
465
- for shard in writer.ListShards(EmptyQuery()).ids:
466
- writer.DeleteShard(ShardId(id=shard.id))
@@ -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,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,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,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,98 +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 import mock
21
- from unittest.mock import Mock
22
-
23
- import pytest
24
- from starlette.requests import Request
25
-
26
- from nucliadb.models.responses import HTTPClientError
27
- from nucliadb.search import predict
28
- from nucliadb.search.api.v1.resource.chat import resource_chat_endpoint
29
- from nucliadb_utils.exceptions import LimitsExceededError
30
-
31
- pytestmark = pytest.mark.asyncio
32
-
33
-
34
- class DummyTestRequest(Request):
35
- @property
36
- def auth(self):
37
- return Mock(scopes=["READER"])
38
-
39
- @property
40
- def user(self):
41
- return Mock(display_name="username")
42
-
43
-
44
- @pytest.fixture(scope="function")
45
- def create_chat_response_mock():
46
- with mock.patch(
47
- "nucliadb.search.api.v1.resource.chat.create_chat_response",
48
- ) as mocked:
49
- yield mocked
50
-
51
-
52
- @pytest.mark.parametrize(
53
- "predict_error,http_error_response",
54
- [
55
- (
56
- LimitsExceededError(402, "over the quota"),
57
- HTTPClientError(status_code=402, detail="over the quota"),
58
- ),
59
- (
60
- predict.RephraseError("foobar"),
61
- HTTPClientError(
62
- status_code=529,
63
- detail="Temporary error while rephrasing the query. Please try again later. Error: foobar",
64
- ),
65
- ),
66
- (
67
- predict.RephraseMissingContextError(),
68
- HTTPClientError(
69
- status_code=412,
70
- detail="Unable to rephrase the query with the provided context.",
71
- ),
72
- ),
73
- ],
74
- )
75
- async def test_resource_chat_endpoint_handles_errors(
76
- create_chat_response_mock, predict_error, http_error_response
77
- ):
78
- create_chat_response_mock.side_effect = predict_error
79
- request = DummyTestRequest(
80
- scope={
81
- "type": "http",
82
- "http_version": "1.1",
83
- "method": "GET",
84
- "headers": [],
85
- }
86
- )
87
- response = await resource_chat_endpoint(
88
- request=request,
89
- kbid="kbid",
90
- item=Mock(),
91
- x_ndb_client=None,
92
- x_nucliadb_user="",
93
- x_forwarded_for="",
94
- x_synchronous=True,
95
- resource_id="rid",
96
- )
97
- assert response.status_code == http_error_response.status_code
98
- assert response.body == http_error_response.body