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.
- migrations/0003_allfields_key.py +1 -35
- migrations/0009_upgrade_relations_and_texts_to_v2.py +4 -2
- migrations/0010_fix_corrupt_indexes.py +10 -10
- migrations/0011_materialize_labelset_ids.py +1 -16
- migrations/0012_rollover_shards.py +5 -10
- migrations/0014_rollover_shards.py +4 -5
- migrations/0015_targeted_rollover.py +5 -10
- migrations/0016_upgrade_to_paragraphs_v2.py +25 -28
- migrations/0017_multiple_writable_shards.py +2 -4
- migrations/0018_purge_orphan_kbslugs.py +5 -7
- migrations/0019_upgrade_to_paragraphs_v3.py +25 -28
- migrations/0020_drain_nodes_from_cluster.py +3 -3
- nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +16 -19
- nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
- migrations/0023_backfill_pg_catalog.py +80 -0
- migrations/0025_assign_models_to_kbs_v2.py +113 -0
- migrations/0026_fix_high_cardinality_content_types.py +61 -0
- migrations/0027_rollover_texts3.py +73 -0
- nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
- migrations/pg/0002_catalog.py +42 -0
- nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
- nucliadb/common/cluster/base.py +30 -16
- nucliadb/common/cluster/discovery/base.py +6 -14
- nucliadb/common/cluster/discovery/k8s.py +9 -19
- nucliadb/common/cluster/discovery/manual.py +1 -3
- nucliadb/common/cluster/discovery/utils.py +1 -3
- nucliadb/common/cluster/grpc_node_dummy.py +3 -11
- nucliadb/common/cluster/index_node.py +10 -19
- nucliadb/common/cluster/manager.py +174 -59
- nucliadb/common/cluster/rebalance.py +27 -29
- nucliadb/common/cluster/rollover.py +353 -194
- nucliadb/common/cluster/settings.py +6 -0
- nucliadb/common/cluster/standalone/grpc_node_binding.py +13 -64
- nucliadb/common/cluster/standalone/index_node.py +4 -11
- nucliadb/common/cluster/standalone/service.py +2 -6
- nucliadb/common/cluster/standalone/utils.py +2 -6
- nucliadb/common/cluster/utils.py +29 -22
- nucliadb/common/constants.py +20 -0
- nucliadb/common/context/__init__.py +3 -0
- nucliadb/common/context/fastapi.py +8 -5
- nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
- nucliadb/common/datamanagers/__init__.py +7 -1
- nucliadb/common/datamanagers/atomic.py +22 -4
- nucliadb/common/datamanagers/cluster.py +5 -5
- nucliadb/common/datamanagers/entities.py +6 -16
- nucliadb/common/datamanagers/fields.py +84 -0
- nucliadb/common/datamanagers/kb.py +83 -37
- nucliadb/common/datamanagers/labels.py +26 -56
- nucliadb/common/datamanagers/processing.py +2 -6
- nucliadb/common/datamanagers/resources.py +41 -103
- nucliadb/common/datamanagers/rollover.py +76 -15
- nucliadb/common/datamanagers/synonyms.py +1 -1
- nucliadb/common/datamanagers/utils.py +15 -6
- nucliadb/common/datamanagers/vectorsets.py +110 -0
- nucliadb/common/external_index_providers/base.py +257 -0
- nucliadb/{ingest/tests/unit/orm/test_orm_utils.py → common/external_index_providers/exceptions.py} +9 -8
- nucliadb/common/external_index_providers/manager.py +101 -0
- nucliadb/common/external_index_providers/pinecone.py +933 -0
- nucliadb/common/external_index_providers/settings.py +52 -0
- nucliadb/common/http_clients/auth.py +3 -6
- nucliadb/common/http_clients/processing.py +6 -11
- nucliadb/common/http_clients/utils.py +1 -3
- nucliadb/common/ids.py +240 -0
- nucliadb/common/locking.py +29 -7
- nucliadb/common/maindb/driver.py +11 -35
- nucliadb/common/maindb/exceptions.py +3 -0
- nucliadb/common/maindb/local.py +22 -9
- nucliadb/common/maindb/pg.py +206 -111
- nucliadb/common/maindb/utils.py +11 -42
- nucliadb/common/models_utils/from_proto.py +479 -0
- nucliadb/common/models_utils/to_proto.py +60 -0
- nucliadb/common/nidx.py +260 -0
- nucliadb/export_import/datamanager.py +25 -19
- nucliadb/export_import/exporter.py +5 -11
- nucliadb/export_import/importer.py +5 -7
- nucliadb/export_import/models.py +3 -3
- nucliadb/export_import/tasks.py +4 -4
- nucliadb/export_import/utils.py +25 -37
- nucliadb/health.py +1 -3
- nucliadb/ingest/app.py +15 -11
- nucliadb/ingest/consumer/auditing.py +21 -19
- nucliadb/ingest/consumer/consumer.py +82 -47
- nucliadb/ingest/consumer/materializer.py +5 -12
- nucliadb/ingest/consumer/pull.py +12 -27
- nucliadb/ingest/consumer/service.py +19 -17
- nucliadb/ingest/consumer/shard_creator.py +2 -4
- nucliadb/ingest/consumer/utils.py +1 -3
- nucliadb/ingest/fields/base.py +137 -105
- nucliadb/ingest/fields/conversation.py +18 -5
- nucliadb/ingest/fields/exceptions.py +1 -4
- nucliadb/ingest/fields/file.py +7 -16
- nucliadb/ingest/fields/link.py +5 -10
- nucliadb/ingest/fields/text.py +9 -4
- nucliadb/ingest/orm/brain.py +200 -213
- nucliadb/ingest/orm/broker_message.py +181 -0
- nucliadb/ingest/orm/entities.py +36 -51
- nucliadb/ingest/orm/exceptions.py +12 -0
- nucliadb/ingest/orm/knowledgebox.py +322 -197
- nucliadb/ingest/orm/processor/__init__.py +2 -700
- nucliadb/ingest/orm/processor/auditing.py +4 -23
- nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
- nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
- nucliadb/ingest/orm/processor/processor.py +752 -0
- nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
- nucliadb/ingest/orm/resource.py +249 -403
- nucliadb/ingest/orm/utils.py +4 -4
- nucliadb/ingest/partitions.py +3 -9
- nucliadb/ingest/processing.py +70 -73
- nucliadb/ingest/py.typed +0 -0
- nucliadb/ingest/serialize.py +37 -167
- nucliadb/ingest/service/__init__.py +1 -3
- nucliadb/ingest/service/writer.py +185 -412
- nucliadb/ingest/settings.py +10 -20
- nucliadb/ingest/utils.py +3 -6
- nucliadb/learning_proxy.py +242 -55
- nucliadb/metrics_exporter.py +30 -19
- nucliadb/middleware/__init__.py +1 -3
- nucliadb/migrator/command.py +1 -3
- nucliadb/migrator/datamanager.py +13 -13
- nucliadb/migrator/migrator.py +47 -30
- nucliadb/migrator/utils.py +18 -10
- nucliadb/purge/__init__.py +139 -33
- nucliadb/purge/orphan_shards.py +7 -13
- nucliadb/reader/__init__.py +1 -3
- nucliadb/reader/api/models.py +1 -12
- nucliadb/reader/api/v1/__init__.py +0 -1
- nucliadb/reader/api/v1/download.py +21 -88
- nucliadb/reader/api/v1/export_import.py +1 -1
- nucliadb/reader/api/v1/knowledgebox.py +10 -10
- nucliadb/reader/api/v1/learning_config.py +2 -6
- nucliadb/reader/api/v1/resource.py +62 -88
- nucliadb/reader/api/v1/services.py +64 -83
- nucliadb/reader/app.py +12 -29
- nucliadb/reader/lifecycle.py +18 -4
- nucliadb/reader/py.typed +0 -0
- nucliadb/reader/reader/notifications.py +10 -28
- nucliadb/search/__init__.py +1 -3
- nucliadb/search/api/v1/__init__.py +1 -2
- nucliadb/search/api/v1/ask.py +17 -10
- nucliadb/search/api/v1/catalog.py +184 -0
- nucliadb/search/api/v1/feedback.py +16 -24
- nucliadb/search/api/v1/find.py +36 -36
- nucliadb/search/api/v1/knowledgebox.py +89 -60
- nucliadb/search/api/v1/resource/ask.py +2 -8
- nucliadb/search/api/v1/resource/search.py +49 -70
- nucliadb/search/api/v1/search.py +44 -210
- nucliadb/search/api/v1/suggest.py +39 -54
- nucliadb/search/app.py +12 -32
- nucliadb/search/lifecycle.py +10 -3
- nucliadb/search/predict.py +136 -187
- nucliadb/search/py.typed +0 -0
- nucliadb/search/requesters/utils.py +25 -58
- nucliadb/search/search/cache.py +149 -20
- nucliadb/search/search/chat/ask.py +571 -123
- nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -14
- nucliadb/search/search/chat/images.py +41 -17
- nucliadb/search/search/chat/prompt.py +817 -266
- nucliadb/search/search/chat/query.py +213 -309
- nucliadb/{tests/migrations/__init__.py → search/search/cut.py} +8 -8
- nucliadb/search/search/fetch.py +43 -36
- nucliadb/search/search/filters.py +9 -15
- nucliadb/search/search/find.py +214 -53
- nucliadb/search/search/find_merge.py +408 -391
- nucliadb/search/search/hydrator.py +191 -0
- nucliadb/search/search/merge.py +187 -223
- nucliadb/search/search/metrics.py +73 -2
- nucliadb/search/search/paragraphs.py +64 -106
- nucliadb/search/search/pgcatalog.py +233 -0
- nucliadb/search/search/predict_proxy.py +1 -1
- nucliadb/search/search/query.py +305 -150
- nucliadb/search/search/query_parser/exceptions.py +22 -0
- nucliadb/search/search/query_parser/models.py +101 -0
- nucliadb/search/search/query_parser/parser.py +183 -0
- nucliadb/search/search/rank_fusion.py +204 -0
- nucliadb/search/search/rerankers.py +270 -0
- nucliadb/search/search/shards.py +3 -32
- nucliadb/search/search/summarize.py +7 -18
- nucliadb/search/search/utils.py +27 -4
- nucliadb/search/settings.py +15 -1
- nucliadb/standalone/api_router.py +4 -10
- nucliadb/standalone/app.py +8 -14
- nucliadb/standalone/auth.py +7 -21
- nucliadb/standalone/config.py +7 -10
- nucliadb/standalone/lifecycle.py +26 -25
- nucliadb/standalone/migrations.py +1 -3
- nucliadb/standalone/purge.py +1 -1
- nucliadb/standalone/py.typed +0 -0
- nucliadb/standalone/run.py +3 -6
- nucliadb/standalone/settings.py +9 -16
- nucliadb/standalone/versions.py +15 -5
- nucliadb/tasks/consumer.py +8 -12
- nucliadb/tasks/producer.py +7 -6
- nucliadb/tests/config.py +53 -0
- nucliadb/train/__init__.py +1 -3
- nucliadb/train/api/utils.py +1 -2
- nucliadb/train/api/v1/shards.py +1 -1
- nucliadb/train/api/v1/trainset.py +2 -4
- nucliadb/train/app.py +10 -31
- nucliadb/train/generator.py +10 -19
- nucliadb/train/generators/field_classifier.py +7 -19
- nucliadb/train/generators/field_streaming.py +156 -0
- nucliadb/train/generators/image_classifier.py +12 -18
- nucliadb/train/generators/paragraph_classifier.py +5 -9
- nucliadb/train/generators/paragraph_streaming.py +6 -9
- nucliadb/train/generators/question_answer_streaming.py +19 -20
- nucliadb/train/generators/sentence_classifier.py +9 -15
- nucliadb/train/generators/token_classifier.py +48 -39
- nucliadb/train/generators/utils.py +14 -18
- nucliadb/train/lifecycle.py +7 -3
- nucliadb/train/nodes.py +23 -32
- nucliadb/train/py.typed +0 -0
- nucliadb/train/servicer.py +13 -21
- nucliadb/train/settings.py +2 -6
- nucliadb/train/types.py +13 -10
- nucliadb/train/upload.py +3 -6
- nucliadb/train/uploader.py +19 -23
- nucliadb/train/utils.py +1 -1
- nucliadb/writer/__init__.py +1 -3
- nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
- nucliadb/writer/api/v1/export_import.py +67 -14
- nucliadb/writer/api/v1/field.py +16 -269
- nucliadb/writer/api/v1/knowledgebox.py +218 -68
- nucliadb/writer/api/v1/resource.py +68 -88
- nucliadb/writer/api/v1/services.py +51 -70
- nucliadb/writer/api/v1/slug.py +61 -0
- nucliadb/writer/api/v1/transaction.py +67 -0
- nucliadb/writer/api/v1/upload.py +143 -117
- nucliadb/writer/app.py +6 -43
- nucliadb/writer/back_pressure.py +16 -38
- nucliadb/writer/exceptions.py +0 -4
- nucliadb/writer/lifecycle.py +21 -15
- nucliadb/writer/py.typed +0 -0
- nucliadb/writer/resource/audit.py +2 -1
- nucliadb/writer/resource/basic.py +48 -46
- nucliadb/writer/resource/field.py +37 -128
- nucliadb/writer/resource/origin.py +1 -2
- nucliadb/writer/settings.py +6 -2
- nucliadb/writer/tus/__init__.py +17 -15
- nucliadb/writer/tus/azure.py +111 -0
- nucliadb/writer/tus/dm.py +17 -5
- nucliadb/writer/tus/exceptions.py +1 -3
- nucliadb/writer/tus/gcs.py +49 -84
- nucliadb/writer/tus/local.py +21 -37
- nucliadb/writer/tus/s3.py +28 -68
- nucliadb/writer/tus/storage.py +5 -56
- nucliadb/writer/vectorsets.py +125 -0
- nucliadb-6.2.1.post2798.dist-info/METADATA +148 -0
- nucliadb-6.2.1.post2798.dist-info/RECORD +343 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/WHEEL +1 -1
- nucliadb/common/maindb/redis.py +0 -194
- nucliadb/common/maindb/tikv.py +0 -433
- nucliadb/ingest/fields/layout.py +0 -58
- nucliadb/ingest/tests/conftest.py +0 -30
- nucliadb/ingest/tests/fixtures.py +0 -764
- nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -78
- nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -126
- nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
- nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
- nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
- nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -684
- nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
- nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
- nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -139
- nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
- nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
- nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -140
- nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
- nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
- nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
- nucliadb/ingest/tests/unit/orm/test_brain_vectors.py +0 -74
- nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
- nucliadb/ingest/tests/unit/orm/test_resource.py +0 -331
- nucliadb/ingest/tests/unit/test_cache.py +0 -31
- nucliadb/ingest/tests/unit/test_partitions.py +0 -40
- nucliadb/ingest/tests/unit/test_processing.py +0 -171
- nucliadb/middleware/transaction.py +0 -117
- nucliadb/reader/api/v1/learning_collector.py +0 -63
- nucliadb/reader/tests/__init__.py +0 -19
- nucliadb/reader/tests/conftest.py +0 -31
- nucliadb/reader/tests/fixtures.py +0 -136
- nucliadb/reader/tests/test_list_resources.py +0 -75
- nucliadb/reader/tests/test_reader_file_download.py +0 -273
- nucliadb/reader/tests/test_reader_resource.py +0 -353
- nucliadb/reader/tests/test_reader_resource_field.py +0 -219
- nucliadb/search/api/v1/chat.py +0 -263
- nucliadb/search/api/v1/resource/chat.py +0 -174
- nucliadb/search/tests/__init__.py +0 -19
- nucliadb/search/tests/conftest.py +0 -33
- nucliadb/search/tests/fixtures.py +0 -199
- nucliadb/search/tests/node.py +0 -466
- nucliadb/search/tests/unit/__init__.py +0 -18
- nucliadb/search/tests/unit/api/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_ask.py +0 -120
- nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
- nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -99
- nucliadb/search/tests/unit/search/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -211
- nucliadb/search/tests/unit/search/search/__init__.py +0 -19
- nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
- nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
- nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -270
- nucliadb/search/tests/unit/search/test_fetch.py +0 -108
- nucliadb/search/tests/unit/search/test_filters.py +0 -125
- nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
- nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
- nucliadb/search/tests/unit/search/test_query.py +0 -153
- nucliadb/search/tests/unit/test_app.py +0 -79
- nucliadb/search/tests/unit/test_find_merge.py +0 -112
- nucliadb/search/tests/unit/test_merge.py +0 -34
- nucliadb/search/tests/unit/test_predict.py +0 -525
- nucliadb/standalone/tests/__init__.py +0 -19
- nucliadb/standalone/tests/conftest.py +0 -33
- nucliadb/standalone/tests/fixtures.py +0 -38
- nucliadb/standalone/tests/unit/__init__.py +0 -18
- nucliadb/standalone/tests/unit/test_api_router.py +0 -61
- nucliadb/standalone/tests/unit/test_auth.py +0 -169
- nucliadb/standalone/tests/unit/test_introspect.py +0 -35
- nucliadb/standalone/tests/unit/test_migrations.py +0 -63
- nucliadb/standalone/tests/unit/test_versions.py +0 -68
- nucliadb/tests/benchmarks/__init__.py +0 -19
- nucliadb/tests/benchmarks/test_search.py +0 -99
- nucliadb/tests/conftest.py +0 -32
- nucliadb/tests/fixtures.py +0 -735
- nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -202
- nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -107
- nucliadb/tests/migrations/test_migration_0017.py +0 -76
- nucliadb/tests/migrations/test_migration_0018.py +0 -95
- nucliadb/tests/tikv.py +0 -240
- nucliadb/tests/unit/__init__.py +0 -19
- nucliadb/tests/unit/common/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -172
- nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
- nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -114
- nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -61
- nucliadb/tests/unit/common/cluster/test_cluster.py +0 -408
- nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -173
- nucliadb/tests/unit/common/cluster/test_rebalance.py +0 -38
- nucliadb/tests/unit/common/cluster/test_rollover.py +0 -282
- nucliadb/tests/unit/common/maindb/__init__.py +0 -18
- nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
- nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
- nucliadb/tests/unit/common/maindb/test_utils.py +0 -92
- nucliadb/tests/unit/common/test_context.py +0 -36
- nucliadb/tests/unit/export_import/__init__.py +0 -19
- nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
- nucliadb/tests/unit/export_import/test_utils.py +0 -301
- nucliadb/tests/unit/migrator/__init__.py +0 -19
- nucliadb/tests/unit/migrator/test_migrator.py +0 -87
- nucliadb/tests/unit/tasks/__init__.py +0 -19
- nucliadb/tests/unit/tasks/conftest.py +0 -42
- nucliadb/tests/unit/tasks/test_consumer.py +0 -92
- nucliadb/tests/unit/tasks/test_producer.py +0 -95
- nucliadb/tests/unit/tasks/test_tasks.py +0 -58
- nucliadb/tests/unit/test_field_ids.py +0 -49
- nucliadb/tests/unit/test_health.py +0 -86
- nucliadb/tests/unit/test_kb_slugs.py +0 -54
- nucliadb/tests/unit/test_learning_proxy.py +0 -252
- nucliadb/tests/unit/test_metrics_exporter.py +0 -77
- nucliadb/tests/unit/test_purge.py +0 -136
- nucliadb/tests/utils/__init__.py +0 -74
- nucliadb/tests/utils/aiohttp_session.py +0 -44
- nucliadb/tests/utils/broker_messages/__init__.py +0 -171
- nucliadb/tests/utils/broker_messages/fields.py +0 -197
- nucliadb/tests/utils/broker_messages/helpers.py +0 -33
- nucliadb/tests/utils/entities.py +0 -78
- nucliadb/train/api/v1/check.py +0 -60
- nucliadb/train/tests/__init__.py +0 -19
- nucliadb/train/tests/conftest.py +0 -29
- nucliadb/train/tests/fixtures.py +0 -342
- nucliadb/train/tests/test_field_classification.py +0 -122
- nucliadb/train/tests/test_get_entities.py +0 -80
- nucliadb/train/tests/test_get_info.py +0 -51
- nucliadb/train/tests/test_get_ontology.py +0 -34
- nucliadb/train/tests/test_get_ontology_count.py +0 -63
- nucliadb/train/tests/test_image_classification.py +0 -221
- nucliadb/train/tests/test_list_fields.py +0 -39
- nucliadb/train/tests/test_list_paragraphs.py +0 -73
- nucliadb/train/tests/test_list_resources.py +0 -39
- nucliadb/train/tests/test_list_sentences.py +0 -71
- nucliadb/train/tests/test_paragraph_classification.py +0 -123
- nucliadb/train/tests/test_paragraph_streaming.py +0 -118
- nucliadb/train/tests/test_question_answer_streaming.py +0 -239
- nucliadb/train/tests/test_sentence_classification.py +0 -143
- nucliadb/train/tests/test_token_classification.py +0 -136
- nucliadb/train/tests/utils.py +0 -101
- nucliadb/writer/layouts/__init__.py +0 -51
- nucliadb/writer/layouts/v1.py +0 -59
- nucliadb/writer/tests/__init__.py +0 -19
- nucliadb/writer/tests/conftest.py +0 -31
- nucliadb/writer/tests/fixtures.py +0 -191
- nucliadb/writer/tests/test_fields.py +0 -475
- nucliadb/writer/tests/test_files.py +0 -740
- nucliadb/writer/tests/test_knowledgebox.py +0 -49
- nucliadb/writer/tests/test_reprocess_file_field.py +0 -133
- nucliadb/writer/tests/test_resources.py +0 -476
- nucliadb/writer/tests/test_service.py +0 -137
- nucliadb/writer/tests/test_tus.py +0 -203
- nucliadb/writer/tests/utils.py +0 -35
- nucliadb/writer/tus/pg.py +0 -125
- nucliadb-4.0.0.post542.dist-info/METADATA +0 -135
- nucliadb-4.0.0.post542.dist-info/RECORD +0 -462
- {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
- /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
- /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/entry_points.txt +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/top_level.txt +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/zip-safe +0 -0
@@ -1,58 +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 pydantic
|
21
|
-
import pytest
|
22
|
-
|
23
|
-
from nucliadb import tasks
|
24
|
-
from nucliadb_utils import const
|
25
|
-
|
26
|
-
|
27
|
-
class StreamTest(const.Streams):
|
28
|
-
name = "test"
|
29
|
-
group = "test"
|
30
|
-
subject = "test"
|
31
|
-
|
32
|
-
|
33
|
-
class Message(pydantic.BaseModel):
|
34
|
-
kbid: str
|
35
|
-
|
36
|
-
|
37
|
-
async def test_start_consumer(context):
|
38
|
-
with pytest.raises(ValueError):
|
39
|
-
await tasks.start_consumer("foo", context)
|
40
|
-
|
41
|
-
@tasks.register_task("foo", StreamTest, msg_type=Message)
|
42
|
-
async def some_test_work(context, msg: Message): ...
|
43
|
-
|
44
|
-
consumer = await tasks.start_consumer("foo", context)
|
45
|
-
assert consumer.initialized
|
46
|
-
|
47
|
-
|
48
|
-
async def test_get_producer(context):
|
49
|
-
with pytest.raises(ValueError):
|
50
|
-
await tasks.get_producer("bar", context)
|
51
|
-
|
52
|
-
@tasks.register_task("bar", StreamTest, msg_type=Message)
|
53
|
-
async def some_test_work(context, msg: Message): ...
|
54
|
-
|
55
|
-
producer = await tasks.get_producer("bar", context)
|
56
|
-
assert producer.initialized
|
57
|
-
assert producer.msg_type == Message
|
58
|
-
assert producer.name == "bar_producer"
|
@@ -1,49 +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 pytest
|
21
|
-
from pydantic import BaseModel, ValidationError
|
22
|
-
|
23
|
-
from nucliadb_models.utils import FieldIdString
|
24
|
-
|
25
|
-
|
26
|
-
class DummyFieldIdModel(BaseModel):
|
27
|
-
field_id: FieldIdString
|
28
|
-
|
29
|
-
|
30
|
-
def test_field_ids():
|
31
|
-
"""Test some examples of valid fields and exhaustively test invalid
|
32
|
-
fields.
|
33
|
-
|
34
|
-
"""
|
35
|
-
valid_field_ids = [
|
36
|
-
"foo",
|
37
|
-
"foo_bar",
|
38
|
-
"foo-bar_123",
|
39
|
-
]
|
40
|
-
for valid in valid_field_ids:
|
41
|
-
DummyFieldIdModel(field_id=valid)
|
42
|
-
|
43
|
-
invalid_field_ids = [
|
44
|
-
"",
|
45
|
-
"foo/bar",
|
46
|
-
]
|
47
|
-
for invalid in invalid_field_ids:
|
48
|
-
with pytest.raises(ValidationError):
|
49
|
-
DummyFieldIdModel(field_id=invalid)
|
@@ -1,86 +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, MagicMock, patch
|
22
|
-
|
23
|
-
import pytest
|
24
|
-
from grpc_health.v1 import health_pb2
|
25
|
-
|
26
|
-
from nucliadb import health
|
27
|
-
from nucliadb.common.cluster import manager
|
28
|
-
from nucliadb.ingest.settings import DriverConfig, settings
|
29
|
-
|
30
|
-
pytestmark = pytest.mark.asyncio
|
31
|
-
|
32
|
-
|
33
|
-
@pytest.fixture(autouse=True)
|
34
|
-
def register_checks():
|
35
|
-
health.register_health_checks(
|
36
|
-
[health.nats_manager_healthy, health.nodes_health_check, health.pubsub_check]
|
37
|
-
)
|
38
|
-
yield
|
39
|
-
health.unregister_all_checks()
|
40
|
-
|
41
|
-
|
42
|
-
@pytest.fixture(autouse=True)
|
43
|
-
def nats_manager():
|
44
|
-
mock = MagicMock()
|
45
|
-
with patch("nucliadb.health.get_nats_manager", return_value=mock):
|
46
|
-
yield mock
|
47
|
-
|
48
|
-
|
49
|
-
async def test_grpc_health_check():
|
50
|
-
servicer = AsyncMock()
|
51
|
-
with (
|
52
|
-
patch.object(manager, "INDEX_NODES", {"node1": "node1"}),
|
53
|
-
patch.object(settings, "driver", DriverConfig.PG),
|
54
|
-
):
|
55
|
-
task = asyncio.create_task(health.grpc_health_check(servicer))
|
56
|
-
await asyncio.sleep(0.05)
|
57
|
-
|
58
|
-
servicer.set.assert_called_with("", health_pb2.HealthCheckResponse.SERVING)
|
59
|
-
|
60
|
-
task.cancel()
|
61
|
-
|
62
|
-
|
63
|
-
async def test_health_check_fail():
|
64
|
-
servicer = AsyncMock()
|
65
|
-
with (
|
66
|
-
patch.object(manager, "INDEX_NODES", {}),
|
67
|
-
patch.object(settings, "driver", DriverConfig.PG),
|
68
|
-
):
|
69
|
-
task = asyncio.create_task(health.grpc_health_check(servicer))
|
70
|
-
await asyncio.sleep(0.05)
|
71
|
-
|
72
|
-
servicer.set.assert_called_with("", health_pb2.HealthCheckResponse.NOT_SERVING)
|
73
|
-
|
74
|
-
task.cancel()
|
75
|
-
|
76
|
-
|
77
|
-
async def test_health_check_fail_unhealthy_nats(nats_manager):
|
78
|
-
nats_manager.healthy.return_value = False
|
79
|
-
servicer = AsyncMock()
|
80
|
-
with patch.object(manager, "INDEX_NODES", {"node1": "node1"}): # has nodes
|
81
|
-
task = asyncio.create_task(health.grpc_health_check(servicer))
|
82
|
-
await asyncio.sleep(0.05)
|
83
|
-
|
84
|
-
servicer.set.assert_called_with("", health_pb2.HealthCheckResponse.NOT_SERVING)
|
85
|
-
|
86
|
-
task.cancel()
|
@@ -1,54 +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 pytest
|
21
|
-
from pydantic import BaseModel, ValidationError
|
22
|
-
|
23
|
-
from nucliadb_models.utils import SlugString
|
24
|
-
|
25
|
-
|
26
|
-
class DummyModel(BaseModel):
|
27
|
-
slug: SlugString
|
28
|
-
|
29
|
-
|
30
|
-
def test_kb_slugs():
|
31
|
-
"""Test some examples of valid slugs and exhaustively test invalid
|
32
|
-
fields.
|
33
|
-
|
34
|
-
"""
|
35
|
-
valid_slugs = [
|
36
|
-
"foo",
|
37
|
-
"foo_bar",
|
38
|
-
"foo-bar_123",
|
39
|
-
"my-kbis:my-kb-slug",
|
40
|
-
"SomeUpperCase",
|
41
|
-
]
|
42
|
-
for valid in valid_slugs:
|
43
|
-
DummyModel(slug=valid)
|
44
|
-
|
45
|
-
invalid_slugs = [
|
46
|
-
"",
|
47
|
-
"foo/bar",
|
48
|
-
"foo.bar",
|
49
|
-
"@myslug",
|
50
|
-
"&invalid",
|
51
|
-
]
|
52
|
-
for invalid in invalid_slugs:
|
53
|
-
with pytest.raises(ValidationError):
|
54
|
-
DummyModel(slug=invalid)
|
@@ -1,252 +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 io import BytesIO
|
21
|
-
from unittest import mock
|
22
|
-
|
23
|
-
import pytest
|
24
|
-
|
25
|
-
from nucliadb.learning_proxy import (
|
26
|
-
LearningConfiguration,
|
27
|
-
LearningService,
|
28
|
-
delete_configuration,
|
29
|
-
get_configuration,
|
30
|
-
learning_config_client,
|
31
|
-
proxy,
|
32
|
-
set_configuration,
|
33
|
-
)
|
34
|
-
|
35
|
-
MODULE = "nucliadb.learning_proxy"
|
36
|
-
|
37
|
-
|
38
|
-
@pytest.fixture()
|
39
|
-
def config_response():
|
40
|
-
resp = mock.Mock(
|
41
|
-
status_code=200,
|
42
|
-
headers={
|
43
|
-
"x-foo": "bar",
|
44
|
-
"Content-Type": "application/json",
|
45
|
-
},
|
46
|
-
content=b"some data",
|
47
|
-
)
|
48
|
-
resp.raise_for_status.return_value = None
|
49
|
-
yield resp
|
50
|
-
|
51
|
-
|
52
|
-
@pytest.fixture()
|
53
|
-
def config_stream_response():
|
54
|
-
resp = mock.Mock(
|
55
|
-
status_code=200,
|
56
|
-
headers={
|
57
|
-
"Transfer-Encoding": "chunked",
|
58
|
-
},
|
59
|
-
content=b"some data",
|
60
|
-
)
|
61
|
-
|
62
|
-
async def aiter_bytes():
|
63
|
-
yield b"some data"
|
64
|
-
|
65
|
-
resp.aiter_bytes = aiter_bytes
|
66
|
-
resp.raise_for_status.return_value = None
|
67
|
-
yield resp
|
68
|
-
|
69
|
-
|
70
|
-
@pytest.fixture()
|
71
|
-
def async_client(config_response):
|
72
|
-
client = mock.AsyncMock()
|
73
|
-
client.is_closed.return_value = False
|
74
|
-
client.request = mock.AsyncMock(return_value=config_response)
|
75
|
-
client.get = mock.AsyncMock(return_value=config_response)
|
76
|
-
client.post = mock.AsyncMock(return_value=config_response)
|
77
|
-
client.patch = mock.AsyncMock(return_value=config_response)
|
78
|
-
client.delete = mock.AsyncMock(return_value=config_response)
|
79
|
-
with mock.patch(f"{MODULE}.service_client") as mocked:
|
80
|
-
mocked.return_value.__aenter__.return_value = client
|
81
|
-
mocked.return_value.__aexit__.return_value = None
|
82
|
-
yield client
|
83
|
-
|
84
|
-
|
85
|
-
@pytest.fixture()
|
86
|
-
def is_onprem_nucliadb_mock():
|
87
|
-
with mock.patch(f"{MODULE}.is_onprem_nucliadb", return_value=False) as mocked:
|
88
|
-
yield mocked
|
89
|
-
|
90
|
-
|
91
|
-
@pytest.fixture()
|
92
|
-
def settings():
|
93
|
-
with mock.patch(f"{MODULE}.nuclia_settings") as settings:
|
94
|
-
settings.learning_internal_svc_base_url = (
|
95
|
-
"http://{service}.learning.svc.cluster.local:8080"
|
96
|
-
)
|
97
|
-
settings.nuclia_service_account = "service-account"
|
98
|
-
settings.nuclia_zone = "europe-1"
|
99
|
-
settings.nuclia_public_url = "http://{zone}.public-url"
|
100
|
-
yield settings
|
101
|
-
|
102
|
-
|
103
|
-
async def test_get_learning_config_client(settings, is_onprem_nucliadb_mock):
|
104
|
-
is_onprem_nucliadb_mock.return_value = True
|
105
|
-
async with learning_config_client() as client:
|
106
|
-
assert str(client.base_url) == "http://europe-1.public-url/api/v1/"
|
107
|
-
assert client.headers["X-NUCLIA-NUAKEY"] == f"Bearer service-account"
|
108
|
-
|
109
|
-
is_onprem_nucliadb_mock.return_value = False
|
110
|
-
async with learning_config_client() as client:
|
111
|
-
assert (
|
112
|
-
str(client.base_url)
|
113
|
-
== "http://config.learning.svc.cluster.local:8080/api/v1/internal/"
|
114
|
-
)
|
115
|
-
assert "X-NUCLIA-NUAKEY" not in client.headers
|
116
|
-
|
117
|
-
|
118
|
-
async def test_get_configuration(async_client):
|
119
|
-
lconfig = LearningConfiguration(
|
120
|
-
semantic_model="multilingual",
|
121
|
-
semantic_threshold=1.5,
|
122
|
-
semantic_vector_size=222,
|
123
|
-
semantic_vector_similarity="cosine",
|
124
|
-
)
|
125
|
-
resp = mock.Mock()
|
126
|
-
resp.raise_for_status.return_value = None
|
127
|
-
resp.json.return_value = lconfig.dict()
|
128
|
-
async_client.get.return_value = resp
|
129
|
-
|
130
|
-
resp = await get_configuration("kbid")
|
131
|
-
|
132
|
-
assert resp is not None
|
133
|
-
assert resp == lconfig
|
134
|
-
async_client.get.assert_called_once_with("config/kbid")
|
135
|
-
|
136
|
-
|
137
|
-
async def test_set_configuration(config_response, async_client):
|
138
|
-
config_response.json.return_value = {
|
139
|
-
"semantic_model": "multilingual",
|
140
|
-
"semantic_threshold": 1.5,
|
141
|
-
"semantic_vector_size": 222,
|
142
|
-
"semantic_vector_similarity": "cosine",
|
143
|
-
}
|
144
|
-
resp = await set_configuration("kbid", {"some": "data"})
|
145
|
-
assert resp is not None
|
146
|
-
async_client.post.assert_called_once_with("config/kbid", json={"some": "data"})
|
147
|
-
|
148
|
-
|
149
|
-
async def test_delete_configuration(async_client):
|
150
|
-
resp = await delete_configuration("kbid")
|
151
|
-
assert resp is None
|
152
|
-
async_client.delete.assert_called_once_with("config/kbid")
|
153
|
-
|
154
|
-
|
155
|
-
async def test_proxy(async_client):
|
156
|
-
request = mock.Mock(
|
157
|
-
query_params={"some": "data"},
|
158
|
-
body=mock.AsyncMock(return_value=b"some data"),
|
159
|
-
headers={"x-nucliadb-user": "user", "x-nucliadb-roles": "roles"},
|
160
|
-
)
|
161
|
-
response = await proxy(
|
162
|
-
LearningService.CONFIG, request, "GET", "url", extra_headers={"foo": "bar"}
|
163
|
-
)
|
164
|
-
|
165
|
-
assert response.status_code == 200
|
166
|
-
assert response.body == b"some data"
|
167
|
-
assert response.media_type == "application/json"
|
168
|
-
assert response.headers["x-foo"] == "bar"
|
169
|
-
|
170
|
-
async_client.request.assert_called_once_with(
|
171
|
-
method="GET",
|
172
|
-
url="url",
|
173
|
-
params={"some": "data"},
|
174
|
-
content=b"some data",
|
175
|
-
headers={"foo": "bar", "x-nucliadb-user": "user", "x-nucliadb-roles": "roles"},
|
176
|
-
)
|
177
|
-
|
178
|
-
|
179
|
-
async def test_proxy_stream_response(async_client, config_stream_response):
|
180
|
-
async_client.request.return_value = config_stream_response
|
181
|
-
|
182
|
-
request = mock.Mock(
|
183
|
-
query_params={"some": "data"},
|
184
|
-
body=mock.AsyncMock(return_value=b"some data"),
|
185
|
-
headers={"x-nucliadb-user": "user", "x-nucliadb-roles": "roles"},
|
186
|
-
)
|
187
|
-
response = await proxy(LearningService.CONFIG, request, "GET", "url")
|
188
|
-
|
189
|
-
assert response.status_code == 200
|
190
|
-
data = BytesIO()
|
191
|
-
async for chunk in response.body_iterator:
|
192
|
-
data.write(chunk)
|
193
|
-
assert data.getvalue() == b"some data"
|
194
|
-
assert response.headers["Transfer-Encoding"] == "chunked"
|
195
|
-
|
196
|
-
async_client.request.assert_called_once_with(
|
197
|
-
method="GET",
|
198
|
-
url="url",
|
199
|
-
params={"some": "data"},
|
200
|
-
content=b"some data",
|
201
|
-
headers={"x-nucliadb-user": "user", "x-nucliadb-roles": "roles"},
|
202
|
-
)
|
203
|
-
|
204
|
-
|
205
|
-
async def test_proxy_error(async_client):
|
206
|
-
async_client.request.side_effect = Exception("some error")
|
207
|
-
|
208
|
-
request = mock.Mock(
|
209
|
-
query_params={"some": "data"},
|
210
|
-
body=mock.AsyncMock(return_value=b"some data"),
|
211
|
-
headers={},
|
212
|
-
)
|
213
|
-
response = await proxy(LearningService.CONFIG, request, "GET", "url")
|
214
|
-
|
215
|
-
assert response.status_code == 503
|
216
|
-
assert (
|
217
|
-
response.body
|
218
|
-
== b"Unexpected error while trying to proxy the request to the learning config API."
|
219
|
-
)
|
220
|
-
assert response.media_type == "text/plain"
|
221
|
-
|
222
|
-
assert len(async_client.request.mock_calls) == 3
|
223
|
-
async_client.request.assert_called_with(
|
224
|
-
method="GET",
|
225
|
-
url="url",
|
226
|
-
params={"some": "data"},
|
227
|
-
content=b"some data",
|
228
|
-
headers={},
|
229
|
-
)
|
230
|
-
|
231
|
-
|
232
|
-
async def test_proxy_headers(async_client):
|
233
|
-
request = mock.Mock(
|
234
|
-
query_params={},
|
235
|
-
body=mock.AsyncMock(return_value=b""),
|
236
|
-
headers={
|
237
|
-
"x-nucliadb-user": "user",
|
238
|
-
"x-nucliadb-roles": "roles",
|
239
|
-
"host": "localhost",
|
240
|
-
},
|
241
|
-
)
|
242
|
-
response = await proxy(LearningService.CONFIG, request, "GET", "url")
|
243
|
-
|
244
|
-
assert response.status_code == 200
|
245
|
-
|
246
|
-
async_client.request.assert_called_once_with(
|
247
|
-
method="GET",
|
248
|
-
url="url",
|
249
|
-
params={},
|
250
|
-
content=b"",
|
251
|
-
headers={"x-nucliadb-user": "user", "x-nucliadb-roles": "roles"},
|
252
|
-
)
|
@@ -1,77 +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
|
-
from unittest.mock import AsyncMock, Mock
|
23
|
-
|
24
|
-
from nucliadb.metrics_exporter import (
|
25
|
-
run_exporter,
|
26
|
-
run_exporter_task,
|
27
|
-
update_migration_metrics,
|
28
|
-
)
|
29
|
-
|
30
|
-
|
31
|
-
async def test_run_exporter_task():
|
32
|
-
coro = AsyncMock()
|
33
|
-
context = Mock()
|
34
|
-
task = asyncio.create_task(run_exporter_task(context, coro, interval=0.5))
|
35
|
-
await asyncio.sleep(1)
|
36
|
-
task.cancel()
|
37
|
-
assert coro.await_count == 2
|
38
|
-
assert coro.call_args_list[0] == mock.call(context)
|
39
|
-
|
40
|
-
|
41
|
-
async def test_run_exporter():
|
42
|
-
with mock.patch(
|
43
|
-
"nucliadb.metrics_exporter.update_migration_metrics"
|
44
|
-
) as update_migration_metrics:
|
45
|
-
with mock.patch(
|
46
|
-
"nucliadb.metrics_exporter.update_node_metrics"
|
47
|
-
) as update_node_metrics:
|
48
|
-
context = Mock()
|
49
|
-
task = asyncio.create_task(run_exporter(context))
|
50
|
-
|
51
|
-
await asyncio.sleep(1)
|
52
|
-
|
53
|
-
update_node_metrics.assert_called()
|
54
|
-
update_migration_metrics.assert_called()
|
55
|
-
|
56
|
-
task.cancel()
|
57
|
-
|
58
|
-
|
59
|
-
async def test_update_migration_metrics():
|
60
|
-
async def iter_kbids(context):
|
61
|
-
yield "foo"
|
62
|
-
yield "bar"
|
63
|
-
|
64
|
-
with mock.patch("nucliadb.metrics_exporter.iter_kbids", new=iter_kbids):
|
65
|
-
with mock.patch("nucliadb.metrics_exporter.MIGRATION_COUNT") as migration_count:
|
66
|
-
with mock.patch(
|
67
|
-
"nucliadb.metrics_exporter.MigrationsDataManager", autospec=True
|
68
|
-
) as mdm:
|
69
|
-
mdm.get_global_info = AsyncMock(return_value=Mock(current_version="1"))
|
70
|
-
mdm.get_kb_info = AsyncMock(return_value=Mock(current_version="2"))
|
71
|
-
|
72
|
-
driver = Mock()
|
73
|
-
context = Mock(kv_driver=driver)
|
74
|
-
|
75
|
-
await update_migration_metrics(context)
|
76
|
-
|
77
|
-
assert migration_count.set.call_count == 2
|