b24api 0.2.0__tar.gz → 0.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.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: b24api
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Bitrix24 API
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -10,6 +10,7 @@ Requires-Dist: httpx[http2]>=0.28.1
10
10
  Requires-Dist: pydantic>=2.10.6
11
11
  Requires-Dist: pydantic-settings>=2.8.1
12
12
  Requires-Dist: retry>=0.9.2
13
+ Dynamic: license-file
13
14
 
14
15
  # API client for Bitrix24
15
16
 
@@ -51,6 +52,7 @@ print(list(result))
51
52
  ## Gathering full list (faster)
52
53
  Applicable to list methods with `start=<offset>` support.
53
54
  Fetches first list chunk with regular call, then fetches other chunks with `batch`.
55
+ Approximately 3 times faster then `list_sequential`.
54
56
 
55
57
  ```python
56
58
  from b24api import Bitrix24
@@ -63,6 +65,7 @@ print(list(result))
63
65
  ## Gathering full list (fastest)
64
66
  Applicable to list methods with `filter={<parameters>}` support.
65
67
  Fetches first and last list chunk with batch call, then fetches other chunks with `batch`. Doesn't use counting (`start=-1`).
68
+ Approximately 2 times faster then `list_batched`.
66
69
 
67
70
  ```python
68
71
  from b24api import Bitrix24
@@ -38,6 +38,7 @@ print(list(result))
38
38
  ## Gathering full list (faster)
39
39
  Applicable to list methods with `start=<offset>` support.
40
40
  Fetches first list chunk with regular call, then fetches other chunks with `batch`.
41
+ Approximately 3 times faster then `list_sequential`.
41
42
 
42
43
  ```python
43
44
  from b24api import Bitrix24
@@ -50,6 +51,7 @@ print(list(result))
50
51
  ## Gathering full list (fastest)
51
52
  Applicable to list methods with `filter={<parameters>}` support.
52
53
  Fetches first and last list chunk with batch call, then fetches other chunks with `batch`. Doesn't use counting (`start=-1`).
54
+ Approximately 2 times faster then `list_batched`.
53
55
 
54
56
  ```python
55
57
  from b24api import Bitrix24
@@ -1,4 +1,5 @@
1
1
  import contextlib
2
+ import json
2
3
  import logging
3
4
  from collections.abc import Generator, Iterable
4
5
  from itertools import chain, islice
@@ -20,7 +21,7 @@ class Bitrix24:
20
21
  def __init__(self, client: HttpxClient, settings: ApiSettings) -> None:
21
22
  self.client = client
22
23
  self.settings = settings
23
- self.logger = logging.getLogger(__name__)
24
+ self.logger = logging.getLogger("b24api")
24
25
  self._call_retry = retry(
25
26
  exceptions=(RetryHTTPStatusError, RetryApiResponseError),
26
27
  tries=self.settings.retry_tries,
@@ -47,6 +48,9 @@ class Bitrix24:
47
48
  json=request.model_dump()["parameters"],
48
49
  )
49
50
 
51
+ with contextlib.suppress(httpx.ResponseNotRead, json.JSONDecodeError, ValidationError):
52
+ ErrorResponse.model_validate(http_response.json()).raise_error(self.settings.retry_errors)
53
+
50
54
  try:
51
55
  json_response = http_response.raise_for_status().json()
52
56
  except httpx.HTTPStatusError as error:
@@ -102,10 +106,6 @@ class Bitrix24:
102
106
 
103
107
  result = self.call(request)
104
108
 
105
- for fix_key in ["result_error", "result_total", "result_next"]:
106
- if isinstance(result[fix_key], list) and not result[fix_key]:
107
- result[fix_key] = dict(result[fix_key])
108
-
109
109
  result = BatchResult.model_validate(result)
110
110
 
111
111
  for i in range(len(commands)):
@@ -252,7 +252,7 @@ class Bitrix24:
252
252
  body_request.parameters.filter[id_to] = min(start + list_size + 1, min_tail_id)
253
253
  yield body_request
254
254
 
255
- if max_head_id < min_tail_id:
255
+ if max_head_id and min_tail_id and max_head_id < min_tail_id:
256
256
  body = self.batch(_body_requests(), batch_size)
257
257
  body = map(self._fix_list_result, body)
258
258
  body = chain.from_iterable(body)
