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,353 +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 typing import Callable
|
21
|
-
|
22
|
-
import pytest
|
23
|
-
from httpx import AsyncClient
|
24
|
-
|
25
|
-
from nucliadb.ingest.orm.resource import Resource
|
26
|
-
from nucliadb.reader.api.v1.router import KB_PREFIX, RESOURCE_PREFIX, RSLUG_PREFIX
|
27
|
-
from nucliadb_models.resource import NucliaDBRoles
|
28
|
-
|
29
|
-
ID = ("id",)
|
30
|
-
BASIC = (
|
31
|
-
"slug",
|
32
|
-
"title",
|
33
|
-
"summary",
|
34
|
-
"icon",
|
35
|
-
"layout",
|
36
|
-
"thumbnail",
|
37
|
-
"metadata",
|
38
|
-
"usermetadata",
|
39
|
-
"computedmetadata",
|
40
|
-
"created",
|
41
|
-
"modified",
|
42
|
-
"fieldmetadata",
|
43
|
-
"last_seqid",
|
44
|
-
"last_account_seq",
|
45
|
-
"queue",
|
46
|
-
)
|
47
|
-
RELATIONS = ("relations",)
|
48
|
-
ORIGIN = ("origin",)
|
49
|
-
DATA = ("data",)
|
50
|
-
VALUES = ("values",)
|
51
|
-
EXTRACTED = ("extracted",)
|
52
|
-
|
53
|
-
|
54
|
-
@pytest.mark.asyncio
|
55
|
-
async def test_get_resource_inexistent(
|
56
|
-
reader_api: Callable[..., AsyncClient], knowledgebox_ingest: str
|
57
|
-
) -> None:
|
58
|
-
kbid = knowledgebox_ingest
|
59
|
-
rid = "000000000000001"
|
60
|
-
|
61
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
62
|
-
resp = await client.get(
|
63
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}",
|
64
|
-
)
|
65
|
-
assert resp.status_code == 404
|
66
|
-
|
67
|
-
|
68
|
-
@pytest.mark.asyncio
|
69
|
-
async def test_get_resource_default_options(
|
70
|
-
reader_api: Callable[..., AsyncClient], test_resource: Resource
|
71
|
-
) -> None:
|
72
|
-
rsc = test_resource
|
73
|
-
kbid = rsc.kb.kbid
|
74
|
-
rid = rsc.uuid
|
75
|
-
|
76
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
77
|
-
resp = await client.get(
|
78
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}",
|
79
|
-
)
|
80
|
-
assert resp.status_code == 200
|
81
|
-
|
82
|
-
resource = resp.json()
|
83
|
-
|
84
|
-
expected_root_fields = set(ID + BASIC)
|
85
|
-
assert set(resource.keys()) == expected_root_fields
|
86
|
-
assert "data" not in resource
|
87
|
-
|
88
|
-
|
89
|
-
@pytest.mark.asyncio
|
90
|
-
async def test_get_resource_sequence_ids_are_set_on_resource(
|
91
|
-
reader_api: Callable[..., AsyncClient], test_resource: Resource
|
92
|
-
) -> None:
|
93
|
-
rsc = test_resource
|
94
|
-
kbid = rsc.kb.kbid
|
95
|
-
rid = rsc.uuid
|
96
|
-
|
97
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
98
|
-
resp = await client.get(
|
99
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}",
|
100
|
-
)
|
101
|
-
assert resp.status_code == 200
|
102
|
-
|
103
|
-
resource = resp.json()
|
104
|
-
|
105
|
-
expected_root_fields = set(ID + BASIC)
|
106
|
-
assert set(resource.keys()) == expected_root_fields
|
107
|
-
|
108
|
-
assert "data" not in resource
|
109
|
-
assert test_resource.basic is not None
|
110
|
-
assert resource["last_seqid"] == test_resource.basic.last_seqid
|
111
|
-
assert resource["last_account_seq"] == test_resource.basic.last_account_seq
|
112
|
-
assert resource["queue"] == "private"
|
113
|
-
|
114
|
-
|
115
|
-
@pytest.mark.asyncio
|
116
|
-
async def test_get_resource_all(
|
117
|
-
reader_api: Callable[..., AsyncClient],
|
118
|
-
test_resource: Resource,
|
119
|
-
) -> None:
|
120
|
-
rsc = test_resource
|
121
|
-
kbid = rsc.kb.kbid
|
122
|
-
rid = rsc.uuid
|
123
|
-
|
124
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
125
|
-
resp = await client.get(
|
126
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}",
|
127
|
-
params={
|
128
|
-
"show": ["basic", "origin", "relations", "values", "extracted"],
|
129
|
-
"field_type": [
|
130
|
-
"text",
|
131
|
-
"link",
|
132
|
-
"file",
|
133
|
-
"layout",
|
134
|
-
"keywordset",
|
135
|
-
"datetime",
|
136
|
-
"conversation",
|
137
|
-
],
|
138
|
-
"extracted": [
|
139
|
-
"metadata",
|
140
|
-
"vectors",
|
141
|
-
"large_metadata",
|
142
|
-
"text",
|
143
|
-
"link",
|
144
|
-
"file",
|
145
|
-
],
|
146
|
-
},
|
147
|
-
)
|
148
|
-
assert resp.status_code == 200
|
149
|
-
|
150
|
-
resource = resp.json()
|
151
|
-
|
152
|
-
# DEBUG
|
153
|
-
# import json # noqa
|
154
|
-
# print(json.dumps(data, indent=4))
|
155
|
-
|
156
|
-
expected_root_fields = set(ID + BASIC + RELATIONS + ORIGIN + DATA)
|
157
|
-
assert set(resource.keys()) == expected_root_fields
|
158
|
-
|
159
|
-
data = resource["data"]
|
160
|
-
assert set(data.keys()) == {
|
161
|
-
"files",
|
162
|
-
"texts",
|
163
|
-
"links",
|
164
|
-
"layouts",
|
165
|
-
"keywordsets",
|
166
|
-
"datetimes",
|
167
|
-
"conversations",
|
168
|
-
}
|
169
|
-
texts = data["texts"]
|
170
|
-
assert set(texts.keys()) == {"text1"}
|
171
|
-
assert set(texts["text1"]["extracted"].keys()) == {
|
172
|
-
"metadata",
|
173
|
-
"vectors",
|
174
|
-
"large_metadata",
|
175
|
-
"text",
|
176
|
-
}
|
177
|
-
layouts = data["layouts"]
|
178
|
-
assert set(layouts.keys()) == {"layout1"}
|
179
|
-
assert set(layouts["layout1"]["extracted"].keys()) == {
|
180
|
-
"metadata",
|
181
|
-
"vectors",
|
182
|
-
"large_metadata",
|
183
|
-
"text",
|
184
|
-
}
|
185
|
-
|
186
|
-
links = data["links"]
|
187
|
-
assert set(links.keys()) == {"link1"}
|
188
|
-
assert set(links["link1"]["extracted"].keys()) == {
|
189
|
-
"metadata",
|
190
|
-
"vectors",
|
191
|
-
"large_metadata",
|
192
|
-
"text",
|
193
|
-
"link",
|
194
|
-
}
|
195
|
-
|
196
|
-
|
197
|
-
@pytest.mark.asyncio
|
198
|
-
async def test_get_resource_filter_root_fields(reader_api, test_resource):
|
199
|
-
rsc = test_resource
|
200
|
-
kbid = rsc.kb.kbid
|
201
|
-
rid = rsc.uuid
|
202
|
-
|
203
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
204
|
-
resp = await client.get(
|
205
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}",
|
206
|
-
params={"show": ["basic", "values"]},
|
207
|
-
)
|
208
|
-
assert resp.status_code == 200
|
209
|
-
|
210
|
-
resource = resp.json()
|
211
|
-
|
212
|
-
expected_root_fields = set(ID + BASIC + DATA)
|
213
|
-
assert set(resource.keys()) == expected_root_fields
|
214
|
-
|
215
|
-
data = resource["data"]
|
216
|
-
|
217
|
-
assert set(data.keys()) == {
|
218
|
-
"files",
|
219
|
-
"texts",
|
220
|
-
"links",
|
221
|
-
"layouts",
|
222
|
-
"keywordsets",
|
223
|
-
"datetimes",
|
224
|
-
"conversations",
|
225
|
-
"generics",
|
226
|
-
}
|
227
|
-
|
228
|
-
assert set(data["files"]["file1"].keys()) == {"value"}
|
229
|
-
assert set(data["texts"]["text1"].keys()) == {"value"}
|
230
|
-
assert set(data["links"]["link1"].keys()) == {"value"}
|
231
|
-
assert set(data["layouts"]["layout1"].keys()) == {"value"}
|
232
|
-
assert set(data["keywordsets"]["keywordset1"].keys()) == {"value"}
|
233
|
-
assert set(data["datetimes"]["datetime1"].keys()) == {"value"}
|
234
|
-
assert set(data["conversations"]["conv1"].keys()) == {"value"}
|
235
|
-
|
236
|
-
|
237
|
-
@pytest.mark.asyncio
|
238
|
-
async def test_get_resource_filter_field_types(reader_api, test_resource):
|
239
|
-
rsc = test_resource
|
240
|
-
kbid = rsc.kb.kbid
|
241
|
-
rid = rsc.uuid
|
242
|
-
|
243
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
244
|
-
resp = await client.get(
|
245
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}",
|
246
|
-
params={"show": ["values", "extracted"], "field_type": ["text", "link"]},
|
247
|
-
)
|
248
|
-
assert resp.status_code == 200
|
249
|
-
|
250
|
-
resource = resp.json()
|
251
|
-
|
252
|
-
expected_root_fields = set(ID + DATA)
|
253
|
-
assert set(resource.keys()) == expected_root_fields
|
254
|
-
|
255
|
-
data = resource["data"]
|
256
|
-
|
257
|
-
assert set(data.keys()) == {"texts", "links"}
|
258
|
-
assert set(data["texts"]["text1"].keys()) == {"value", "extracted"}
|
259
|
-
assert set(data["links"]["link1"].keys()) == {"value", "extracted"}
|
260
|
-
|
261
|
-
|
262
|
-
@pytest.mark.asyncio
|
263
|
-
async def test_get_resource_filter_field_types_and_extracted(reader_api, test_resource):
|
264
|
-
rsc = test_resource
|
265
|
-
kbid = rsc.kb.kbid
|
266
|
-
rid = rsc.uuid
|
267
|
-
|
268
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
269
|
-
resp = await client.get(
|
270
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}",
|
271
|
-
params={
|
272
|
-
"show": ["extracted"],
|
273
|
-
"field_type": ["text"],
|
274
|
-
"extracted": ["metadata", "vectors"],
|
275
|
-
},
|
276
|
-
)
|
277
|
-
|
278
|
-
assert resp.status_code == 200
|
279
|
-
resource = resp.json()
|
280
|
-
|
281
|
-
expected_root_fields = set(ID + DATA)
|
282
|
-
assert set(resource.keys()) == expected_root_fields
|
283
|
-
|
284
|
-
data = resource["data"]
|
285
|
-
|
286
|
-
assert set(data.keys()) == {"texts"}
|
287
|
-
assert set(data["texts"]["text1"].keys()) == {"extracted"}
|
288
|
-
assert set(data["texts"]["text1"]["extracted"].keys()) == {
|
289
|
-
"metadata",
|
290
|
-
"vectors",
|
291
|
-
}
|
292
|
-
|
293
|
-
|
294
|
-
@pytest.mark.asyncio
|
295
|
-
async def test_resource_endpoints_by_slug(reader_api, test_resource):
|
296
|
-
rsc = test_resource
|
297
|
-
kbid = rsc.kb.kbid
|
298
|
-
rslug = rsc.basic.slug
|
299
|
-
|
300
|
-
non_existent_slug = "foobar"
|
301
|
-
|
302
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
303
|
-
# Regular GET
|
304
|
-
|
305
|
-
resp = await client.get(
|
306
|
-
f"/{KB_PREFIX}/{kbid}/{RSLUG_PREFIX}/{rslug}",
|
307
|
-
)
|
308
|
-
assert resp.status_code == 200
|
309
|
-
|
310
|
-
resp = await client.get(
|
311
|
-
f"/{KB_PREFIX}/{kbid}/{RSLUG_PREFIX}/{non_existent_slug}",
|
312
|
-
)
|
313
|
-
assert resp.status_code == 404
|
314
|
-
|
315
|
-
# Field endpoint
|
316
|
-
|
317
|
-
resp = await client.get(
|
318
|
-
f"/{KB_PREFIX}/{kbid}/{RSLUG_PREFIX}/{rslug}/text/text1",
|
319
|
-
)
|
320
|
-
assert resp.status_code == 200
|
321
|
-
|
322
|
-
resp = await client.get(
|
323
|
-
f"/{KB_PREFIX}/{kbid}/{RSLUG_PREFIX}/{non_existent_slug}/text/text1",
|
324
|
-
)
|
325
|
-
assert resp.status_code == 404
|
326
|
-
assert resp.json()["detail"] == "Resource does not exist"
|
327
|
-
|
328
|
-
|
329
|
-
@pytest.mark.asyncio
|
330
|
-
async def test_get_resource_extracted_metadata(
|
331
|
-
reader_api: Callable[..., AsyncClient], test_resource: Resource
|
332
|
-
):
|
333
|
-
rsc = test_resource
|
334
|
-
kbid = rsc.kb.kbid
|
335
|
-
rid = rsc.uuid
|
336
|
-
|
337
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
338
|
-
resp = await client.get(
|
339
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}",
|
340
|
-
params={
|
341
|
-
"show": ["extracted"],
|
342
|
-
"extracted": [
|
343
|
-
"metadata",
|
344
|
-
],
|
345
|
-
},
|
346
|
-
)
|
347
|
-
assert resp.status_code == 200
|
348
|
-
|
349
|
-
resource = resp.json()
|
350
|
-
metadata = resource["data"]["texts"]["text1"]["extracted"]["metadata"][
|
351
|
-
"metadata"
|
352
|
-
]
|
353
|
-
assert metadata["positions"]["ENTITY/document"]["entity"] == "document"
|
@@ -1,219 +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 typing import Callable
|
21
|
-
|
22
|
-
import pytest
|
23
|
-
from httpx import AsyncClient
|
24
|
-
|
25
|
-
from nucliadb.ingest.orm.resource import Resource
|
26
|
-
from nucliadb.reader.api.v1.router import KB_PREFIX, RESOURCE_PREFIX, RSLUG_PREFIX
|
27
|
-
from nucliadb_models.resource import NucliaDBRoles
|
28
|
-
|
29
|
-
BASE = ("field_id", "field_type")
|
30
|
-
VALUE = ("value",)
|
31
|
-
EXTRACTED = ("extracted",)
|
32
|
-
|
33
|
-
|
34
|
-
@pytest.mark.asyncio
|
35
|
-
async def test_get_resource_field_default_options(
|
36
|
-
reader_api: Callable[..., AsyncClient], test_resource: Resource
|
37
|
-
) -> None:
|
38
|
-
rsc = test_resource
|
39
|
-
kbid = rsc.kb.kbid
|
40
|
-
rid = rsc.uuid
|
41
|
-
field_type = "text"
|
42
|
-
field_id = "text1"
|
43
|
-
|
44
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
45
|
-
resp = await client.get(
|
46
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}/{field_type}/{field_id}",
|
47
|
-
)
|
48
|
-
assert resp.status_code == 200
|
49
|
-
|
50
|
-
data = resp.json()
|
51
|
-
|
52
|
-
# DEBUG
|
53
|
-
# import json # noqa
|
54
|
-
# print(json.dumps(data, indent=4))
|
55
|
-
|
56
|
-
expected_root_fields = set(BASE + VALUE)
|
57
|
-
assert set(data.keys()) == expected_root_fields
|
58
|
-
|
59
|
-
|
60
|
-
@pytest.mark.asyncio
|
61
|
-
async def test_get_resource_field_all(
|
62
|
-
reader_api: Callable[..., AsyncClient], test_resource: Resource
|
63
|
-
) -> None:
|
64
|
-
rsc = test_resource
|
65
|
-
kbid = rsc.kb.kbid
|
66
|
-
rid = rsc.uuid
|
67
|
-
field_type = "text"
|
68
|
-
field_id = "text1"
|
69
|
-
|
70
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
71
|
-
resp = await client.get(
|
72
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}/{field_type}/{field_id}",
|
73
|
-
params={
|
74
|
-
"show": ["value", "extracted"],
|
75
|
-
"field_type": [
|
76
|
-
"text",
|
77
|
-
"link",
|
78
|
-
"file",
|
79
|
-
"layout",
|
80
|
-
"keywordset",
|
81
|
-
"datetime",
|
82
|
-
"conversation",
|
83
|
-
],
|
84
|
-
"extracted": [
|
85
|
-
"metadata",
|
86
|
-
"vectors",
|
87
|
-
"large_metadata",
|
88
|
-
"text",
|
89
|
-
"link",
|
90
|
-
"file",
|
91
|
-
],
|
92
|
-
},
|
93
|
-
)
|
94
|
-
assert resp.status_code == 200
|
95
|
-
|
96
|
-
data = resp.json()
|
97
|
-
|
98
|
-
# DEBUG
|
99
|
-
# import json # noqa
|
100
|
-
# print(json.dumps(data, indent=4))
|
101
|
-
|
102
|
-
expected_root_fields = set(BASE + VALUE + EXTRACTED)
|
103
|
-
assert set(data.keys()) == expected_root_fields
|
104
|
-
assert "body" in data["value"]
|
105
|
-
assert set(data["extracted"].keys()) == {
|
106
|
-
"metadata",
|
107
|
-
"vectors",
|
108
|
-
"large_metadata",
|
109
|
-
"text",
|
110
|
-
}
|
111
|
-
|
112
|
-
|
113
|
-
@pytest.mark.asyncio
|
114
|
-
async def test_get_resource_field_filter_root_fields(reader_api, test_resource):
|
115
|
-
rsc = test_resource
|
116
|
-
kbid = rsc.kb.kbid
|
117
|
-
rid = rsc.uuid
|
118
|
-
field_type = "text"
|
119
|
-
field_id = "text1"
|
120
|
-
|
121
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
122
|
-
resp = await client.get(
|
123
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}/{field_type}/{field_id}",
|
124
|
-
params={"show": ["value"]},
|
125
|
-
)
|
126
|
-
|
127
|
-
assert resp.status_code == 200
|
128
|
-
|
129
|
-
data = resp.json()
|
130
|
-
|
131
|
-
expected_root_fields = set(BASE + VALUE)
|
132
|
-
assert set(data.keys()) == expected_root_fields
|
133
|
-
|
134
|
-
|
135
|
-
@pytest.mark.asyncio
|
136
|
-
async def test_get_resource_field_filter_extracted(reader_api, test_resource):
|
137
|
-
rsc = test_resource
|
138
|
-
kbid = rsc.kb.kbid
|
139
|
-
rid = rsc.uuid
|
140
|
-
field_type = "text"
|
141
|
-
field_id = "text1"
|
142
|
-
|
143
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
144
|
-
resp = await client.get(
|
145
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}/{field_type}/{field_id}",
|
146
|
-
params={
|
147
|
-
"show": ["extracted"],
|
148
|
-
"extracted": ["metadata", "vectors"],
|
149
|
-
},
|
150
|
-
)
|
151
|
-
|
152
|
-
assert resp.status_code == 200
|
153
|
-
|
154
|
-
data = resp.json()
|
155
|
-
|
156
|
-
expected_root_fields = set(BASE + EXTRACTED)
|
157
|
-
assert set(data.keys()) == expected_root_fields
|
158
|
-
|
159
|
-
assert set(data["extracted"].keys()) == {"metadata", "vectors"}
|
160
|
-
|
161
|
-
|
162
|
-
@pytest.mark.asyncio
|
163
|
-
async def test_get_resource_field_conversation(
|
164
|
-
reader_api: Callable[..., AsyncClient], test_resource: Resource
|
165
|
-
) -> None:
|
166
|
-
rsc = test_resource
|
167
|
-
kbid = rsc.kb.kbid
|
168
|
-
rid = rsc.uuid
|
169
|
-
field_type = "conversation"
|
170
|
-
field_id = "conv1"
|
171
|
-
|
172
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
173
|
-
resp = await client.get(
|
174
|
-
f"/{KB_PREFIX}/{kbid}/{RESOURCE_PREFIX}/{rid}/{field_type}/{field_id}?page=last",
|
175
|
-
)
|
176
|
-
assert resp.status_code == 200
|
177
|
-
data = resp.json()
|
178
|
-
|
179
|
-
# DEBUG
|
180
|
-
# import json # noqa
|
181
|
-
# print(json.dumps(data, indent=4))
|
182
|
-
|
183
|
-
expected_root_fields = set(BASE + VALUE)
|
184
|
-
assert set(data.keys()) == expected_root_fields
|
185
|
-
assert "messages" in data["value"]
|
186
|
-
|
187
|
-
|
188
|
-
@pytest.mark.asyncio
|
189
|
-
async def test_resource_endpoints_by_slug(reader_api, test_resource):
|
190
|
-
rsc = test_resource
|
191
|
-
kbid = rsc.kb.kbid
|
192
|
-
rslug = rsc.basic.slug
|
193
|
-
|
194
|
-
non_existent_slug = "foobar"
|
195
|
-
|
196
|
-
async with reader_api(roles=[NucliaDBRoles.READER]) as client:
|
197
|
-
# Regular GET
|
198
|
-
|
199
|
-
resp = await client.get(
|
200
|
-
f"/{KB_PREFIX}/{kbid}/{RSLUG_PREFIX}/{rslug}",
|
201
|
-
)
|
202
|
-
assert resp.status_code == 200
|
203
|
-
|
204
|
-
resp = await client.get(
|
205
|
-
f"/{KB_PREFIX}/{kbid}/{RSLUG_PREFIX}/{non_existent_slug}",
|
206
|
-
)
|
207
|
-
assert resp.status_code == 404
|
208
|
-
|
209
|
-
# Field endpoint
|
210
|
-
|
211
|
-
resp = await client.get(
|
212
|
-
f"/{KB_PREFIX}/{kbid}/{RSLUG_PREFIX}/{rslug}/text/text1",
|
213
|
-
)
|
214
|
-
assert resp.status_code == 200
|
215
|
-
|
216
|
-
resp = await client.get(
|
217
|
-
f"/{KB_PREFIX}/{kbid}/{RSLUG_PREFIX}/{non_existent_slug}/text/text1",
|
218
|
-
)
|
219
|
-
assert resp.status_code == 404
|