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 +4 -0
- castor_extractor/transformation/coalesce/client/client.py +0 -11
- castor_extractor/utils/client/api/client.py +10 -1
- castor_extractor/utils/retry.py +11 -2
- {castor_extractor-0.24.21.dist-info → castor_extractor-0.24.22.dist-info}/METADATA +5 -1
- {castor_extractor-0.24.21.dist-info → castor_extractor-0.24.22.dist-info}/RECORD +9 -9
- {castor_extractor-0.24.21.dist-info → castor_extractor-0.24.22.dist-info}/LICENCE +0 -0
- {castor_extractor-0.24.21.dist-info → castor_extractor-0.24.22.dist-info}/WHEEL +0 -0
- {castor_extractor-0.24.21.dist-info → castor_extractor-0.24.22.dist-info}/entry_points.txt +0 -0
CHANGELOG.md
CHANGED
|
@@ -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,
|
castor_extractor/utils/retry.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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.
|
|
429
|
-
castor_extractor-0.24.
|
|
430
|
-
castor_extractor-0.24.
|
|
431
|
-
castor_extractor-0.24.
|
|
432
|
-
castor_extractor-0.24.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|