meilisearch-python-sdk 7.2.2__tar.gz → 7.3.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.
Files changed (111) hide show
  1. meilisearch_python_sdk-7.3.0/.github/release-draft-template.yaml +24 -0
  2. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.github/workflows/docs_publish.yml +2 -2
  3. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.github/workflows/nightly_testing.yml +2 -2
  4. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.github/workflows/pypi_publish.yml +2 -2
  5. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.github/workflows/testing.yml +13 -13
  6. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.pre-commit-config.yaml +3 -3
  7. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/PKG-INFO +1 -1
  8. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docker-compose.https.yml +1 -1
  9. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docker-compose.yml +1 -1
  10. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_client/_common.py +3 -0
  11. meilisearch_python_sdk-7.3.0/meilisearch_python_sdk/_version.py +1 -0
  12. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/errors.py +8 -1
  13. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/index/_common.py +7 -1
  14. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/index/async_index.py +89 -0
  15. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/index/index.py +84 -0
  16. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/search.py +5 -0
  17. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/settings.py +6 -0
  18. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/pyproject.toml +7 -8
  19. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/conftest.py +9 -0
  20. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_async_index.py +43 -0
  21. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_errors.py +20 -0
  22. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_index.py +43 -0
  23. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/uv.lock +200 -215
  24. meilisearch_python_sdk-7.2.2/.github/release-draft-template.yaml +0 -30
  25. meilisearch_python_sdk-7.2.2/meilisearch_python_sdk/_version.py +0 -1
  26. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.github/FUNDING.yml +0 -0
  27. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.github/renovate.json5 +0 -0
  28. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.github/workflows/release-drafter.yml +0 -0
  29. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/.gitignore +0 -0
  30. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/CONTRIBUTING.md +0 -0
  31. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/LICENSE +0 -0
  32. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/README.md +0 -0
  33. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/assets/add_in_batches.png +0 -0
  34. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/assets/searches.png +0 -0
  35. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/codecov.yml +0 -0
  36. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/datasets/small_movies.json +0 -0
  37. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/.nojekyll +0 -0
  38. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/CNAME +0 -0
  39. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/async_client_api.md +0 -0
  40. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/async_index_api.md +0 -0
  41. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/client_api.md +0 -0
  42. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/css/custom.css +0 -0
  43. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/decorators_api.md +0 -0
  44. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/index.md +0 -0
  45. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/index_api.md +0 -0
  46. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/js/umami.js +0 -0
  47. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/json_handler.md +0 -0
  48. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/overrides/partials/footer.html +0 -0
  49. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/plugins.md +0 -0
  50. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/docs/pydantic.md +0 -0
  51. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/.gitignore +0 -0
  52. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/README.md +0 -0
  53. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/__init__.py +0 -0
  54. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/add_documents_decorator.py +0 -0
  55. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/add_documents_in_batches.py +0 -0
  56. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/async_add_documents_decorator.py +0 -0
  57. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/async_add_documents_in_batches.py +0 -0
  58. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/async_documents_and_search_results.py +0 -0
  59. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/async_search_tracker.py +0 -0
  60. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/async_update_settings.py +0 -0
  61. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/documents_and_search_results.py +0 -0
  62. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/fastapi_example.py +0 -0
  63. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/orjson_example.py +0 -0
  64. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/pyproject.toml +0 -0
  65. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/requirements.txt +0 -0
  66. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/search_tracker.py +0 -0
  67. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/tests/__init__.py +0 -0
  68. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/tests/conftest.py +0 -0
  69. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/tests/test_async_examples.py +0 -0
  70. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/tests/test_examples.py +0 -0
  71. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/examples/update_settings.py +0 -0
  72. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/justfile +0 -0
  73. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/__init__.py +0 -0
  74. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_batch.py +0 -0
  75. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_client/__init__.py +0 -0
  76. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_client/_async_client.py +0 -0
  77. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_client/_base_client.py +0 -0
  78. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_client/_client.py +0 -0
  79. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_http_requests.py +0 -0
  80. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_task.py +0 -0
  81. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/_utils.py +0 -0
  82. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/decorators.py +0 -0
  83. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/index/__init__.py +0 -0
  84. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/json_handler.py +0 -0
  85. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/__init__.py +0 -0
  86. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/batch.py +0 -0
  87. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/client.py +0 -0
  88. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/documents.py +0 -0
  89. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/health.py +0 -0
  90. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/index.py +0 -0
  91. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/task.py +0 -0
  92. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/version.py +0 -0
  93. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/models/webhook.py +0 -0
  94. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/plugins.py +0 -0
  95. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/py.typed +0 -0
  96. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/meilisearch_python_sdk/types.py +0 -0
  97. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/mkdocs.yaml +0 -0
  98. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/__init__.py +0 -0
  99. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_async_client.py +0 -0
  100. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_async_documents.py +0 -0
  101. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_async_index_plugins.py +0 -0
  102. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_async_search.py +0 -0
  103. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_client.py +0 -0
  104. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_decorators.py +0 -0
  105. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_documents.py +0 -0
  106. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_http_requests.py +0 -0
  107. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_index_plugins.py +0 -0
  108. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_search.py +0 -0
  109. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_settings_models.py +0 -0
  110. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_utils.py +0 -0
  111. {meilisearch_python_sdk-7.2.2 → meilisearch_python_sdk-7.3.0}/tests/test_version.py +0 -0
@@ -0,0 +1,24 @@
1
+ name-template: "v$RESOLVED_VERSION"
2
+ tag-template: "v$RESOLVED_VERSION"
3
+ categories:
4
+ - type: "pre-exclude"
5
+ when:
6
+ labels:
7
+ - "dependencies"
8
+ - "skip-changelog"
9
+ - title: "⚠️ Breaking changes"
10
+ semver-increment: "major"
11
+ when:
12
+ label: "breaking-change"
13
+ - title: "Features"
14
+ semver-increment: "minor"
15
+ when:
16
+ label: "enhancement"
17
+ - title: "Bug Fixes"
18
+ when:
19
+ label: "bug"
20
+ change-template: "- $TITLE @$AUTHOR (#$NUMBER)"
21
+ template: |
22
+ ## Changes
23
+
24
+ $CHANGES
@@ -14,9 +14,9 @@ jobs:
14
14
  runs-on: ubuntu-latest
15
15
  environment: github-pages
16
16
  steps:
17
- - uses: actions/checkout@v6
17
+ - uses: actions/checkout@v7
18
18
  - name: Install uv
19
- uses: astral-sh/setup-uv@v8.2.0
19
+ uses: astral-sh/setup-uv@v8.3.2
20
20
  with:
21
21
  enable-cache: true
22
22
  - name: Set up Python
@@ -12,9 +12,9 @@ jobs:
12
12
  fail-fast: false
13
13
  runs-on: ubuntu-latest
14
14
  steps:
15
- - uses: actions/checkout@v6
15
+ - uses: actions/checkout@v7
16
16
  - name: Install uv
17
- uses: astral-sh/setup-uv@v8.2.0
17
+ uses: astral-sh/setup-uv@v8.3.2
18
18
  with:
19
19
  enable-cache: true
20
20
  - name: install Just
@@ -12,9 +12,9 @@ jobs:
12
12
  # For PyPI's trusted publishing.
13
13
  id-token: write
14
14
  steps:
15
- - uses: actions/checkout@v6
15
+ - uses: actions/checkout@v7
16
16
  - name: Install uv
17
- uses: astral-sh/setup-uv@v8.2.0
17
+ uses: astral-sh/setup-uv@v8.3.2
18
18
  with:
19
19
  enable-cache: true
20
20
  - name: Set up Python
@@ -11,11 +11,11 @@ jobs:
11
11
  linting:
12
12
  runs-on: ubuntu-latest
13
13
  steps:
14
- - uses: actions/checkout@v6
14
+ - uses: actions/checkout@v7
15
15
  - name: install Just
16
16
  uses: taiki-e/install-action@just
17
17
  - name: Install uv
18
- uses: astral-sh/setup-uv@v8.2.0
18
+ uses: astral-sh/setup-uv@v8.3.2
19
19
  with:
20
20
  enable-cache: true
21
21
  - name: Set up Python
@@ -35,11 +35,11 @@ jobs:
35
35
  python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15-dev"]
36
36
  runs-on: ubuntu-latest
37
37
  steps:
38
- - uses: actions/checkout@v6
38
+ - uses: actions/checkout@v7
39
39
  - name: install Just
40
40
  uses: taiki-e/install-action@just
41
41
  - name: Install uv
42
- uses: astral-sh/setup-uv@v8.2.0
42
+ uses: astral-sh/setup-uv@v8.3.2
43
43
  with:
44
44
  enable-cache: true
45
45
  - name: Set up Python ${{ matrix.python-version }}
@@ -65,11 +65,11 @@ jobs:
65
65
  python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15-dev"]
66
66
  runs-on: ubuntu-latest
67
67
  steps:
68
- - uses: actions/checkout@v6
68
+ - uses: actions/checkout@v7
69
69
  - name: install Just
70
70
  uses: taiki-e/install-action@just
71
71
  - name: Install uv
72
- uses: astral-sh/setup-uv@v8.2.0
72
+ uses: astral-sh/setup-uv@v8.3.2
73
73
  with:
74
74
  enable-cache: true
75
75
  - name: Set up Python ${{ matrix.python-version }}
@@ -106,11 +106,11 @@ jobs:
106
106
  python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15-dev"]
107
107
  runs-on: ubuntu-latest
108
108
  steps:
109
- - uses: actions/checkout@v6
109
+ - uses: actions/checkout@v7
110
110
  - name: install Just
111
111
  uses: taiki-e/install-action@just
112
112
  - name: Install uv
113
- uses: astral-sh/setup-uv@v8.2.0
113
+ uses: astral-sh/setup-uv@v8.3.2
114
114
  with:
115
115
  enable-cache: true
116
116
  - name: Set up Python ${{ matrix.python-version }}
@@ -136,11 +136,11 @@ jobs:
136
136
  python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15-dev"]
137
137
  runs-on: ubuntu-latest
138
138
  steps:
139
- - uses: actions/checkout@v6
139
+ - uses: actions/checkout@v7
140
140
  - name: install Just
141
141
  uses: taiki-e/install-action@just
142
142
  - name: Install uv
143
- uses: astral-sh/setup-uv@v8.2.0
143
+ uses: astral-sh/setup-uv@v8.3.2
144
144
  with:
145
145
  enable-cache: true
146
146
  - name: Set up Python ${{ matrix.python-version }}
@@ -176,7 +176,7 @@ jobs:
176
176
  python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15-dev"]
177
177
  runs-on: ubuntu-latest
178
178
  steps:
179
- - uses: actions/checkout@v6
179
+ - uses: actions/checkout@v7
180
180
  - name: install Just
181
181
  uses: taiki-e/install-action@just
182
182
  - name: Set up Python ${{ matrix.python-version }}
@@ -191,11 +191,11 @@ jobs:
191
191
  docs:
192
192
  runs-on: ubuntu-latest
193
193
  steps:
194
- - uses: actions/checkout@v6
194
+ - uses: actions/checkout@v7
195
195
  - name: install Just
196
196
  uses: taiki-e/install-action@just
197
197
  - name: Install uv
198
- uses: astral-sh/setup-uv@v8.2.0
198
+ uses: astral-sh/setup-uv@v8.3.2
199
199
  with:
200
200
  enable-cache: true
201
201
  - name: Set up Python
@@ -12,7 +12,7 @@ repos:
12
12
  - id: end-of-file-fixer
13
13
  - id: trailing-whitespace
14
14
  - repo: https://github.com/facebook/pyrefly-pre-commit
15
- rev: 1.1.0
15
+ rev: 1.1.1
16
16
  hooks:
17
17
  - id: pyrefly-check
18
18
  name: pyrefly
@@ -20,11 +20,11 @@ repos:
20
20
  language: system
21
21
  entry: uv run pyrefly check
22
22
  - repo: https://github.com/astral-sh/ruff-pre-commit
23
- rev: v0.15.17
23
+ rev: v0.15.21
24
24
  hooks:
25
25
  - id: ruff-check
26
26
  args: [--fix, --exit-non-zero-on-fix]
27
27
  - repo: https://github.com/rvben/rumdl-pre-commit
28
- rev: v0.2.18
28
+ rev: v0.2.32
29
29
  hooks:
30
30
  - id: rumdl-fmt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meilisearch-python-sdk
