pyrelukko 0.1.0__py3-none-any.whl → 0.2.0__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 pyrelukko might be problematic. Click here for more details.

pyrelukko/pyrelukko.py CHANGED
@@ -2,22 +2,20 @@
2
2
  TBD
3
3
  """
4
4
  import asyncio
5
+ import json
5
6
  import logging
6
7
  import os
7
- import json
8
- import threading
9
8
  import ssl
9
+ import threading
10
10
  import time
11
-
12
11
  from datetime import datetime
13
- from typing import Dict, List, Union
14
12
  from pathlib import Path
15
- from urllib3.util import Url, parse_url
16
- from urllib3.util.retry import Retry
13
+ from typing import Dict, List, Union
17
14
 
18
15
  import requests
16
+ from urllib3.util import Url, parse_url
17
+ from urllib3.util.retry import Retry
19
18
  from websockets import ConnectionClosed as WsConnectionClosed
20
-
21
19
  from websockets.asyncio.client import connect as ws_connect
22
20
 
23
21
  from .retry import retry
@@ -30,6 +28,14 @@ SSL_KWARGS = [
30
28
  'options',
31
29
  ]
32
30
 
31
+ RETRY_KWARGS = [
32
+ 'tries',
33
+ 'delay',
34
+ 'backoff',
35
+ 'max_delay',
36
+ 'exceptions'
37
+ ]
38
+
33
39
  logger = logging.getLogger(__name__)
34
40
 
35
41
 
@@ -50,12 +56,21 @@ class RelukkoClient:
50
56
  """
51
57
  self.session = requests.Session()
52
58
  self.api_key = api_key
59
+ self.tries=4
60
+ self.delay=5
61
+ self.backoff=2.0
62
+ self.max_delay=None
63
+ self.exceptions = (
64
+ requests.ConnectionError,
65
+ RelukkoDoRetry,
66
+ )
53
67
  self._setup_session(api_key, **kwargs)
54
68
  self._setup_http_adapters_retry(**kwargs)
69
+ self._setup_pyrelukko_retry(**kwargs)
55
70
 
56
71
  self.base_url = self._setup_base_url(base_url)
57
72
  self.ws_url = self._setup_ws_url(str(self.base_url))
58
- self.ssl_ctx = None
73
+ self.ssl_ctx: ssl.SSLContext = None
59
74
  self._setup_ssl_ctx(**kwargs)
60
75
 
61
76
  # event for websocket thread to signal it got a message
@@ -75,6 +90,15 @@ class RelukkoClient:
75
90
  self.base_url = self._setup_base_url(base_url or self.base_url)
76
91
  self.ws_url = self._setup_ws_url(str(self.base_url))
77
92
  self._setup_ssl_ctx(**kwargs)
93
+ self._setup_pyrelukko_retry(**kwargs)
94
+
95
+ def _setup_pyrelukko_retry(self, **kwargs):
96
+ for kwarg in RETRY_KWARGS:
97
+ setattr(
98
+ self,
99
+ kwarg,
100
+ kwargs.get(kwarg, getattr(self, kwarg))
101
+ )
78
102
 
79
103
  def _setup_http_adapters_retry(self, **kwargs):
80
104
  for _, http_adapter in self.session.adapters.items():
@@ -85,7 +109,7 @@ class RelukkoClient:
85
109
  http_adapter.max_retries = http_retry
86
110
 
87
111
  def _setup_session(self, api_key: str, **kwargs):
88
- self.session.headers = {'X-api-Key': api_key}
112
+ self.session.headers['X-api-Key'] = api_key
89
113
  for key, value in kwargs.items():
90
114
  if hasattr(self.session, key):
91
115
  setattr(self.session, key, value)
@@ -116,7 +140,7 @@ class RelukkoClient:
116
140
 
117
141
  # values from kwargs take precedence env vars
118
142
  ca_file = kwargs.get('cafile', ca_bundle_file)
119
- ca_path = kwargs.get('capath', ca_bundle_path)
143
+ ca_path = kwargs.get('capath', f"{ca_bundle_path}/")
120
144
  ca_data = kwargs.get('cadata')
121
145
 
122
146
  if ca_file or ca_path or ca_data:
@@ -196,7 +220,7 @@ class RelukkoClient:
196
220
 
197
221
  def _check_response(self, response: requests.Response):
198
222
  match response.status_code:
199
- case 200 | 201 | 404:
223
+ case 200 | 201 | 404 | 422:
200
224
  return response.json()
201
225
  case 400 | 403:
202
226
  err = response.json()
@@ -207,10 +231,12 @@ class RelukkoClient:
207
231
  logger.info(err.get('status'), err.get('message'))
208
232
  return None
209
233
  case 500 | 502 | 503 | 504:
210
- logger.warning(response.status_code, response.text)
234
+ logger.warning("[%d](%s) %s",
235
+ response.status_code, response.reason, response.text)
211
236
  raise RelukkoDoRetry()
212
237
  case _:
213
- logger.warning(response.status_code, response.text)
238
+ logger.warning("[%d](%s) %s",
239
+ response.status_code, response.reason, response.text)
214
240
  raise RuntimeError()
215
241
 
216
242
  def _make_request(
@@ -219,12 +245,10 @@ class RelukkoClient:
219
245
  method: str,
220
246
  payload: Dict=None) -> requests.Response:
221
247
 
222
- excpetions = (
223
- requests.ConnectionError,
224
- RelukkoDoRetry,
225
- )
226
248
 
227
- @retry(logger, exceptions=excpetions, delay=10)
249
+ @retry(logger, exceptions=self.exceptions, tries=self.tries,
250
+ delay=self.delay, backoff=self.backoff,
251
+ max_delay=self.max_delay)
228
252
  def _do_request():
229
253
  response = self.session.request(
230
254
  method=method,
@@ -274,13 +298,14 @@ class RelukkoClient:
274
298
  url = f"{self.base_url}/v1/locks/"
275
299
  return self._make_request(url, "GET")
276
300
 
277
- def update_relukko(self, lock_id: str, creator: str, expires_at: datetime):
301
+ def update_relukko(
302
+ self, lock_id: str, creator: str=None, expires_at: datetime=None):
278
303
  """
279
304
  TBD
280
305
  """
281
306
  if isinstance(expires_at, datetime):
282
307
  expires_at = expires_at.isoformat()
283
- else:
308
+ elif expires_at is not None:
284
309
  raise ValueError("has to be datetime!")
285
310
 
286
311
  payload = {
@@ -288,7 +313,7 @@ class RelukkoClient:
288
313
  "expires_at": expires_at,
289
314
  }
290
315
  url = f"{self.base_url}/v1/locks/{lock_id}"
291
- return self._make_request(url, "POST", payload)
316
+ return self._make_request(url, "PUT", payload)
292
317
 
293
318
  def delete_relukko(self, lock_id: str):
294
319
  """
pyrelukko/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  # pylint: disable=all
2
- __version__ = "0.1.0"
2
+ __version__ = "0.2.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyrelukko
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Relukko client.
5
5
  Author-email: Reto Zingg <g.d0b3rm4n@gmail.com>
6
6
  Requires-Python: >=3.12
@@ -0,0 +1,8 @@
1
+ pyrelukko/__init__.py,sha256=n-mTJV7AOfr4bljtDxok3E3gXIBRk-kFa2_Ql3S8Ht0,61
2
+ pyrelukko/pyrelukko.py,sha256=5bDqueUMxbMSxbuSOE9L7aHpAP3bax4DHQqATeuHs1s,11435
3
+ pyrelukko/retry.py,sha256=XeCc0trPhAggdEnu2nwtpFderlHaDQFTXH_O1dLeiGQ,1587
4
+ pyrelukko/version.py,sha256=5ajVDlNTAW-Ykqh9HwJkug5LWeNtanZQhZox4hNtxio,44
5
+ pyrelukko-0.2.0.dist-info/LICENSE,sha256=aEI4dThWmRUiEPch0-KaZQmHZgTyuz88Edmp25H6tAw,1089
6
+ pyrelukko-0.2.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
7
+ pyrelukko-0.2.0.dist-info/METADATA,sha256=0tOto4sHXUD_sFAfTvC6EhV2l4NER-gNyYE66ori8TQ,701
8
+ pyrelukko-0.2.0.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- pyrelukko/__init__.py,sha256=n-mTJV7AOfr4bljtDxok3E3gXIBRk-kFa2_Ql3S8Ht0,61
2
- pyrelukko/pyrelukko.py,sha256=xW97JA3Za7cg0K0P8cu134sDs7i-wM75vB-Wh1CkWqw,10646
3
- pyrelukko/retry.py,sha256=XeCc0trPhAggdEnu2nwtpFderlHaDQFTXH_O1dLeiGQ,1587
4
- pyrelukko/version.py,sha256=AaOhlz8bhe74XhrpzHuwnyjVm0cDxwlXlZGQ3Qvzs0o,44
5
- pyrelukko-0.1.0.dist-info/LICENSE,sha256=aEI4dThWmRUiEPch0-KaZQmHZgTyuz88Edmp25H6tAw,1089
6
- pyrelukko-0.1.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
7
- pyrelukko-0.1.0.dist-info/METADATA,sha256=G7uhJSin6c3wyWUj5HSdcOyP9pCfIoco_P2Ulw0WY9o,701
8
- pyrelukko-0.1.0.dist-info/RECORD,,