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,203 +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 tempfile
21
- import uuid
22
-
23
- import asyncpg
24
- import pytest
25
-
26
- from nucliadb.writer.settings import settings
27
- from nucliadb.writer.tus import get_dm
28
- from nucliadb.writer.tus.exceptions import CloudFileNotFound
29
- from nucliadb.writer.tus.gcs import GCloudBlobStore, GCloudFileStorageManager
30
- from nucliadb.writer.tus.local import LocalBlobStore, LocalFileStorageManager
31
- from nucliadb.writer.tus.pg import PGBlobStore, PGFileStorageManager
32
- from nucliadb.writer.tus.s3 import S3BlobStore, S3FileStorageManager
33
- from nucliadb.writer.tus.storage import BlobStore, FileStorageManager
34
- from nucliadb_utils.storages.pg import PostgresStorage
35
- from nucliadb_utils.storages.storage import KB_RESOURCE_FIELD
36
-
37
-
38
- @pytest.fixture(scope="function")
39
- async def s3_storage_tus(s3):
40
- storage = S3BlobStore()
41
- await storage.initialize(
42
- client_id="",
43
- client_secret="",
44
- max_pool_connections=2,
45
- endpoint_url=s3,
46
- verify_ssl=False,
47
- ssl=False,
48
- region_name=None,
49
- bucket="test_{kbid}",
50
- bucket_tags={"testTag": "test"},
51
- )
52
- yield storage
53
- await storage.finalize()
54
-
55
-
56
- @pytest.fixture(scope="function")
57
- async def gcs_storage_tus(gcs):
58
- storage = GCloudBlobStore()
59
- await storage.initialize(
60
- json_credentials=None,
61
- bucket="test_{kbid}",
62
- location="location",
63
- project="project",
64
- bucket_labels={},
65
- object_base_url=gcs,
66
- )
67
- yield storage
68
- await storage.finalize()
69
-
70
-
71
- @pytest.fixture(scope="function")
72
- async def local_storage_tus():
73
- folder = tempfile.TemporaryDirectory()
74
- storage = LocalBlobStore(local_testing_files=folder.name)
75
- await storage.initialize()
76
- yield storage
77
- await storage.finalize()
78
- folder.cleanup()
79
-
80
-
81
- @pytest.fixture(scope="function")
82
- async def pg_storage_tus(pg):
83
- dsn = f"postgresql://postgres:postgres@{pg[0]}:{pg[1]}/postgres"
84
- conn = await asyncpg.connect(dsn)
85
- await conn.execute(
86
- """
87
- DROP table IF EXISTS kb_files;
88
- DROP table IF EXISTS kb_files_fileparts;
89
- """
90
- )
91
- await conn.close()
92
- fstorage = PostgresStorage(dsn) # set everything up
93
- await fstorage.initialize()
94
- await fstorage.finalize()
95
-
96
- storage = PGBlobStore(dsn)
97
- await storage.initialize()
98
- yield storage
99
- await storage.finalize()
100
-
101
-
102
- async def clean_dm():
103
- from nucliadb.writer.tus import REDIS_FILE_DATA_MANAGER_FACTORY
104
-
105
- if REDIS_FILE_DATA_MANAGER_FACTORY is not None:
106
- await REDIS_FILE_DATA_MANAGER_FACTORY.finalize()
107
- REDIS_FILE_DATA_MANAGER_FACTORY = None
108
-
109
-
110
- @pytest.fixture(scope="function")
111
- async def redis_dm(redis):
112
- prev = settings.dm_enabled
113
-
114
- settings.dm_enabled = True
115
- settings.dm_redis_host = redis[0]
116
- settings.dm_redis_port = redis[1]
117
-
118
- dm = get_dm()
119
-
120
- yield dm
121
-
122
- await clean_dm()
123
-
124
- settings.dm_enabled = prev
125
-
126
-
127
- @pytest.mark.asyncio
128
- async def test_pg_driver(redis_dm, pg_storage_tus: PGBlobStore):
129
- await storage_test(pg_storage_tus, PGFileStorageManager(pg_storage_tus))
130
-
131
-
132
- @pytest.mark.asyncio
133
- async def test_s3_driver(redis_dm, s3_storage_tus: S3BlobStore):
134
- await storage_test(s3_storage_tus, S3FileStorageManager(s3_storage_tus))
135
-
136
-
137
- @pytest.mark.asyncio
138
- async def test_gcs_driver(redis_dm, gcs_storage_tus: GCloudBlobStore):
139
- await storage_test(gcs_storage_tus, GCloudFileStorageManager(gcs_storage_tus))
140
-
141
-
142
- @pytest.mark.asyncio
143
- async def test_local_driver(local_storage_tus: LocalBlobStore):
144
- settings.dm_enabled = False
145
- await storage_test(local_storage_tus, LocalFileStorageManager(local_storage_tus))
146
- settings.dm_enabled = True
147
-
148
-
149
- async def storage_test(storage: BlobStore, file_storage_manager: FileStorageManager):
150
- example = b"mytestinfo"
151
- field = "myfield"
152
- rid = "myrid"
153
- kbid = "mykb_tus_test"
154
-
155
- metadata: dict[str, str] = {}
156
- bucket_name = storage.get_bucket_name(kbid)
157
- assert bucket_name in [
158
- "test_mykb_tus_test",
159
- "test-mykb-tus-test",
160
- "ndb_mykb_tus_test",
161
- "mykb_tus_test",
162
- ]
163
-
164
- if not isinstance(storage, PGBlobStore):
165
- # this is silly, but we don't need this for pg
166
- assert await storage.check_exists(bucket_name) is False
167
-
168
- exists = await storage.create_bucket(bucket_name)
169
- assert exists is False
170
-
171
- upload_id = uuid.uuid4().hex
172
- dm = get_dm()
173
- await dm.load(upload_id)
174
- await dm.start({})
175
- await dm.update(
176
- upload_file_id=f"{upload_id}",
177
- rid=rid,
178
- field=field,
179
- metadata=metadata,
180
- deferred_length=True,
181
- offset=0,
182
- item=None,
183
- )
184
-
185
- path = KB_RESOURCE_FIELD.format(kbid=kbid, uuid=rid, field=field)
186
- await file_storage_manager.start(dm, path=path, kbid=kbid)
187
-
188
- async def generate():
189
- yield example
190
-
191
- size = await file_storage_manager.append(dm, generate(), 0)
192
- await dm.update(offset=size)
193
- assert size == len(example)
194
- await file_storage_manager.finish(dm)
195
-
196
- async for data in file_storage_manager.read_range(path, kbid, 1, size):
197
- assert data == example[1:]
198
-
199
- await file_storage_manager.delete_upload(path, kbid)
200
-
201
- with pytest.raises(CloudFileNotFound):
202
- async for data in file_storage_manager.read_range(path, kbid, 1, size):
203
- assert data == example[1:]
@@ -1,35 +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 hashlib
21
- from base64 import b64encode
22
- from os.path import dirname
23
-
24
-
25
- def load_file_as_FileB64_payload(f: str, content_type: str) -> dict:
26
- file_location = f"{dirname(__file__)}/{f}"
27
- filename = f.split("/")[-1]
28
- data = b64encode(open(file_location, "rb").read())
29
-
30
- return {
31
- "filename": filename,
32
- "content_type": content_type,
33
- "payload": data.decode("utf-8"),
34
- "md5": hashlib.md5(data).hexdigest(),
35
- }
nucliadb/writer/tus/pg.py DELETED
@@ -1,125 +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 __future__ import annotations
21
-
22
- from typing import AsyncIterator
23
-
24
- import asyncpg
25
- from nucliadb_protos.resources_pb2 import CloudFile
26
-
27
- from nucliadb.writer.tus.dm import FileDataManager
28
- from nucliadb.writer.tus.exceptions import CloudFileNotFound
29
- from nucliadb.writer.tus.storage import BlobStore, FileStorageManager
30
- from nucliadb_utils.storages import CHUNK_SIZE
31
- from nucliadb_utils.storages.pg import PostgresFileDataLayer
32
-
33
-
34
- class PGFileStorageManager(FileStorageManager):
35
- _handler = None
36
- storage: PGBlobStore
37
- chunk_size = min_upload_size = CHUNK_SIZE
38
-
39
- async def start(self, dm: FileDataManager, path: str, kbid: str):
40
- bucket = self.storage.get_bucket_name(kbid)
41
-
42
- async with self.storage.pool.acquire() as conn:
43
- async with conn.transaction():
44
- dl = PostgresFileDataLayer(conn)
45
- if path is not None:
46
- await dl.delete_file(kbid, path)
47
-
48
- await dl.create_file(
49
- kb_id=bucket,
50
- file_id=path,
51
- filename=dm.filename,
52
- size=dm.size,
53
- content_type=dm.content_type,
54
- )
55
-
56
- await dm.update(upload_file_id=path, path=path, bucket=bucket)
57
-
58
- async def iter_data(self, uri, kbid: str, headers=None):
59
- bucket = self.storage.get_bucket_name(kbid)
60
-
61
- async with self.storage.pool.acquire() as conn:
62
- dl = PostgresFileDataLayer(conn)
63
- async for chunk in dl.iterate_chunks(bucket, uri):
64
- yield chunk["data"]
65
-
66
- async def read_range(
67
- self, uri: str, kbid: str, start: int, end: int
68
- ) -> AsyncIterator[bytes]:
69
- """
70
- Iterate through ranges of data
71
- """
72
- bucket = self.storage.get_bucket_name(kbid)
73
-
74
- async with self.storage.pool.acquire() as conn:
75
- dl = PostgresFileDataLayer(conn)
76
- file_info = await dl.get_file_info(kbid, uri)
77
- if file_info is None:
78
- raise CloudFileNotFound()
79
- async for data in dl.iterate_range(
80
- kb_id=bucket, file_id=uri, start=start, end=end
81
- ):
82
- yield data
83
-
84
- async def append(self, dm: FileDataManager, iterable, offset) -> int:
85
- bucket = dm.get("bucket")
86
- path = dm.get("path")
87
- count = 0
88
- async with self.storage.pool.acquire() as conn:
89
- dl = PostgresFileDataLayer(conn)
90
- async for chunk in iterable:
91
- await dl.append_chunk(kb_id=bucket, file_id=path, data=chunk)
92
- size = len(chunk)
93
- count += size
94
- offset += len(chunk)
95
- return count
96
-
97
- async def finish(self, dm: FileDataManager):
98
- path = dm.get("path")
99
- await dm.finish()
100
- return path
101
-
102
- async def delete_upload(self, uri: str, kbid: str):
103
- async with self.storage.pool.acquire() as conn:
104
- async with conn.transaction():
105
- dl = PostgresFileDataLayer(conn)
106
- await dl.delete_file(kbid, uri)
107
-
108
-
109
- class PGBlobStore(BlobStore):
110
- def __init__(self, dsn: str):
111
- self.dsn = dsn
112
- self.source = CloudFile.POSTGRES
113
-
114
- async def initialize(self):
115
- self.pool = await asyncpg.create_pool(self.dsn)
116
-
117
- async def finalize(self):
118
- await self.pool.close()
119
- self.initialized = False
120
-
121
- async def check_exists(self, bucket_name: str) -> bool:
122
- return True
123
-
124
- def get_bucket_name(self, kbid: str) -> str:
125
- return kbid
@@ -1,134 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: nucliadb
3
- Version: 2.46.1.post382
4
- Home-page: https://docs.nuclia.dev/docs/guides/nucliadb/intro
5
- Author: NucliaDB Community
6
- Author-email: nucliadb@nuclia.com
7
- License: BSD
8
- Project-URL: Nuclia, https://nuclia.com
9
- Project-URL: Github, https://github.com/nuclia/nucliadb
10
- Project-URL: Discord, https://discord.gg/8EvQwmsbzf
11
- Project-URL: API Reference, https://docs.nuclia.dev/docs/api
12
- Keywords: search,semantic,AI
13
- Classifier: Development Status :: 4 - Beta
14
- Classifier: Intended Audience :: Developers
15
- Classifier: Intended Audience :: Information Technology
16
- Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
17
- Classifier: Programming Language :: Python
18
- Classifier: Programming Language :: Python :: 3.9
19
- Classifier: Programming Language :: Python :: 3.10
20
- Classifier: Programming Language :: Python :: 3.11
21
- Classifier: Programming Language :: Python :: 3 :: Only
22
- Requires-Python: >=3.9, <4
23
- Description-Content-Type: text/markdown
24
- Requires-Dist: nucliadb-telemetry[all] >=2.46.1.post382
25
- Requires-Dist: nucliadb-utils[cache,fastapi,storages] >=2.46.1.post382
26
- Requires-Dist: nucliadb-protos >=2.46.1.post382
27
- Requires-Dist: nucliadb-models >=2.46.1.post382
28
- Requires-Dist: nucliadb-admin-assets >=1.0.0.post1224
29
- Requires-Dist: nucliadb-node-binding >=2.26.0
30
- Requires-Dist: uvicorn <0.19.0
31
- Requires-Dist: pydantic-argparse
32
- Requires-Dist: aiohttp >=3.9.3
33
- Requires-Dist: lru-dict >=1.1.7
34
- Requires-Dist: backoff
35
- Requires-Dist: aiofiles >=0.8.0
36
- Requires-Dist: psutil >=5.9.7
37
- Requires-Dist: types-psutil >=5.9.5.17
38
- Requires-Dist: types-aiofiles >=0.8.3
39
- Requires-Dist: protobuf >=4.22.3
40
- Requires-Dist: types-protobuf <4.0,>=3.19.20
41
- Requires-Dist: grpcio >=1.44.0
42
- Requires-Dist: grpcio-health-checking >=1.44.0
43
- Requires-Dist: grpcio-channelz >=1.44.0
44
- Requires-Dist: grpcio-status >=1.44.0
45
- Requires-Dist: grpcio-tools >=1.44.0
46
- Requires-Dist: grpcio-testing >=1.44.0
47
- Requires-Dist: grpcio-reflection >=1.44.0
48
- Requires-Dist: orjson >=3.6.7
49
- Requires-Dist: types-setuptools
50
- Requires-Dist: pydantic <2.0,>=1.9.0
51
- Requires-Dist: aiobotocore >=2.9.0
52
- Requires-Dist: botocore >=1.34.0
53
- Requires-Dist: google-cloud-storage
54
- Requires-Dist: gcloud
55
- Requires-Dist: oauth2client
56
- Requires-Dist: jwcrypto >=1.5.6
57
- Requires-Dist: fastapi-versioning >=0.10.0
58
- Requires-Dist: fastapi >=0.95.2
59
- Requires-Dist: sentry-sdk >=1.5.12
60
- Requires-Dist: pyjwt >=2.4.0
61
- Requires-Dist: mmh3 >=3.0.0
62
- Requires-Dist: httpx >=0.23.0
63
- Requires-Dist: types-pkg-resources >=0.1.3
64
- Requires-Dist: grpc-stubs >=1.44.0
65
- Requires-Dist: aiodns >=3.0.0
66
- Requires-Dist: types-orjson
67
- Requires-Dist: asyncpg >=0.27.0
68
- Requires-Dist: tikv-client >=0.0.3
69
- Requires-Dist: multidict >=6.0.4
70
- Requires-Dist: deprecated >=1.2.12
71
- Requires-Dist: asgiref >=3.3.2
72
- Requires-Dist: jmespath >=1.0.0
73
- Requires-Dist: idna >=3.3
74
- Requires-Dist: sniffio >=1.2.0
75
- Requires-Dist: async-lru >=2.0.4
76
- Requires-Dist: async-timeout >=4.0.3
77
- Requires-Dist: cachetools >=5.3.2
78
- Requires-Dist: types-cachetools >=5.3.0.5
79
- Requires-Dist: kubernetes-asyncio
80
- Provides-Extra: redis
81
- Requires-Dist: redis >=4.3.4 ; extra == 'redis'
82
-
83
- # nucliadb
84
-
85
- This module contains most of the Python components for NucliaDB:
86
-
87
- - ingest
88
- - reader
89
- - writer
90
- - search
91
- - train
92
-
93
- # NucliaDB Migrations
94
-
95
- This module is used to manage NucliaDB Migrations.
96
-
97
- All migrations will be provided in the `migrations` folder and have a filename
98
- that follows the structure: `[sequence]_[migration name].py`.
99
- Where `sequence` is the order the migration should be run in with zero padding.
100
- Example: `0001_migrate_data.py`.
101
-
102
- Each migration should have the following:
103
-
104
- ```python
105
- from nucliadb.migrator.context import ExecutionContext
106
-
107
-
108
- async def migrate(context: ExecutionContext) -> None:
109
- """
110
- Non-kb type of migration. Migrate global data.
111
- """
112
-
113
-
114
- async def migrate_kb(context: ExecutionContext, kbid: str) -> None:
115
- """
116
- Migrate kb.
117
-
118
- Must have both types of migrations.
119
- """
120
- ```
121
-
122
-
123
- ## How migrations are managed
124
-
125
- - All migrations utilize a distributed lock to prevent simulateously running jobs
126
- - Global migration state:
127
- - current version
128
- - target version
129
- - KBs to migrate
130
- - KB Migration State:
131
- - current version
132
-
133
- - Migrations are currently run with a deployment and will be continuously retried on failure.
134
- - Running migrations in a deployment is to make sure a migration does not prevent code deployment.