3
- Version: 7.2.2
3
+ Version: 7.3.0
4
4
  Summary: A Python client providing both async and sync support for the Meilisearch API
5
5
  Project-URL: repository, https://github.com/sanders41/meilisearch-python-sdk
6
6
  Project-URL: homepage, https://github.com/sanders41/meilisearch-python-sdk
@@ -1,6 +1,6 @@
1
1
  services:
2
2
  meilisearch:
3
- image: getmeili/meilisearch:v1.47.0
3
+ image: getmeili/meilisearch:v1.49.0
4
4
  ports:
5
5
  - "7700:7700"
6
6
  environment:
@@ -1,6 +1,6 @@
1
1
  services:
2
2
  meilisearch:
3
- image: getmeili/meilisearch:v1.47.0
3
+ image: getmeili/meilisearch:v1.49.0
4
4
  ports:
5
5
  - "7700:7700"
6
6
  environment:
@@ -41,6 +41,9 @@ def build_multi_search_payload(
41
41
  if query.show_performance_details is None:
42
42
  del q["showPerformanceDetails"]
43
43
 
44
+ if query.personalize is None:
45
+ del q["personalize"]
46
+
44
47
  processed_queries.append(q)
45
48
 
46
49
  if federation:
@@ -0,0 +1 @@
1
+ VERSION = "7.3.0"
@@ -1,3 +1,5 @@
1
+ import json
2
+
1
3
  from httpx2 import Response
2
4
 
3
5
 
@@ -35,8 +37,13 @@ class MeilisearchApiError(MeilisearchError):
35
37
  self.message = ""
36
38
  self.link = ""
37
39
  self.error_type = ""
40
+ error_json = None
38
41
  if response.content:
39
- error_json = response.json()
42
+ try:
43
+ error_json = response.json()
44
+ except json.JSONDecodeError:
45
+ error_json = None
46
+ if isinstance(error_json, dict):
40
47
  self.message = f"Error message: {error_json.get('message') or ''}"
41
48
  self.code = f"{error_json.get('code') or ''}"
42
49
  self.error_type = f"{error_json.get('type') or ''}"
@@ -11,7 +11,7 @@ from pydantic import TypeAdapter
11
11
 
12
12
  from meilisearch_python_sdk.errors import MeilisearchError
13
13
  from meilisearch_python_sdk.json_handler import BuiltinHandler, OrjsonHandler
14
- from meilisearch_python_sdk.models.search import Hybrid
14
+ from meilisearch_python_sdk.models.search import Hybrid, Personalize
15
15
  from meilisearch_python_sdk.models.settings import (
16
16
  CompositeEmbedder,
17
17
  Embedders,
@@ -153,6 +153,7 @@ def process_search_parameters(
153
153
  exhaustive_facet_count: bool | None = None,
154
154
  media: JsonMapping | None = None,
155
155
  show_performance_details: bool = False,
156
+ personalize: Personalize | None = None,
156
157
  ) -> JsonDict:
157
158
  if attributes_to_retrieve is None:
158
159
  attributes_to_retrieve = ["*"]
@@ -213,6 +214,11 @@ def process_search_parameters(
213
214
  if show_performance_details:
214
215
  body["showPerformanceDetails"] = True
215
216
 
217
+ # no cover becuse personlized search requires an api key and any mocked test here would be
218
+ # pointless
219
+ if personalize is not None: # pragma: no cover
220
+ body["personalize"] = personalize.model_dump(by_alias=True)
221
+
216
222
  return body
217
223
 
218
224
 
@@ -36,6 +36,7 @@ from meilisearch_python_sdk.models.index import Field, FieldResults, FieldsFilte
36
36
  from meilisearch_python_sdk.models.search import (
37
37
  FacetSearchResults,
38
38
  Hybrid,
39
+ Personalize,
39
40
  SearchResults,
40
41
  SimilarSearchResults,
41
42
  )
@@ -44,6 +45,7 @@ from meilisearch_python_sdk.models.settings import (
44
45
  Faceting,
45
46
  FilterableAttributeFeatures,
46
47
  FilterableAttributes,
48
+ ForeignKey,
47
49
  LocalizedAttributes,
48
50
  MeilisearchSettings,
49
51
  Pagination,
@@ -593,6 +595,7 @@ class AsyncIndex(BaseIndex):
593
595
  retrieve_vectors: bool | None = None,
594
596
  media: JsonMapping | None = None,
595
597
  show_performance_details: bool = False,
598
+ personalize: Personalize | None = None,
596
599
  ) -> SearchResults:
597
600
  """Search the index.
598
601
 
@@ -663,6 +666,7 @@ class AsyncIndex(BaseIndex):
663
666
  without a major version bump so use with caution.
664
667
  show_performance_details: When set to true, the search response contains a performance
665
668
  trace. Default False.
669
+ personalize: Personalize the search results.
666
670
 
667
671
  Returns:
668
672
  Results of the search
@@ -709,6 +713,7 @@ class AsyncIndex(BaseIndex):
709
713
  retrieve_vectors=retrieve_vectors,
710
714
  media=media,
711
715
  show_performance_details=show_performance_details,
716
+ personalize=personalize,
712
717
  )
713
718
  search_url = f"{self._base_url_with_uid}/search"
714
719
 
@@ -739,6 +744,7 @@ class AsyncIndex(BaseIndex):
739
744
  show_ranking_score_details=show_ranking_score_details,
740
745
  vector=vector,
741
746
  hybrid=hybrid,
747
+ personalize=personalize,
742
748
  )
743
749
 
744
750
  if self._concurrent_search_plugins:
@@ -771,6 +777,7 @@ class AsyncIndex(BaseIndex):
771
777
  show_ranking_score=show_ranking_score,
772
778
  show_ranking_score_details=show_ranking_score_details,
773
779
  vector=vector,
780
+ personalize=personalize,
774
781
  )
775
782
  )
776
783
 
@@ -815,6 +822,7 @@ class AsyncIndex(BaseIndex):
815
822
  show_ranking_score=show_ranking_score,
816
823
  show_ranking_score_details=show_ranking_score_details,
817
824
  vector=vector,
825
+ personalize=personalize,
818
826
  )
819
827
  )
820
828
 
@@ -872,6 +880,7 @@ class AsyncIndex(BaseIndex):
872
880
  vector: list[float] | None = None,
873
881
  locales: list[str] | None = None,
874
882
  retrieve_vectors: bool | None = None,
883
+ personalize: Personalize | None = None,
875
884
  exhaustive_facet_count: bool | None = None,
876
885
  ) -> FacetSearchResults:
877
886
  """Search the index.
@@ -926,6 +935,7 @@ class AsyncIndex(BaseIndex):
926
935
  locales: Specifies the languages for the search. This parameter can only be used with
927
936
  Milisearch >= v1.10.0. Defaults to None letting the Meilisearch pick.
928
937
  retrieve_vectors: Return document vector data with search result.
938
+ personalize: Personalize the search results.
929
939
  exhaustive_facet_count: forcing the facet search to compute the facet counts the same
930
940
  way as the paginated search. This parameter can only be used with Milisearch >=
931
941
  v1.14.0. Defaults to None.
@@ -977,6 +987,7 @@ class AsyncIndex(BaseIndex):
977
987
  vector=vector,
978
988
  locales=locales,
979
989
  retrieve_vectors=retrieve_vectors,
990
+ personalize=personalize,
980
991
  exhaustive_facet_count=exhaustive_facet_count,
981
992
  )
982
993
  search_url = f"{self._base_url_with_uid}/facet-search"
@@ -1008,6 +1019,7 @@ class AsyncIndex(BaseIndex):
1008
1019
  ranking_score_threshold=ranking_score_threshold,
1009
1020
  vector=vector,
1010
1021
  exhaustive_facet_count=exhaustive_facet_count,
1022
+ personalize=personalize,
1011
1023
  )
1012
1024
 
1013
1025
  if self._concurrent_facet_search_plugins:
@@ -1041,6 +1053,7 @@ class AsyncIndex(BaseIndex):
1041
1053
  ranking_score_threshold=ranking_score_threshold,
1042
1054
  vector=vector,
1043
1055
  exhaustive_facet_count=exhaustive_facet_count,
1056
+ personalize=personalize,
1044
1057
  )
