mixedbread 0.50.0__tar.gz → 0.52.0__tar.gz
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.
- mixedbread-0.52.0/.release-please-manifest.json +3 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/CHANGELOG.md +33 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/PKG-INFO +1 -1
- {mixedbread-0.50.0 → mixedbread-0.52.0}/api.md +3 -1
- {mixedbread-0.50.0 → mixedbread-0.52.0}/pyproject.toml +2 -2
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_client.py +19 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_files.py +1 -1
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_models.py +80 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_qs.py +2 -6
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_types.py +3 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_utils.py +34 -8
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_version.py +1 -1
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/stores/stores.py +252 -39
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/__init__.py +3 -12
- mixedbread-0.52.0/src/mixedbread/types/agentic_search_config_param.py +41 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/scored_audio_url_input_chunk.py +3 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/shared/__init__.py +0 -1
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/shared_params/__init__.py +0 -1
- mixedbread-0.52.0/src/mixedbread/types/store_grep_params.py +98 -0
- mixedbread-0.50.0/src/mixedbread/types/store_search_response.py → mixedbread-0.52.0/src/mixedbread/types/store_grep_response.py +3 -3
- mixedbread-0.52.0/src/mixedbread/types/store_metadata_facets_params.py +101 -0
- mixedbread-0.52.0/src/mixedbread/types/store_question_answering_params.py +115 -0
- mixedbread-0.52.0/src/mixedbread/types/store_search_params.py +94 -0
- mixedbread-0.52.0/src/mixedbread/types/store_search_response.py +41 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/audio_url_input_chunk.py +3 -0
- mixedbread-0.52.0/src/mixedbread/types/stores/file_list_params.py +99 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/stores/test_files.py +72 -6
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/test_stores.py +405 -30
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_extract_files.py +23 -5
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_files.py +1 -1
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_models.py +57 -3
- mixedbread-0.50.0/.release-please-manifest.json +0 -3
- mixedbread-0.50.0/src/mixedbread/types/agentic_search_config_param.py +0 -24
- mixedbread-0.50.0/src/mixedbread/types/shared/search_filter.py +0 -40
- mixedbread-0.50.0/src/mixedbread/types/shared_params/search_filter.py +0 -39
- mixedbread-0.50.0/src/mixedbread/types/store_metadata_facets_params.py +0 -42
- mixedbread-0.50.0/src/mixedbread/types/store_question_answering_params.py +0 -65
- mixedbread-0.50.0/src/mixedbread/types/store_search_params.py +0 -43
- mixedbread-0.50.0/src/mixedbread/types/stores/file_list_params.py +0 -47
- {mixedbread-0.50.0 → mixedbread-0.52.0}/.gitignore +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/CONTRIBUTING.md +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/LICENSE +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/README.md +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/SECURITY.md +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/bin/check-release-environment +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/bin/publish-pypi +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/examples/.keep +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/noxfile.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/release-please-config.json +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/requirements-dev.lock +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/requirements.lock +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_base_client.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_compat.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_constants.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_exceptions.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_resource.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_streaming.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_compat.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_datetime_parse.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_json.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_logs.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_path.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_proxy.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_reflection.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_resources_proxy.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_streams.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_sync.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_transform.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/_utils/_typing.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/lib/.keep +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/lib/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/lib/multipart_upload.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/lib/polling.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/pagination.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/py.typed +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/api_keys.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/chat.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/data_sources/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/data_sources/connectors.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/data_sources/data_sources.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/embeddings.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/extractions/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/extractions/content.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/extractions/extractions.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/extractions/jobs.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/extractions/schema.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/files/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/files/files.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/files/uploads.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/parsing/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/parsing/jobs.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/parsing/parsing.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/stores/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/resources/stores/files.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/api_key.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/api_key_create_or_update_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/api_key_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/api_key_created.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/api_key_delete_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/api_key_list_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/audio_chunk_generated_metadata.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/audio_url.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/client_embed_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/client_rerank_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/code_chunk_generated_metadata.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/contextualization_config.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/contextualization_config_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_source.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_source_api_key_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_source_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_source_delete_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_source_list_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_source_oauth2_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_source_type.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_source_update_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_sources/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_sources/connector_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_sources/connector_delete_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_sources/connector_list_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_sources/connector_update_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/data_sources/data_source_connector.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/embedding.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/embedding_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/embedding_create_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/encoding_format.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/expires_after.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/expires_after_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/content_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/created_json_schema.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/enhanced_json_schema.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/extraction_job.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/extraction_result.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/image_url_input_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/job_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/schema_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/schema_enhance_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/schema_validate_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/text_input_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/extractions/validated_json_schema.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/file_counts.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/file_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/file_delete_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/file_list_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/file_object.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/file_update_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/multipart_upload_part.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/multipart_upload_part_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/multipart_upload_part_url.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/upload_abort_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/upload_complete_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/upload_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/upload_create_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/upload_list_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/files/upload_retrieve_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/image_chunk_generated_metadata.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/image_url_output.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/info_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/linear_data_source_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/markdown_chunk_generated_metadata.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/markdown_heading.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/multi_encoding_embedding.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/notion_data_source_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/oauth2_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/pagination_with_total.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/chunk.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/chunk_element.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/chunking_strategy.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/document_parser_result.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/element_type.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/job_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/job_delete_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/job_list_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/job_list_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/parsing_job.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/parsing_job_status.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/parsing/return_format.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/pdf_chunk_generated_metadata.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/rerank_config_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/rerank_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/scope.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/scope_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/scored_image_url_input_chunk.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/scored_text_input_chunk.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/scored_video_url_input_chunk.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/shared/search_filter_condition.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/shared/usage.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/shared_params/search_filter_condition.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_chunk_search_options_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_config.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_config_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_delete_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_list_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_metadata_facets_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_question_answering_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/store_update_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/file_create_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/file_delete_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/file_list_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/file_retrieve_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/file_update_params.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/image_url_input_chunk.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/store_file.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/store_file_config.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/store_file_config_param.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/store_file_status.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/text_input_chunk.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/stores/video_url_input_chunk.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/text_chunk_generated_metadata.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/video_chunk_generated_metadata.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/src/mixedbread/types/video_url.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/data_sources/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/data_sources/test_connectors.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/extractions/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/extractions/test_content.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/extractions/test_jobs.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/extractions/test_schema.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/files/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/files/test_uploads.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/parsing/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/parsing/test_jobs.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/stores/__init__.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/test_api_keys.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/test_chat.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/test_client.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/test_data_sources.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/test_embeddings.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/api_resources/test_files.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/conftest.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/sample_file.txt +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_client.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_qs.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_required_args.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_response.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_streaming.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_transform.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_utils/test_json.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_utils/test_path.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_utils/test_proxy.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/test_utils/test_typing.py +0 -0
- {mixedbread-0.50.0 → mixedbread-0.52.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.52.0 (2026-05-20)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v0.51.0...v0.52.0](https://github.com/mixedbread-ai/mixedbread-python/compare/v0.51.0...v0.52.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **api:** add grep ([3b53a40](https://github.com/mixedbread-ai/mixedbread-python/commit/3b53a40d4edb99c688ec00efafefcb2a46f008cc))
|
|
10
|
+
|
|
11
|
+
## 0.51.0 (2026-05-20)
|
|
12
|
+
|
|
13
|
+
Full Changelog: [v0.50.0...v0.51.0](https://github.com/mixedbread-ai/mixedbread-python/compare/v0.50.0...v0.51.0)
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* **api:** api update ([c59f556](https://github.com/mixedbread-ai/mixedbread-python/commit/c59f5561b5e782ae7e35b9cbfb498f357856c8f8))
|
|
18
|
+
* **api:** api update ([842efa8](https://github.com/mixedbread-ai/mixedbread-python/commit/842efa840415d1a6d8f754f9c1594655283858c9))
|
|
19
|
+
* **api:** api update ([6fe066e](https://github.com/mixedbread-ai/mixedbread-python/commit/6fe066e17443211a47a21f677344bf8c349e6fde))
|
|
20
|
+
* **api:** api update ([eac4b8f](https://github.com/mixedbread-ai/mixedbread-python/commit/eac4b8f34275c9377765cfe62f677d5ca36cf061))
|
|
21
|
+
* **api:** api update ([66aa7dc](https://github.com/mixedbread-ai/mixedbread-python/commit/66aa7dc394357766b869a3d067e4c130cdf482e8))
|
|
22
|
+
* **internal/types:** support eagerly validating pydantic iterators ([3e9c5ac](https://github.com/mixedbread-ai/mixedbread-python/commit/3e9c5ac9ab56db4eddf8a6a2f219a8789c9c45ac))
|
|
23
|
+
* support setting headers via env ([38de0ee](https://github.com/mixedbread-ai/mixedbread-python/commit/38de0ee2781d9e27d6aecafe89f5a5b5baaed75c))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Bug Fixes
|
|
27
|
+
|
|
28
|
+
* **client:** add missing f-string prefix in file type error message ([fe74792](https://github.com/mixedbread-ai/mixedbread-python/commit/fe74792cd81bb58bd62e58c086d6d1ee6c233c25))
|
|
29
|
+
* use correct field name format for multipart file arrays ([361fcd6](https://github.com/mixedbread-ai/mixedbread-python/commit/361fcd66f8422020375b076d4c70a83c2b82241d))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Chores
|
|
33
|
+
|
|
34
|
+
* **internal:** reformat pyproject.toml ([8802c53](https://github.com/mixedbread-ai/mixedbread-python/commit/8802c53023895e9248f03b92477c9a17013ec7b7))
|
|
35
|
+
|
|
3
36
|
## 0.50.0 (2026-04-23)
|
|
4
37
|
|
|
5
38
|
Full Changelog: [v0.49.0...v0.50.0](https://github.com/mixedbread-ai/mixedbread-python/compare/v0.49.0...v0.50.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: mixedbread
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.52.0
|
|
4
4
|
Summary: The official Python library for the Mixedbread API
|
|
5
5
|
Project-URL: Homepage, https://github.com/mixedbread-ai/mixedbread-python
|
|
6
6
|
Project-URL: Repository, https://github.com/mixedbread-ai/mixedbread-python
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Shared Types
|
|
2
2
|
|
|
3
3
|
```python
|
|
4
|
-
from mixedbread.types import
|
|
4
|
+
from mixedbread.types import SearchFilterCondition, Usage
|
|
5
5
|
```
|
|
6
6
|
|
|
7
7
|
# Mixedbread
|
|
@@ -54,6 +54,7 @@ from mixedbread.types import (
|
|
|
54
54
|
VideoChunkGeneratedMetadata,
|
|
55
55
|
VideoURL,
|
|
56
56
|
StoreDeleteResponse,
|
|
57
|
+
StoreGrepResponse,
|
|
57
58
|
StoreMetadataFacetsResponse,
|
|
58
59
|
StoreQuestionAnsweringResponse,
|
|
59
60
|
StoreSearchResponse,
|
|
@@ -67,6 +68,7 @@ Methods:
|
|
|
67
68
|
- <code title="put /v1/stores/{store_identifier}">client.stores.<a href="./src/mixedbread/resources/stores/stores.py">update</a>(store_identifier, \*\*<a href="src/mixedbread/types/store_update_params.py">params</a>) -> <a href="./src/mixedbread/types/store.py">Store</a></code>
|
|
68
69
|
- <code title="get /v1/stores">client.stores.<a href="./src/mixedbread/resources/stores/stores.py">list</a>(\*\*<a href="src/mixedbread/types/store_list_params.py">params</a>) -> <a href="./src/mixedbread/types/store.py">SyncCursor[Store]</a></code>
|
|
69
70
|
- <code title="delete /v1/stores/{store_identifier}">client.stores.<a href="./src/mixedbread/resources/stores/stores.py">delete</a>(store_identifier) -> <a href="./src/mixedbread/types/store_delete_response.py">StoreDeleteResponse</a></code>
|
|
71
|
+
- <code title="post /v1/stores/grep">client.stores.<a href="./src/mixedbread/resources/stores/stores.py">grep</a>(\*\*<a href="src/mixedbread/types/store_grep_params.py">params</a>) -> <a href="./src/mixedbread/types/store_grep_response.py">StoreGrepResponse</a></code>
|
|
70
72
|
- <code title="post /v1/stores/metadata-facets">client.stores.<a href="./src/mixedbread/resources/stores/stores.py">metadata_facets</a>(\*\*<a href="src/mixedbread/types/store_metadata_facets_params.py">params</a>) -> <a href="./src/mixedbread/types/store_metadata_facets_response.py">StoreMetadataFacetsResponse</a></code>
|
|
71
73
|
- <code title="post /v1/stores/question-answering">client.stores.<a href="./src/mixedbread/resources/stores/stores.py">question_answering</a>(\*\*<a href="src/mixedbread/types/store_question_answering_params.py">params</a>) -> <a href="./src/mixedbread/types/store_question_answering_response.py">StoreQuestionAnsweringResponse</a></code>
|
|
72
74
|
- <code title="post /v1/stores/search">client.stores.<a href="./src/mixedbread/resources/stores/stores.py">search</a>(\*\*<a href="src/mixedbread/types/store_search_params.py">params</a>) -> <a href="./src/mixedbread/types/store_search_response.py">StoreSearchResponse</a></code>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mixedbread"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.52.0"
|
|
4
4
|
description = "The official Python library for the Mixedbread API"
|
|
5
5
|
dynamic = ["readme"]
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -168,7 +168,7 @@ show_error_codes = true
|
|
|
168
168
|
#
|
|
169
169
|
# We also exclude our `tests` as mypy doesn't always infer
|
|
170
170
|
# types correctly and Pyright will still catch any type errors.
|
|
171
|
-
exclude = [
|
|
171
|
+
exclude = ["src/mixedbread/_files.py", "_dev/.*.py", "tests/.*"]
|
|
172
172
|
|
|
173
173
|
strict_equality = true
|
|
174
174
|
implicit_reexport = true
|
|
@@ -27,6 +27,7 @@ from ._types import (
|
|
|
27
27
|
)
|
|
28
28
|
from ._utils import (
|
|
29
29
|
is_given,
|
|
30
|
+
is_mapping_t,
|
|
30
31
|
maybe_transform,
|
|
31
32
|
get_async_library,
|
|
32
33
|
async_maybe_transform,
|
|
@@ -150,6 +151,15 @@ class Mixedbread(SyncAPIClient):
|
|
|
150
151
|
except KeyError as exc:
|
|
151
152
|
raise ValueError(f"Unknown environment: {environment}") from exc
|
|
152
153
|
|
|
154
|
+
custom_headers_env = os.environ.get("MIXEDBREAD_CUSTOM_HEADERS")
|
|
155
|
+
if custom_headers_env is not None:
|
|
156
|
+
parsed: dict[str, str] = {}
|
|
157
|
+
for line in custom_headers_env.split("\n"):
|
|
158
|
+
colon = line.find(":")
|
|
159
|
+
if colon >= 0:
|
|
160
|
+
parsed[line[:colon].strip()] = line[colon + 1 :].strip()
|
|
161
|
+
default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
|
|
162
|
+
|
|
153
163
|
super().__init__(
|
|
154
164
|
version=__version__,
|
|
155
165
|
base_url=base_url,
|
|
@@ -547,6 +557,15 @@ class AsyncMixedbread(AsyncAPIClient):
|
|
|
547
557
|
except KeyError as exc:
|
|
548
558
|
raise ValueError(f"Unknown environment: {environment}") from exc
|
|
549
559
|
|
|
560
|
+
custom_headers_env = os.environ.get("MIXEDBREAD_CUSTOM_HEADERS")
|
|
561
|
+
if custom_headers_env is not None:
|
|
562
|
+
parsed: dict[str, str] = {}
|
|
563
|
+
for line in custom_headers_env.split("\n"):
|
|
564
|
+
colon = line.find(":")
|
|
565
|
+
if colon >= 0:
|
|
566
|
+
parsed[line[:colon].strip()] = line[colon + 1 :].strip()
|
|
567
|
+
default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
|
|
568
|
+
|
|
550
569
|
super().__init__(
|
|
551
570
|
version=__version__,
|
|
552
571
|
base_url=base_url,
|
|
@@ -99,7 +99,7 @@ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles
|
|
|
99
99
|
elif is_sequence_t(files):
|
|
100
100
|
files = [(key, await _async_transform_file(file)) for key, file in files]
|
|
101
101
|
else:
|
|
102
|
-
raise TypeError("Unexpected file type input {type(files)}, expected mapping or sequence")
|
|
102
|
+
raise TypeError(f"Unexpected file type input {type(files)}, expected mapping or sequence")
|
|
103
103
|
|
|
104
104
|
return files
|
|
105
105
|
|
|
@@ -25,7 +25,9 @@ from typing_extensions import (
|
|
|
25
25
|
ClassVar,
|
|
26
26
|
Protocol,
|
|
27
27
|
Required,
|
|
28
|
+
Annotated,
|
|
28
29
|
ParamSpec,
|
|
30
|
+
TypeAlias,
|
|
29
31
|
TypedDict,
|
|
30
32
|
TypeGuard,
|
|
31
33
|
final,
|
|
@@ -79,7 +81,15 @@ from ._compat import (
|
|
|
79
81
|
from ._constants import RAW_RESPONSE_HEADER
|
|
80
82
|
|
|
81
83
|
if TYPE_CHECKING:
|
|
84
|
+
from pydantic import GetCoreSchemaHandler, ValidatorFunctionWrapHandler
|
|
85
|
+
from pydantic_core import CoreSchema, core_schema
|
|
82
86
|
from pydantic_core.core_schema import ModelField, ModelSchema, LiteralSchema, ModelFieldsSchema
|
|
87
|
+
else:
|
|
88
|
+
try:
|
|
89
|
+
from pydantic_core import CoreSchema, core_schema
|
|
90
|
+
except ImportError:
|
|
91
|
+
CoreSchema = None
|
|
92
|
+
core_schema = None
|
|
83
93
|
|
|
84
94
|
__all__ = ["BaseModel", "GenericModel"]
|
|
85
95
|
|
|
@@ -396,6 +406,76 @@ class BaseModel(pydantic.BaseModel):
|
|
|
396
406
|
)
|
|
397
407
|
|
|
398
408
|
|
|
409
|
+
class _EagerIterable(list[_T], Generic[_T]):
|
|
410
|
+
"""
|
|
411
|
+
Accepts any Iterable[T] input (including generators), consumes it
|
|
412
|
+
eagerly, and validates all items upfront.
|
|
413
|
+
|
|
414
|
+
Validation preserves the original container type where possible
|
|
415
|
+
(e.g. a set[T] stays a set[T]). Serialization (model_dump / JSON)
|
|
416
|
+
always emits a list — round-tripping through model_dump() will not
|
|
417
|
+
restore the original container type.
|
|
418
|
+
"""
|
|
419
|
+
|
|
420
|
+
@classmethod
|
|
421
|
+
def __get_pydantic_core_schema__(
|
|
422
|
+
cls,
|
|
423
|
+
source_type: Any,
|
|
424
|
+
handler: GetCoreSchemaHandler,
|
|
425
|
+
) -> CoreSchema:
|
|
426
|
+
(item_type,) = get_args(source_type) or (Any,)
|
|
427
|
+
item_schema: CoreSchema = handler.generate_schema(item_type)
|
|
428
|
+
list_of_items_schema: CoreSchema = core_schema.list_schema(item_schema)
|
|
429
|
+
|
|
430
|
+
return core_schema.no_info_wrap_validator_function(
|
|
431
|
+
cls._validate,
|
|
432
|
+
list_of_items_schema,
|
|
433
|
+
serialization=core_schema.plain_serializer_function_ser_schema(
|
|
434
|
+
cls._serialize,
|
|
435
|
+
info_arg=False,
|
|
436
|
+
),
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
@staticmethod
|
|
440
|
+
def _validate(v: Iterable[_T], handler: "ValidatorFunctionWrapHandler") -> Any:
|
|
441
|
+
original_type: type[Any] = type(v)
|
|
442
|
+
|
|
443
|
+
# Normalize to list so list_schema can validate each item
|
|
444
|
+
if isinstance(v, list):
|
|
445
|
+
items: list[_T] = v
|
|
446
|
+
else:
|
|
447
|
+
try:
|
|
448
|
+
items = list(v)
|
|
449
|
+
except TypeError as e:
|
|
450
|
+
raise TypeError("Value is not iterable") from e
|
|
451
|
+
|
|
452
|
+
# Validate items against the inner schema
|
|
453
|
+
validated: list[_T] = handler(items)
|
|
454
|
+
|
|
455
|
+
# Reconstruct original container type
|
|
456
|
+
if original_type is list:
|
|
457
|
+
return validated
|
|
458
|
+
# str(list) produces the list's repr, not a string built from items,
|
|
459
|
+
# so skip reconstruction for str and its subclasses.
|
|
460
|
+
if issubclass(original_type, str):
|
|
461
|
+
return validated
|
|
462
|
+
try:
|
|
463
|
+
return original_type(validated)
|
|
464
|
+
except (TypeError, ValueError):
|
|
465
|
+
# If the type cannot be reconstructed, just return the validated list
|
|
466
|
+
return validated
|
|
467
|
+
|
|
468
|
+
@staticmethod
|
|
469
|
+
def _serialize(v: Iterable[_T]) -> list[_T]:
|
|
470
|
+
"""Always serialize as a list so Pydantic's JSON encoder is happy."""
|
|
471
|
+
if isinstance(v, list):
|
|
472
|
+
return v
|
|
473
|
+
return list(v)
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
EagerIterable: TypeAlias = Annotated[Iterable[_T], _EagerIterable]
|
|
477
|
+
|
|
478
|
+
|
|
399
479
|
def _construct_field(value: object, field: FieldInfo, key: str) -> object:
|
|
400
480
|
if value is None:
|
|
401
481
|
return field_get_default(field)
|
|
@@ -2,17 +2,13 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Any, List, Tuple, Union, Mapping, TypeVar
|
|
4
4
|
from urllib.parse import parse_qs, urlencode
|
|
5
|
-
from typing_extensions import
|
|
5
|
+
from typing_extensions import get_args
|
|
6
6
|
|
|
7
|
-
from ._types import NotGiven, not_given
|
|
7
|
+
from ._types import NotGiven, ArrayFormat, NestedFormat, not_given
|
|
8
8
|
from ._utils import flatten
|
|
9
9
|
|
|
10
10
|
_T = TypeVar("_T")
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
|
|
14
|
-
NestedFormat = Literal["dots", "brackets"]
|
|
15
|
-
|
|
16
12
|
PrimitiveData = Union[str, int, float, bool, None]
|
|
17
13
|
# this should be Data = Union[PrimitiveData, "List[Data]", "Tuple[Data]", "Mapping[str, Data]"]
|
|
18
14
|
# https://github.com/microsoft/pyright/issues/3555
|
|
@@ -47,6 +47,9 @@ AnyMapping = Mapping[str, object]
|
|
|
47
47
|
ModelT = TypeVar("ModelT", bound=pydantic.BaseModel)
|
|
48
48
|
_T = TypeVar("_T")
|
|
49
49
|
|
|
50
|
+
ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
|
|
51
|
+
NestedFormat = Literal["dots", "brackets"]
|
|
52
|
+
|
|
50
53
|
|
|
51
54
|
# Approximates httpx internal ProxiesTypes and RequestFiles types
|
|
52
55
|
# while adding support for `PathLike` instances
|
|
@@ -17,11 +17,11 @@ from typing import (
|
|
|
17
17
|
)
|
|
18
18
|
from pathlib import Path
|
|
19
19
|
from datetime import date, datetime
|
|
20
|
-
from typing_extensions import TypeGuard
|
|
20
|
+
from typing_extensions import TypeGuard, get_args
|
|
21
21
|
|
|
22
22
|
import sniffio
|
|
23
23
|
|
|
24
|
-
from .._types import Omit, NotGiven, FileTypes, HeadersLike
|
|
24
|
+
from .._types import Omit, NotGiven, FileTypes, ArrayFormat, HeadersLike
|
|
25
25
|
|
|
26
26
|
_T = TypeVar("_T")
|
|
27
27
|
_TupleT = TypeVar("_TupleT", bound=Tuple[object, ...])
|
|
@@ -40,25 +40,45 @@ def extract_files(
|
|
|
40
40
|
query: Mapping[str, object],
|
|
41
41
|
*,
|
|
42
42
|
paths: Sequence[Sequence[str]],
|
|
43
|
+
array_format: ArrayFormat = "brackets",
|
|
43
44
|
) -> list[tuple[str, FileTypes]]:
|
|
44
45
|
"""Recursively extract files from the given dictionary based on specified paths.
|
|
45
46
|
|
|
46
47
|
A path may look like this ['foo', 'files', '<array>', 'data'].
|
|
47
48
|
|
|
49
|
+
``array_format`` controls how ``<array>`` segments contribute to the emitted
|
|
50
|
+
field name. Supported values: ``"brackets"`` (``foo[]``), ``"repeat"`` and
|
|
51
|
+
``"comma"`` (``foo``), ``"indices"`` (``foo[0]``, ``foo[1]``).
|
|
52
|
+
|
|
48
53
|
Note: this mutates the given dictionary.
|
|
49
54
|
"""
|
|
50
55
|
files: list[tuple[str, FileTypes]] = []
|
|
51
56
|
for path in paths:
|
|
52
|
-
files.extend(_extract_items(query, path, index=0, flattened_key=None))
|
|
57
|
+
files.extend(_extract_items(query, path, index=0, flattened_key=None, array_format=array_format))
|
|
53
58
|
return files
|
|
54
59
|
|
|
55
60
|
|
|
61
|
+
def _array_suffix(array_format: ArrayFormat, array_index: int) -> str:
|
|
62
|
+
if array_format == "brackets":
|
|
63
|
+
return "[]"
|
|
64
|
+
if array_format == "indices":
|
|
65
|
+
return f"[{array_index}]"
|
|
66
|
+
if array_format == "repeat" or array_format == "comma":
|
|
67
|
+
# Both repeat the bare field name for each file part; there is no
|
|
68
|
+
# meaningful way to comma-join binary parts.
|
|
69
|
+
return ""
|
|
70
|
+
raise NotImplementedError(
|
|
71
|
+
f"Unknown array_format value: {array_format}, choose from {', '.join(get_args(ArrayFormat))}"
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
56
75
|
def _extract_items(
|
|
57
76
|
obj: object,
|
|
58
77
|
path: Sequence[str],
|
|
59
78
|
*,
|
|
60
79
|
index: int,
|
|
61
80
|
flattened_key: str | None,
|
|
81
|
+
array_format: ArrayFormat,
|
|
62
82
|
) -> list[tuple[str, FileTypes]]:
|
|
63
83
|
try:
|
|
64
84
|
key = path[index]
|
|
@@ -75,9 +95,11 @@ def _extract_items(
|
|
|
75
95
|
|
|
76
96
|
if is_list(obj):
|
|
77
97
|
files: list[tuple[str, FileTypes]] = []
|
|
78
|
-
for entry in obj:
|
|
79
|
-
|
|
80
|
-
|
|
98
|
+
for array_index, entry in enumerate(obj):
|
|
99
|
+
suffix = _array_suffix(array_format, array_index)
|
|
100
|
+
emitted_key = (flattened_key + suffix) if flattened_key else suffix
|
|
101
|
+
assert_is_file_content(entry, key=emitted_key)
|
|
102
|
+
files.append((emitted_key, cast(FileTypes, entry)))
|
|
81
103
|
return files
|
|
82
104
|
|
|
83
105
|
assert_is_file_content(obj, key=flattened_key)
|
|
@@ -106,6 +128,7 @@ def _extract_items(
|
|
|
106
128
|
path,
|
|
107
129
|
index=index,
|
|
108
130
|
flattened_key=flattened_key,
|
|
131
|
+
array_format=array_format,
|
|
109
132
|
)
|
|
110
133
|
elif is_list(obj):
|
|
111
134
|
if key != "<array>":
|
|
@@ -117,9 +140,12 @@ def _extract_items(
|
|
|
117
140
|
item,
|
|
118
141
|
path,
|
|
119
142
|
index=index,
|
|
120
|
-
flattened_key=
|
|
143
|
+
flattened_key=(
|
|
144
|
+
(flattened_key if flattened_key is not None else "") + _array_suffix(array_format, array_index)
|
|
145
|
+
),
|
|
146
|
+
array_format=array_format,
|
|
121
147
|
)
|
|
122
|
-
for item in obj
|
|
148
|
+
for array_index, item in enumerate(obj)
|
|
123
149
|
]
|
|
124
150
|
)
|
|
125
151
|
|