castor-extractor 0.24.21__py3-none-any.whl → 0.24.22__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.

Potentially problematic release.


This version of castor-extractor might be problematic. Click here for more details.

CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.22 - 2025-05-27
4
+
5
+ * Add retry for `Request.Timeout` on **ApiClient**
6
+
3
7
  ## 0.24.21 - 2025-05-26
4
8
 
5
9
  * Looker Studio: add option to skip the extraction of view activity logs
@@ -1,14 +1,11 @@
1
1
  from http import HTTPStatus
2
2
  from typing import Iterator, Optional
3
3
 
4
- import requests
5
-
6
4
  from ....utils import (
7
5
  APIClient,
8
6
  BearerAuth,
9
7
  RequestSafeMode,
10
8
  SerializedAsset,
11
- retry,
12
9
  )
13
10
  from ..assets import CoalesceAsset, CoalesceQualityAsset
14
11
  from .credentials import CoalesceCredentials
@@ -20,9 +17,6 @@ from .utils import column_names_per_node, is_test, test_names_per_node
20
17
 
21
18
  _LIMIT_MAX = 1_000
22
19
  _MAX_ERRORS = 50
23
- _RETRY_BASE_MS = 10 * 60 * 1000 # 10 minutes
24
- _RETRY_COUNT = 2
25
- _RETRY_EXCEPTIONS = [requests.exceptions.ConnectTimeout]
26
20
 
27
21
 
28
22
  def _run_result_payload(result: dict, query_result: dict) -> dict:
@@ -75,11 +69,6 @@ class CoalesceClient(APIClient):
75
69
  result = self._get(endpoint=endpoint)
76
70
  return result["data"]
77
71
 
78
- @retry(
79
- exceptions=_RETRY_EXCEPTIONS,
80
- max_retries=_RETRY_COUNT,
81
- base_ms=_RETRY_BASE_MS,
82
- )
83
72
  def _node_details(self, environment_id: int, node_id: str) -> dict:
84
73
  endpoint = CoalesceEndpointFactory.nodes(
85
74
  environment_id=environment_id, node_id=node_id
@@ -5,7 +5,7 @@ from typing import Callable, Literal, Optional
5
5
  import requests
6
6
  from requests import Response
7
7
 
8
- from ...retry import retry_request
8
+ from ...retry import retry, retry_request
9
9
  from .auth import Auth
10
10
  from .safe_request import RequestSafeMode, handle_response
11
11
  from .utils import build_url
@@ -21,6 +21,10 @@ DEFAULT_TIMEOUT = 60
21
21
  RETRY_ON_EXPIRED_TOKEN = 1
22
22
  RETRY_ON_GATEWAY_TIMEOUT = 3
23
23
 
24
+ _TIMEOUT_RETRY_BASE_MS = 10 * 60 * 1000 # 10 minutes
25
+ _TIMEOUT_RETRY_COUNT = 2
26
+ _TIMEOUT_RETRY_EXCEPTIONS = (requests.exceptions.Timeout,)
27
+
24
28
 
25
29
  def _generate_payloads(
26
30
  method: HttpMethod,
@@ -72,6 +76,11 @@ class APIClient:
72
76
  self._auth = auth
73
77
  self._safe_mode = safe_mode
74
78
 
79
+ @retry(
80
+ exceptions=_TIMEOUT_RETRY_EXCEPTIONS,
81
+ max_retries=_TIMEOUT_RETRY_COUNT,
82
+ base_ms=_TIMEOUT_RETRY_BASE_MS,
83
+ )
75
84
  def _call(
76
85
  self,
77
86
  method: HttpMethod,
@@ -26,6 +26,15 @@ class RetryStrategy(Enum):
26
26
  DEFAULT_STRATEGY = RetryStrategy.CONSTANT
27
27
 
28
28
 
29
+ def _warning(callable: Callable, exception: BaseException) -> None:
30
+ exception_type = type(exception)
31
+ exception_path = f"{exception_type.__module__}.{exception_type.__name__}"
32
+ callable_path = f"{callable.__module__}.{callable.__name__}"
33
+
34
+ msg = f"Exception '{exception_path}' occurred within `{callable_path}`"
35
+ logger.warning(msg)
36
+
37
+
29
38
  class Retry(BaseModel):
30
39
  """
31
40
  This class checks if the retry conditions are met, and if so, how long to
@@ -96,7 +105,7 @@ def retry(
96
105
  try:
97
106
  return None, callable(*args, **kwargs)
98
107
  except exceptions_ as err:
99
- logger.warning(f"Exception within {callable.__name__}")
108
+ _warning(callable, err)
100
109
  return err, None
101
110
 
102
111
  def _func(*args, **kwargs) -> Any:
@@ -139,7 +148,7 @@ def retry_request(
139
148
  status_code = err.response.status_code
140
149
  if status_code not in exceptions_:
141
150
  raise err
142
- logger.warning(f"Exception within {callable.__name__}")
151
+ _warning(callable, err)
143
152
  return err, None
144
153
 
145
154
  def _func(*args, **kwargs) -> Any:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.24.21
3
+ Version: 0.24.22
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -215,6 +215,10 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
215
215
 
216
216
  # Changelog
217
217
 
218
+ ## 0.24.22 - 2025-05-27
219
+
220
+ * Add retry for `Request.Timeout` on **ApiClient**
221
+
218
222
  ## 0.24.21 - 2025-05-26
219
223
 
220
224
  * Looker Studio: add option to skip the extraction of view activity logs
@@ -1,4 +1,4 @@
1
- CHANGELOG.md,sha256=tja1IyeA0_DdgOOJLdH8WMTmSRucj5bnvR0G0tg_Nsk,17859
1
+ CHANGELOG.md,sha256=8EyATqcpMtcJ3LhQgQadRhcDiEULwOXYw40137Y5jgs,17936
2
2
  Dockerfile,sha256=xQ05-CFfGShT3oUqaiumaldwA288dj9Yb_pxofQpufg,301
3
3
  DockerfileUsage.md,sha256=2hkJQF-5JuuzfPZ7IOxgM6QgIQW7l-9oRMFVwyXC4gE,998
4
4
  LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
@@ -76,7 +76,7 @@ castor_extractor/transformation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
76
76
  castor_extractor/transformation/coalesce/__init__.py,sha256=CW_qdtEfwgJRsCyBlk5hNlxwEO-VV6mBXZvkRbND_J8,112
77
77
  castor_extractor/transformation/coalesce/assets.py,sha256=pzccYPP66c9PAnVroemx7-6MeRHw7Ft1OlTC6jIamAA,363
78
78
  castor_extractor/transformation/coalesce/client/__init__.py,sha256=VRmVpH29rOghtDQnCN7dAdA0dI0Lxseu4BC8rnwM9dU,80
79
- castor_extractor/transformation/coalesce/client/client.py,sha256=-fFxWtDPPruNmDPc6FXft_6RwRKEee4JM-13d90fms0,6442
79
+ castor_extractor/transformation/coalesce/client/client.py,sha256=o-BlVqdzcQ2RhrmShsNFXVhsmJF4i0pP6DmiWGAE2dY,6172
80
80
  castor_extractor/transformation/coalesce/client/credentials.py,sha256=jbJxjbdPspf-dzYKfeb7oqL_8TXd1nvkJrjAcdAnLPc,548
81
81
  castor_extractor/transformation/coalesce/client/endpoint.py,sha256=0uLh7dpA1vsR9qr_50SEYV_-heQE4BwED9oNMgYsL-w,1272
82
82
  castor_extractor/transformation/coalesce/client/type.py,sha256=oiiVP9NL0ijTXyQmaB8aJVYckc7m-m8ZgMyNIAduUKE,43
@@ -106,7 +106,7 @@ castor_extractor/utils/client/abstract.py,sha256=CWF7_afNpEZ3jor-22wXbKIvM20ukHk
106
106
  castor_extractor/utils/client/api/__init__.py,sha256=vlG7WXznYgLTn3XyMGsyUkgRkup8FbKM14EXJ8mv-b0,264
107
107
  castor_extractor/utils/client/api/auth.py,sha256=lq0K3UEl1vwIIa_vKTdlpIQPdE5K1-5DXmCwO4dKzng,1890
108
108
  castor_extractor/utils/client/api/auth_test.py,sha256=LlyXytnatg6ZzR4Zkvzk0BH99FYhHX7qn_nyr2MSnDI,1305
109
- castor_extractor/utils/client/api/client.py,sha256=d3I-RbKgy7dqONKj2hAuRxTr9i9U82RklIuRjnVppeM,4574
109
+ castor_extractor/utils/client/api/client.py,sha256=En1V9eglhB71q5jZwi5XhNZanLb7IUKfd4AT-sSexJk,4866
110
110
  castor_extractor/utils/client/api/client_test.py,sha256=FM3ZxsLLfMOBn44cXX6FIgnA31-5TTNIyp9D4LBwtXE,1222
111
111
  castor_extractor/utils/client/api/pagination.py,sha256=ph5TYqPiyFGgygsIhCATAHPIQ9UJNZyiTcqlyRdGEno,2460
112
112
  castor_extractor/utils/client/api/pagination_test.py,sha256=jCOgXFXrH-jrCxe2dfk80ZksJF-EtmpJPU11BGabsqk,1385
@@ -138,7 +138,7 @@ castor_extractor/utils/pager/pager.py,sha256=93Rw7jCz6GnqrS4HfYfKYV2xgEx2esl1qC9
138
138
  castor_extractor/utils/pager/pager_on_id.py,sha256=jBvmlEhkJ-sODkNyz1KyyXHobLsNhC4AwhOwYvLyB4E,1967
139
139
  castor_extractor/utils/pager/pager_on_id_test.py,sha256=eDGrIYPGffuKPUATgu5fiXIwPKdSwEXGgTtfMiHqoj0,1601
140
140
  castor_extractor/utils/pager/pager_test.py,sha256=PQOXQwQD2wOP0xzZfNTuLxcn3Bpa4FCASVklH71GO_s,1699
141
- castor_extractor/utils/retry.py,sha256=LvfBsE_R6g-U72hkN531rJDMj42zwkUqgIrrjlxctJs,4733
141
+ castor_extractor/utils/retry.py,sha256=xRlAxHRnjmjh2sDUuuUSS-s38pokoAvSgSKjdgWGqbc,5020
142
142
  castor_extractor/utils/retry_test.py,sha256=j_6IJStBomEhxmGpIY9IIlESgMxhcDpmIKj24unLqlA,2892
143
143
  castor_extractor/utils/safe.py,sha256=gvIMRIoggdVeYMl222IYqXnHVDninDklFMlAHt-WldA,1948
144
144
  castor_extractor/utils/safe_test.py,sha256=IHN1Z761tYMFslYC-2HAfkXmFPh4LYSqNLs4QZwykjk,2160
@@ -425,8 +425,8 @@ castor_extractor/warehouse/sqlserver/queries/table.sql,sha256=kbBQP-TdG5px1IVgyx
425
425
  castor_extractor/warehouse/sqlserver/queries/user.sql,sha256=gOrZsMVypusR2dc4vwVs4E1a-CliRsr_UjnD2EbXs-A,94
426
426
  castor_extractor/warehouse/sqlserver/query.py,sha256=g0hPT-RmeGi2DyenAi3o72cTlQsLToXIFYojqc8E5fQ,533
427
427
  castor_extractor/warehouse/synapse/queries/column.sql,sha256=lNcFoIW3Y0PFOqoOzJEXmPvZvfAsY0AP63Mu2LuPzPo,1351
428
- castor_extractor-0.24.21.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
429
- castor_extractor-0.24.21.dist-info/METADATA,sha256=Yg7Sgskg-uUeas31S1Uit1F7L1tPcVCLFy2U3rBlzIY,25312
430
- castor_extractor-0.24.21.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
431
- castor_extractor-0.24.21.dist-info/entry_points.txt,sha256=_F-qeZCybjoMkNb9ErEhnyqXuG6afHIFQhakdBHZsr4,1803
432
- castor_extractor-0.24.21.dist-info/RECORD,,
428
+ castor_extractor-0.24.22.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
429
+ castor_extractor-0.24.22.dist-info/METADATA,sha256=VTqwYHqBEng4wSZ5N88tT1z6Y2OdS9uETv4qIE3CZVw,25389
430
+ castor_extractor-0.24.22.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
431
+ castor_extractor-0.24.22.dist-info/entry_points.txt,sha256=_F-qeZCybjoMkNb9ErEhnyqXuG6afHIFQhakdBHZsr4,1803
432
+ castor_extractor-0.24.22.dist-info/RECORD,,