1045
1058
  )
1046
1059
 
@@ -1085,6 +1098,7 @@ class AsyncIndex(BaseIndex):
1085
1098
  ranking_score_threshold=ranking_score_threshold,
1086
1099
  vector=vector,
1087
1100
  exhaustive_facet_count=exhaustive_facet_count,
1101
+ personalize=personalize,
1088
1102
  )
1089
1103
  )
1090
1104
 
@@ -4665,6 +4679,81 @@ class AsyncIndex(BaseIndex):
4665
4679
 
4666
4680
  return TaskInfo(**self._http_requests.parse_json(response))
4667
4681
 
4682
+ async def get_foreign_keys(self) -> list[ForeignKey]:
4683
+ """Get foreign keys for the index.
4684
+
4685
+ Returns:
4686
+ A list of the foreign keys
4687
+
4688
+ Raises:
4689
+ MeilisearchCommunicationError: If there was an error communicating with the server.
4690
+ MeilisearchApiError: If the Meilisearch API returned an error.
4691
+
4692
+ Examples:
4693
+ >>> from meilisearch_async_client import AsyncClient
4694
+ >>> async with AsyncClient("http://localhost.com", "masterKey") as client:
4695
+ >>> index = await client.index("movies")
4696
+ >>> foreign_keys = await index.get_foreign_keys()
4697
+ """
4698
+ response = await self._http_requests.get(f"{self._settings_url}/foreign-keys")
4699
+ foreign_keys = self._http_requests.parse_json(response)
4700
+
4701
+ return [ForeignKey(**foreign_key) for foreign_key in foreign_keys]
4702
+
4703
+ async def update_foreign_keys(
4704
+ self,
4705
+ foreign_keys: Sequence[ForeignKey],
4706
+ *,
4707
+ compress: bool = False,
4708
+ ) -> TaskInfo:
4709
+ """Update setting for foreign key.
4710
+
4711
+ Args:
4712
+ foreign_keys: List of foreign keys.
4713
+ compress: If set to True the data will be sent in gzip format. Defaults to False.
4714
+
4715
+ Returns:
4716
+ The details of the task status.
4717
+
4718
+ Raises:
4719
+ MeilisearchCommunicationError: If there was an error communicating with the server.
4720
+ MeilisearchApiError: If the Meilisearch API returned an error.
4721
+
4722
+ Examples:
4723
+ >>> from meilisearch_python_sdk import AsyncClient
4724
+ >>> from meilisearch_python_sdk.models.settings import ForeignKey
4725
+ >>> async with AsyncClient("http://localhost.com", "masterKey") as client:
4726
+ >>> index = await client.index("movies")
4727
+ >>> await index.update_foreign_keys([ForeignKey(foreign_index_uid="title", field_name="title")])
4728
+ """
4729
+ response = await self._http_requests.put(
4730
+ f"{self._settings_url}/foreign-keys",
4731
+ [foreign_key.model_dump(by_alias=True) for foreign_key in foreign_keys],
4732
+ compress=compress,
4733
+ )
4734
+
4735
+ return TaskInfo(**self._http_requests.parse_json(response))
4736
+
4737
+ async def reset_foreign_keys(self) -> TaskInfo:
4738
+ """Reset the foreign keys setting.
4739
+
4740
+ Returns:
4741
+ The details of the task status.
4742
+
4743
+ Raises:
4744
+ MeilisearchCommunicationError: If there was an error communicating with the server.
4745
+ MeilisearchApiError: If the Meilisearch API returned an error.
4746
+
4747
+ Examples:
4748
+ >>> from meilisearch_async_client import AsyncClient
4749
+ >>> async with AsyncClient("http://localhost.com", "masterKey") as client:
4750
+ >>> index = await client.index("movies")
4751
+ >>> await index.reset_foreign_keys()
4752
+ """
4753
+ response = await self._http_requests.delete(f"{self._settings_url}/foreign-keys")
4754
+
4755
+ return TaskInfo(**self._http_requests.parse_json(response))
4756
+
4668
4757
  async def fields(
4669
4758
  self, offset: int = 0, limit: int = 20, filter: FieldsFilter | None = None
4670
4759
  ) -> FieldResults:
@@ -33,6 +33,7 @@ from meilisearch_python_sdk.models.index import Field, FieldResults, FieldsFilte
33
33
  from meilisearch_python_sdk.models.search import (
34
34
  FacetSearchResults,
35
35
  Hybrid,
36
+ Personalize,
36
37
  SearchResults,
37
38
  SimilarSearchResults,
38
39
  )
@@ -41,6 +42,7 @@ from meilisearch_python_sdk.models.settings import (
41
42
  Faceting,
42
43
  FilterableAttributeFeatures,
43
44
  FilterableAttributes,
45
+ ForeignKey,
44
46
  LocalizedAttributes,
45
47
  MeilisearchSettings,
46
48
  Pagination,
@@ -531,6 +533,7 @@ class Index(BaseIndex):
531
533
  retrieve_vectors: bool | None = None,
532
534
  media: JsonMapping | None = None,
533
535
  show_performance_details: bool = False,
536
+ personalize: Personalize | None = None,
534
537
  ) -> SearchResults:
535
538
  """Search the index.
536
539
 
@@ -601,6 +604,7 @@ class Index(BaseIndex):
601
604
  without a major version bump so use with caution.
602
605
  show_performance_details: When set to true, the search response contains a performance
603
606
  trace. Default False.
607
+ personalize: Personalize the search results.
604
608
 
605
609
  Returns:
606
610
  Results of the search
@@ -647,6 +651,7 @@ class Index(BaseIndex):
647
651
  retrieve_vectors=retrieve_vectors,
648
652
  media=media,
649
653
  show_performance_details=show_performance_details,
654
+ personalize=personalize,
650
655
  )
651
656
 
652
657
  if self._pre_search_plugins:
@@ -676,6 +681,7 @@ class Index(BaseIndex):
676
681
  show_ranking_score_details=show_ranking_score_details,
677
682
  vector=vector,
678
683
  hybrid=hybrid,
684
+ personalize=personalize,
679
685
  )
680
686
 
681
687
  response = self._http_requests.post(f"{self._base_url_with_uid}/search", body=body)
@@ -716,6 +722,7 @@ class Index(BaseIndex):
716
722
  vector: list[float] | None = None,
717
723
  locales: list[str] | None = None,
718
724
  retrieve_vectors: bool | None = None,
725
+ personalize: Personalize | None = None,
719
726
  exhaustive_facet_count: bool | None = None,
720
727
  ) -> FacetSearchResults:
721
728
  """Search the index.