@@ -1,7 +1,7 @@
1
1
  from datetime import datetime
2
- from typing import Self
2
+ from typing import Annotated, Any, Self
3
3
 
4
- from pydantic import BaseModel
4
+ from pydantic import BaseModel, BeforeValidator
5
5
 
6
6
  from b24api.error import ApiResponseError, RetryApiResponseError
7
7
  from b24api.query import build_query
@@ -46,7 +46,7 @@ class ErrorResponse(BaseModel):
46
46
  """API error response."""
47
47
 
48
48
  error: str
49
- error_description: str | None = None
49
+ error_description: str
50
50
 
51
51
  def raise_error(self, retry_errors: list[str]) -> Self:
52
52
  if self.error in retry_errors:
@@ -82,11 +82,17 @@ class Response(BaseModel):
82
82
  next: int | None = None
83
83
 
84
84
 
85
+ def _php_dict(value: Any) -> Any: # noqa: ANN401
86
+ if isinstance(value, list) and not value:
87
+ return {}
88
+ return value
89
+
90
+
85
91
  class BatchResult(BaseModel):
86
92
  """API response `result` structure for `batch` method."""
87
93
 
88
- result: dict[str, ApiTypes]
89
- result_time: dict[str, ResponseTime]
90
- result_error: dict[str, ErrorResponse]
91
- result_total: dict[str, int]
92
- result_next: dict[str, int]
94
+ result: Annotated[dict[str, ApiTypes], BeforeValidator(_php_dict)]
95
+ result_time: Annotated[dict[str, ResponseTime], BeforeValidator(_php_dict)]
96
+ result_error: Annotated[dict[str, ErrorResponse], BeforeValidator(_php_dict)]
97
+ result_total: Annotated[dict[str, int], BeforeValidator(_php_dict)]
98
+ result_next: Annotated[dict[str, int], BeforeValidator(_php_dict)]
@@ -14,7 +14,12 @@ class ApiResponseError(Exception):
14
14
  code: str,
15
15
  description: str | None,
16
16
  ) -> None:
17
- message = f"API error [{code}]: {description}"
17
+ if code and description:
18
+ message = f"API error [{code}]: {description}"
19
+ elif code:
20
+ message = f"API error [{code}]"
21
+ else:
22
+ message = f"API error: {description}"
18
23
  super().__init__(message)
19
24
 
20
25
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: b24api
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Bitrix24 API
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -10,6 +10,7 @@ Requires-Dist: httpx[http2]>=0.28.1
10
10
  Requires-Dist: pydantic>=2.10.6
11
11
  Requires-Dist: pydantic-settings>=2.8.1
12
12
  Requires-Dist: retry>=0.9.2
13
+ Dynamic: license-file
13
14
 
14
15
  # API client for Bitrix24
15
16
 
@@ -51,6 +52,7 @@ print(list(result))
51
52
  ## Gathering full list (faster)
52
53
  Applicable to list methods with `start=<offset>` support.
53
54
  Fetches first list chunk with regular call, then fetches other chunks with `batch`.
55
+ Approximately 3 times faster then `list_sequential`.
54
56
 
55
57
  ```python
56
58
  from b24api import Bitrix24
@@ -63,6 +65,7 @@ print(list(result))
63
65
  ## Gathering full list (fastest)
64
66
  Applicable to list methods with `filter={<parameters>}` support.
65
67
  Fetches first and last list chunk with batch call, then fetches other chunks with `batch`. Doesn't use counting (`start=-1`).
68
+ Approximately 2 times faster then `list_batched`.
66
69
 
67
70
  ```python
68
71
  from b24api import Bitrix24
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "b24api"
8
- version = "0.2.0"
8
+ version = "0.3.0"
9
9
  description = "Bitrix24 API"
10
10
  readme = "README.md"
11
11
  requires-python = ">=3.11"
@@ -19,11 +19,9 @@ dependencies = [
19
19
 
20
20
  [dependency-groups]
21
21
  dev = [
22
- "mypy>=1.15.0",
23
22
  "pytest-env>=1.1.5",
24
23
  "pytest-httpx>=0.35.0",
25
24
  "pytest-mock>=3.14.0",
26
- "ruff>=0.9.9",
27
25
  ]
28
26
 
29
27
  [tool.ruff]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes