Skip to content

Commit d8cb78b

Browse files
authored
Merge pull request #1066 from ellnix/task-refactoring
Refactor task model and params
2 parents e5d1bc3 + ef069de commit d8cb78b

File tree

5 files changed

+35
-51
lines changed

5 files changed

+35
-51
lines changed

meilisearch/index.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def get_stats(self) -> IndexStats:
276276
An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://www.meilisearch.com/docs/reference/errors/error_codes#meilisearch-errors
277277
"""
278278
stats = self.http.get(f"{self.config.paths.index}/{self.uid}/{self.config.paths.stat}")
279-
return IndexStats(stats)
279+
return IndexStats(**stats)
280280

281281
@version_error_hint_message
282282
def search(self, query: str, opt_params: Optional[Mapping[str, Any]] = None) -> Dict[str, Any]:
@@ -375,7 +375,7 @@ def get_document(
375375
"""
376376
if parameters is None:
377377
parameters = {}
378-
elif "fields" in parameters and isinstance(parameters["fields"], list):
378+
elif "fields" in parameters and isinstance(parameters["fields"], (list, tuple)):
379379
parameters["fields"] = ",".join(parameters["fields"])
380380

381381
document = self.http.get(

meilisearch/models/index.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,19 @@
33
from enum import Enum
44
from typing import Any, Dict, Iterator, List, Optional
55

6-
from camel_converter import to_snake
76
from camel_converter.pydantic_base import CamelBase
7+
from pydantic import ConfigDict, field_validator
88

99

10-
class IndexStats:
10+
class FieldDistribution:
1111
__dict: Dict
1212

13-
def __init__(self, doc: Dict[str, Any]) -> None:
14-
self.__dict = doc
15-
for key, val in doc.items():
16-
key = to_snake(key)
17-
if isinstance(val, dict):
18-
setattr(self, key, IndexStats(val))
19-
else:
20-
setattr(self, key, val)
13+
def __init__(self, dist: Dict[str, int]) -> None:
14+
self.__dict = dist
15+
for key in dist:
16+
setattr(self, key, dist[key])
2117

22-
def __getattr__(self, attr: str) -> Any:
18+
def __getattr__(self, attr: str) -> str:
2319
if attr in self.__dict.keys():
2420
return attr
2521
raise AttributeError(f"{self.__class__.__name__} object has no attribute {attr}")
@@ -28,6 +24,22 @@ def __iter__(self) -> Iterator:
2824
return iter(self.__dict__.items())
2925

3026

27+
class IndexStats(CamelBase):
28+
model_config = ConfigDict(arbitrary_types_allowed=True)
29+
30+
number_of_documents: int
31+
is_indexing: bool
32+
field_distribution: FieldDistribution
33+
34+
@field_validator("field_distribution", mode="before")
35+
@classmethod
36+
def build_field_distribution(cls, v: Any) -> FieldDistribution:
37+
if not isinstance(v, dict):
38+
raise TypeError('"field_distribution" in IndexStats must be a dict')
39+
40+
return FieldDistribution(v)
41+
42+
3143
class Faceting(CamelBase):
3244
max_values_per_facet: int
3345
sort_facet_values_by: Optional[Dict[str, str]] = None

meilisearch/models/task.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,12 @@ def validate_enqueued_at(cls, v: str) -> datetime: # pylint: disable=invalid-na
106106
return converted
107107

108108

109-
class TaskResults:
110-
def __init__(self, resp: Dict[str, Any]) -> None:
111-
self.results: List[Task] = [Task(**task) for task in resp["results"]]
112-
self.limit: int = resp["limit"]
113-
self.total: int = resp["total"]
114-
self.from_: int = resp["from"]
115-
self.next_: int = resp["next"]
109+
class TaskResults(CamelBase):
110+
results: List[Task]
111+
limit: int
112+
total: int
113+
from_: int
114+
next_: Optional[int]
116115

117116

118117
class Batch(CamelBase):

meilisearch/task.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ def get_tasks(self, parameters: Optional[MutableMapping[str, Any]] = None) -> Ta
9696
if parameters is None:
9797
parameters = {}
9898
for param in parameters:
99-
if isinstance(parameters[param], list):
99+
if isinstance(parameters[param], (list, tuple)):
100100
parameters[param] = ",".join(parameters[param])
101101
tasks = self.http.get(f"{self.config.paths.task}?{parse.urlencode(parameters)}")
102-
return TaskResults(tasks)
102+
return TaskResults(**tasks)
103103

104104
def get_task(self, uid: int) -> Task:
105105
"""Get one task.
@@ -142,7 +142,7 @@ def cancel_tasks(self, parameters: MutableMapping[str, Any]) -> TaskInfo:
142142
An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://www.meilisearch.com/docs/reference/errors/error_codes#meilisearch-errors
143143
"""
144144
for param in parameters:
145-
if isinstance(parameters[param], list):
145+
if isinstance(parameters[param], (list, tuple)):
146146
parameters[param] = ",".join(parameters[param])
147147
response = self.http.post(f"{self.config.paths.task}/cancel?{parse.urlencode(parameters)}")
148148
return TaskInfo(**response)
@@ -166,7 +166,7 @@ def delete_tasks(self, parameters: MutableMapping[str, Any]) -> TaskInfo:
166166
An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://www.meilisearch.com/docs/reference/errors/error_codes#meilisearch-errors
167167
"""
168168
for param in parameters:
169-
if isinstance(parameters[param], list):
169+
if isinstance(parameters[param], (list, tuple)):
170170
parameters[param] = ",".join(parameters[param])
171171
response = self.http.delete(f"{self.config.paths.task}?{parse.urlencode(parameters)}")
172172
return TaskInfo(**response)

tests/models/test_index.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)