@@ -773,6 +780,7 @@ class Index(BaseIndex):
773
780
  exhaustive_facet_count: forcing the facet search to compute the facet counts the same
774
781
  way as the paginated search. This parameter can only be used with Milisearch >=
775
782
  v1.14.0. Defaults to None.
783
+ personalize: Personalize the search results.
776
784
 
777
785
  Returns:
778
786
  Results of the search
@@ -821,6 +829,7 @@ class Index(BaseIndex):
821
829
  vector=vector,
822
830
  locales=locales,
823
831
  retrieve_vectors=retrieve_vectors,
832
+ personalize=personalize,
824
833
  exhaustive_facet_count=exhaustive_facet_count,
825
834
  )
826
835
 
@@ -850,6 +859,7 @@ class Index(BaseIndex):
850
859
  show_ranking_score_details=show_ranking_score_details,
851
860
  ranking_score_threshold=ranking_score_threshold,
852
861
  vector=vector,
862
+ personalize=personalize,
853
863
  exhaustive_facet_count=exhaustive_facet_count,
854
864
  )
855
865
 
@@ -3716,6 +3726,80 @@ class Index(BaseIndex):
3716
3726
 
3717
3727
  return TaskInfo(**self._http_requests.parse_json(response))
3718
3728
 
3729
+ def get_foreign_keys(self) -> list[ForeignKey]:
3730
+ """Get foreign keys for the index.
3731
+
3732
+ Returns:
3733
+ A list of the foreign keys
3734
+
3735
+ Raises:
3736
+ MeilisearchCommunicationError: If there was an error communicating with the server.
3737
+ MeilisearchApiError: If the Meilisearch API returned an error.
3738
+
3739
+ Examples:
3740
+ >>> from meilisearch_async_client import AsyncClient
3741
+ >>> with Client("http://localhost.com", "masterKey") as client:
3742
+ >>> index = client.index("movies")
3743
+ >>> foreign_keys = index.get_foreign_keys()
3744
+ """
3745
+ response = self._http_requests.get(f"{self._settings_url}/foreign-keys")
3746
+ foreign_keys = self._http_requests.parse_json(response)
3747
+
3748
+ return [ForeignKey(**foreign_key) for foreign_key in foreign_keys]
3749
+
3750
+ def update_foreign_keys(
3751
+ self,
3752
+ foreign_keys: Sequence[ForeignKey],
3753
+ *,
3754
+ compress: bool = False,
3755
+ ) -> TaskInfo:
3756
+ """Update setting for foreign key.
3757
+
3758
+ Args:
3759
+ foreign_keys: List of foreign keys.
3760
+ compress: If set to True the data will be sent in gzip format. Defaults to False.
3761
+
3762
+ Returns:
3763
+ The details of the task status.
3764
+
3765
+ Raises:
3766
+ MeilisearchCommunicationError: If there was an error communicating with the server.
3767
+ MeilisearchApiError: If the Meilisearch API returned an error.
3768
+
3769
+ Examples:
3770
+ >>> from meilisearch_python_sdk import AsyncClient
3771
+ >>> with Client("http://localhost.com", "masterKey") as client:
3772
+ >>> index = client.index("movies")
3773
+ >>> index.update_foreign_keys([ForeignKey(foreign_index_uid="title", field_name="title")])
3774
+ """
3775
+ response = self._http_requests.put(
3776
+ f"{self._settings_url}/foreign-keys",
3777
+ [foreign_key.model_dump(by_alias=True) for foreign_key in foreign_keys],
3778
+ compress=compress,
3779
+ )
3780
+
3781
+ return TaskInfo(**self._http_requests.parse_json(response))
3782
+
3783
+ def reset_foreign_keys(self) -> TaskInfo:
3784
+ """Reset the foreign keys setting.
3785
+
3786
+ Returns:
3787
+ The details of the task status.
3788
+
3789
+ Raises:
3790
+ MeilisearchCommunicationError: If there was an error communicating with the server.
3791
+ MeilisearchApiError: If the Meilisearch API returned an error.
3792
+
3793
+ Examples:
3794
+ >>> from meilisearch_async_client import AsyncClient
3795
+ >>> with Client("http://localhost.com", "masterKey") as client:
3796
+ >>> index = client.index("movies")
3797
+ >>> index.reset_foreign_keys()
3798
+ """
3799
+ response = self._http_requests.delete(f"{self._settings_url}/foreign-keys")
3800
+
3801
+ return TaskInfo(**self._http_requests.parse_json(response))
3802
+
3719
3803
  def fields(
3720
3804
  self, offset: int = 0, limit: int = 20, filter: FieldsFilter | None = None
3721
3805
  ) -> FieldResults:
@@ -46,6 +46,10 @@ class FederationOptions(CamelBase):
46
46
  weight: float
47
47
 
48
48
 
49
+ class Personalize(CamelBase):
50
+ user_context: str
51
+
52
+
49
53
  class SearchParams(CamelBase):
50
54
  index_uid: str
51
55
  query: str | None = Field(None, alias="q")
@@ -76,6 +80,7 @@ class SearchParams(CamelBase):
76
80
  retrieve_vectors: bool | None = None
77
81
  media: JsonMapping | None = None
78
82
  show_performance_details: bool | None = None
83
+ personalize: Personalize | None = None
79
84
 
80
85
  @field_validator("ranking_score_threshold", mode="before") # type: ignore[attr-defined]
81
86
  @classmethod
@@ -163,6 +163,11 @@ class FilterableAttributes(CamelBase):
163
163
  features: FilterableAttributeFeatures
164
164
 
165
165
 
166
+ class ForeignKey(CamelBase):
167
+ foreign_index_uid: str
168
+ field_name: str
169
+
170
+
166
171
  class MeilisearchSettings(CamelBase):
167
172
  synonyms: JsonDict | None = None
168
173
  stop_words: list[str] | None = None
@@ -195,3 +200,4 @@ class MeilisearchSettings(CamelBase):
195
200
  localized_attributes: list[LocalizedAttributes] | None = None
196
201
  facet_search: bool | None = None
197
202
  prefix_search: Literal["disabled", "indexingTime", "searchTime"] | None = None
203
+ foreign_keys: list[ForeignKey] | None = None