apytizer 0.0.1a0__py3-none-any.whl → 0.0.1b1__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.
Files changed (76) hide show
  1. apytizer/__init__.py +2 -12
  2. apytizer/adapters/__init__.py +2 -3
  3. apytizer/adapters/transport_adapter.py +91 -0
  4. apytizer/apis/__init__.py +6 -0
  5. apytizer/apis/abstract_api.py +36 -0
  6. apytizer/apis/web_api.py +461 -0
  7. apytizer/connections/__init__.py +6 -0
  8. apytizer/connections/abstract_connection.py +28 -0
  9. apytizer/connections/http_connection.py +431 -0
  10. apytizer/decorators/__init__.py +5 -5
  11. apytizer/decorators/caching.py +60 -9
  12. apytizer/decorators/chunking.py +105 -0
  13. apytizer/decorators/connection.py +55 -20
  14. apytizer/decorators/json_response.py +93 -0
  15. apytizer/decorators/pagination.py +50 -32
  16. apytizer/endpoints/__init__.py +6 -0
  17. apytizer/endpoints/abstract_endpoint.py +38 -0
  18. apytizer/endpoints/web_endpoint.py +519 -0
  19. apytizer/engines/__init__.py +6 -0
  20. apytizer/engines/abstract_engine.py +45 -0
  21. apytizer/engines/http_engine.py +129 -0
  22. apytizer/errors.py +34 -0
  23. apytizer/factories/__init__.py +5 -0
  24. apytizer/factories/abstract_factory.py +17 -0
  25. apytizer/http_methods.py +34 -0
  26. apytizer/managers/__init__.py +12 -0
  27. apytizer/managers/abstract_manager.py +80 -0
  28. apytizer/managers/base_manager.py +116 -0
  29. apytizer/mappers/__init__.py +6 -0
  30. apytizer/mappers/abstract_mapper.py +48 -0
  31. apytizer/mappers/base_mapper.py +78 -0
  32. apytizer/media_types.py +118 -0
  33. apytizer/models/__init__.py +6 -0
  34. apytizer/models/abstract_model.py +119 -0
  35. apytizer/models/base_model.py +85 -0
  36. apytizer/protocols.py +38 -0
  37. apytizer/repositories/__init__.py +6 -0
  38. apytizer/repositories/abstract_repository.py +81 -0
  39. apytizer/repositories/managed_repository.py +92 -0
  40. apytizer/routes/__init__.py +6 -0
  41. apytizer/routes/abstract_route.py +32 -0
  42. apytizer/routes/base_route.py +138 -0
  43. apytizer/sessions/__init__.py +33 -0
  44. apytizer/sessions/abstract_session.py +63 -0
  45. apytizer/sessions/requests_session.py +125 -0
  46. apytizer/states/__init__.py +6 -0
  47. apytizer/states/abstract_state.py +71 -0
  48. apytizer/states/local_state.py +99 -0
  49. apytizer/utils/__init__.py +9 -4
  50. apytizer/utils/caching.py +39 -0
  51. apytizer/utils/dictionaries.py +375 -0
  52. apytizer/utils/errors.py +104 -0
  53. apytizer/utils/iterables.py +91 -0
  54. apytizer/utils/objects.py +145 -0
  55. apytizer/utils/strings.py +69 -0
  56. apytizer/utils/typing.py +29 -0
  57. apytizer-0.0.1b1.dist-info/METADATA +41 -0
  58. apytizer-0.0.1b1.dist-info/RECORD +60 -0
  59. {apytizer-0.0.1a0.dist-info → apytizer-0.0.1b1.dist-info}/WHEEL +1 -2
  60. apytizer/abstracts/__init__.py +0 -8
  61. apytizer/abstracts/api.py +0 -147
  62. apytizer/abstracts/endpoint.py +0 -177
  63. apytizer/abstracts/model.py +0 -50
  64. apytizer/abstracts/session.py +0 -39
  65. apytizer/adapters/transport.py +0 -40
  66. apytizer/base/__init__.py +0 -8
  67. apytizer/base/api.py +0 -510
  68. apytizer/base/endpoint.py +0 -443
  69. apytizer/base/model.py +0 -119
  70. apytizer/decorators/json.py +0 -35
  71. apytizer/utils/generate_key.py +0 -18
  72. apytizer/utils/merge.py +0 -19
  73. apytizer-0.0.1a0.dist-info/METADATA +0 -27
  74. apytizer-0.0.1a0.dist-info/RECORD +0 -25
  75. apytizer-0.0.1a0.dist-info/top_level.txt +0 -1
  76. {apytizer-0.0.1a0.dist-info → apytizer-0.0.1b1.dist-info/licenses}/LICENSE +0 -0
apytizer/base/api.py DELETED
@@ -1,510 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """Basic API class.
3
-
4
- This module defines a basic API class implementation.
5
-
6
- """
7
-
8
- # Standard Library Imports
9
- import logging
10
- from typing import Dict, MutableMapping, Tuple, Union, final
11
- from urllib.parse import urljoin
12
-
13
- # Third-Party Imports
14
- import requests
15
- from requests.adapters import HTTPAdapter
16
- from requests.auth import AuthBase
17
-
18
- # Local Imports
19
- from .. import abstracts
20
- from ..decorators.caching import cache_response
21
- from ..utils import merge
22
-
23
-
24
- # Initialize logger.
25
- log = logging.getLogger(__name__)
26
-
27
-
28
- class BasicAPI(abstracts.AbstractAPI):
29
- """
30
- Implements a basic API.
31
-
32
- The BasicAPI class provides an interface for interacting with a REST API.
33
- It implements the standard HTTP methods (HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS and TRACE)
34
- as well as a `request` method for sending a custom HTTP request.
35
-
36
- Args:
37
- url: Base URL for API.
38
- auth: Authorization or credentials.
39
- headers (optional): Headers to set globally for API.
40
- params (optional): Parameters to set globally for API.
41
- cache (optional): Mutable mapping for caching responses.
42
-
43
- Attributes:
44
- url: API URL.
45
-
46
- """
47
-
48
- def __init__(
49
- self,
50
- url: str,
51
- auth: Union[AuthBase, Tuple] = None,
52
- *,
53
- headers: Dict = None,
54
- params: Dict = None,
55
- cache: MutableMapping = None
56
- ):
57
- self.url = url + "/" if url[-1] != "/" else url
58
- self.auth = auth
59
- self.headers = headers
60
- self.params = params
61
- self.cache = cache
62
-
63
- def request(
64
- self,
65
- method: str,
66
- route: str,
67
- headers: Dict = None,
68
- params: Dict = None,
69
- **kwargs
70
- ) -> requests.Response:
71
- """
72
- Sends an HTTP request.
73
-
74
- Args:
75
- method: HTTP request method to use (HEAD, GET, POST, PUT, DELETE, OPTIONS, or TRACE).
76
- route: API path to which the request will be sent.
77
- headers (optional): Request headers (overrides global headers).
78
- params (optional): Request parameters (overrides global parameters).
79
- **kwargs: Additional arguments to pass to request.
80
-
81
- Returns:
82
- Response object.
83
-
84
- .. _Requests Documentation:
85
- https://docs.python-requests.org/en/latest/api/
86
-
87
- """
88
- uri = urljoin(self.url, route)
89
- log.debug(
90
- "Sending HTTP %(method)s request to %(uri)s",
91
- {'method': method, 'uri': uri}
92
- )
93
-
94
- response = requests.request(
95
- method,
96
- uri,
97
- auth=self.auth,
98
- headers=merge(self.headers, headers),
99
- params=merge(self.params, params),
100
- **kwargs
101
- )
102
- return response
103
-
104
- @cache_response
105
- def head(
106
- self,
107
- route: str,
108
- headers: Dict = None,
109
- params: Dict = None,
110
- **kwargs
111
- ) -> requests.Response:
112
- """
113
- Sends an HTTP HEAD request.
114
-
115
- Args:
116
- route: API path to which the request will be sent.
117
- headers (optional): Request headers (overrides global headers).
118
- params (optional): Request parameters (overrides global parameters).
119
- **kwargs: Additional arguments to pass to request.
120
-
121
- Returns:
122
- Response object.
123
-
124
- .. _HTTP HEAD Method:
125
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD
126
-
127
- """
128
- response = self.request(
129
- 'HEAD',
130
- route,
131
- headers=headers,
132
- params=params,
133
- **kwargs
134
- )
135
- return response
136
-
137
- @cache_response
138
- def get(
139
- self,
140
- route: str,
141
- headers: Dict = None,
142
- params: Dict = None,
143
- **kwargs
144
- ) -> requests.Response:
145
- """
146
- Sends an HTTP GET request.
147
-
148
- Args:
149
- route: API path to which the request will be sent.
150
- headers (optional): Request headers (overrides global headers).
151
- params (optional): Request parameters (overrides global parameters).
152
- **kwargs: Additional arguments to pass to request.
153
-
154
- Returns:
155
- Response object.
156
-
157
- .. _HTTP GET Method:
158
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET
159
-
160
- """
161
- response = self.request(
162
- 'GET',
163
- route,
164
- headers=headers,
165
- params=params,
166
- **kwargs
167
- )
168
- return response
169
-
170
- @cache_response
171
- def post(
172
- self,
173
- route: str,
174
- headers: Dict = None,
175
- params: Dict = None,
176
- **kwargs
177
- ) -> requests.Response:
178
- """
179
- Sends an HTTP POST request.
180
-
181
- Args:
182
- route: API path to which the request will be sent.
183
- headers (optional): Request headers (overrides global headers).
184
- params (optional): Request parameters (overrides global parameters).
185
- **kwargs: Additional arguments to pass to request.
186
-
187
- Returns:
188
- Response object.
189
-
190
- .. _HTTP POST Method:
191
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST
192
-
193
- """
194
- response = self.request(
195
- 'POST',
196
- route,
197
- headers=headers,
198
- params=params,
199
- **kwargs
200
- )
201
- return response
202
-
203
- @cache_response
204
- def put(
205
- self,
206
- route: str,
207
- headers: Dict = None,
208
- params: Dict = None,
209
- **kwargs
210
- ) -> requests.Response:
211
- """
212
- Sends an HTTP PUT request.
213
-
214
- Args:
215
- route: API path to which the request will be sent.
216
- headers (optional): Request headers (overrides global headers).
217
- params (optional): Request parameters (overrides global parameters).
218
- **kwargs: Additional arguments to pass to request.
219
-
220
- Returns:
221
- Response object.
222
-
223
- .. _HTTP PUT Method:
224
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT
225
-
226
- """
227
- response = self.request(
228
- 'PUT',
229
- route,
230
- headers=headers,
231
- params=params,
232
- **kwargs
233
- )
234
- return response
235
-
236
- @cache_response
237
- def patch(
238
- self,
239
- route: str,
240
- headers: Dict = None,
241
- params: Dict = None,
242
- **kwargs
243
- ) -> requests.Response:
244
- """
245
- Sends an HTTP PATCH request.
246
-
247
- Args:
248
- route: API path to which the request will be sent.
249
- headers (optional): Request headers (overrides global headers).
250
- params (optional): Request parameters (overrides global parameters).
251
- **kwargs: Additional arguments to pass to request.
252
-
253
- Returns:
254
- Response object.
255
-
256
- .. _HTTP PATCH Method:
257
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH
258
-
259
- """
260
- response = self.request(
261
- 'PATCH',
262
- route,
263
- headers=headers,
264
- params=params,
265
- **kwargs
266
- )
267
- return response
268
-
269
- @cache_response
270
- def delete(
271
- self,
272
- route: str,
273
- headers: Dict = None,
274
- params: Dict = None,
275
- **kwargs
276
- ) -> requests.Response:
277
- """
278
- Sends an HTTP DELETE request.
279
-
280
- Args:
281
- route: API path to which the request will be sent.
282
- headers (optional): Request headers (overrides global headers).
283
- params (optional): Request parameters (overrides global parameters).
284
- **kwargs: Additional arguments to pass to request.
285
-
286
- Returns:
287
- Response object.
288
-
289
- .. _HTTP DELETE Method:
290
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/DELETE
291
-
292
- """
293
- response = self.request(
294
- 'DELETE',
295
- route,
296
- headers=headers,
297
- params=params,
298
- **kwargs
299
- )
300
- return response
301
-
302
- @cache_response
303
- def options(
304
- self,
305
- route: str,
306
- headers: Dict = None,
307
- params: Dict = None,
308
- **kwargs
309
- ) -> requests.Response:
310
- """
311
- Sends an HTTP OPTIONS request.
312
-
313
- Args:
314
- route: API path to which the request will be sent.
315
- headers (optional): Request headers (overrides global headers).
316
- params (optional): Request parameters (overrides global parameters).
317
- **kwargs: Additional arguments to pass to request.
318
-
319
- Returns:
320
- Response object.
321
-
322
- .. _HTTP OPTIONS Method:
323
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS
324
-
325
- """
326
- response = self.request(
327
- 'OPTIONS',
328
- route,
329
- headers=headers,
330
- params=params,
331
- **kwargs
332
- )
333
- return response
334
-
335
- @cache_response
336
- def trace(
337
- self,
338
- route: str,
339
- headers: Dict = None,
340
- params: Dict = None,
341
- **kwargs
342
- ) -> requests.Response:
343
- """
344
- Sends an HTTP TRACE request.
345
-
346
- Args:
347
- route: API path to which the request will be sent.
348
- headers (optional): Request headers (overrides global headers).
349
- params (optional): Request parameters (overrides global parameters).
350
- **kwargs: Additional arguments to pass to request.
351
-
352
- Returns:
353
- Response object.
354
-
355
- .. _HTTP TRACE Method:
356
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/TRACE
357
-
358
- """
359
- response = self.request(
360
- 'TRACE',
361
- route,
362
- headers=headers,
363
- params=params,
364
- **kwargs
365
- )
366
- return response
367
-
368
-
369
- class SessionAPI(abstracts.AbstractSession, BasicAPI):
370
- """
371
- Implements a session-based API.
372
-
373
- The SessionAPI class implements the same interface as the BasicAPI; however, it
374
- overrides the `request` method to use requests.Session. In addition, the class
375
- provides `start` and `stop` methods to allow manual control of the session.
376
-
377
- The SessionAPI class can also be used as a context manager.
378
-
379
- Args:
380
- url: Base URL for API.
381
- auth: Authorization or credentials.
382
- headers (optional): Headers to set globally for API.
383
- params (optional): Parameters to set globally for API.
384
- adapter (optional): Instance of an HTTPAdapter.
385
- session (optional): Instance of a requests.Session.
386
- cache (optional): Mutable mapping for caching responses.
387
-
388
- .. Requests Documentation:
389
- https://docs.python-requests.org/en/latest/api/#request-sessions
390
-
391
- """
392
-
393
- def __init__(
394
- self,
395
- url: str,
396
- auth: Union[AuthBase, Tuple] = None,
397
- *,
398
- headers: Dict = None,
399
- params: Dict = None,
400
- adapter: HTTPAdapter = None,
401
- session: requests.Session = None,
402
- cache: MutableMapping = None,
403
- ):
404
- super().__init__(
405
- url,
406
- auth,
407
- headers=headers,
408
- params=params,
409
- cache=cache,
410
- )
411
- self.adapter = adapter
412
- self.session = session
413
-
414
- @final
415
- def __enter__(self):
416
- """
417
- Starts the API session as a context manager.
418
- """
419
- self.start()
420
-
421
- @final
422
- def __exit__(self, *args):
423
- """
424
- Closes the API session as a context manager.
425
- """
426
- self.close()
427
-
428
- def start(self) -> None:
429
- """
430
- Begins an API session.
431
- """
432
- log.debug("Starting API session...")
433
-
434
- # Create session
435
- if not self.session:
436
- self.session = requests.Session()
437
-
438
- # Set autherization
439
- if self.auth and not self.session.auth:
440
- self.session.auth = self.auth
441
-
442
- # Add default headers
443
- if self.headers:
444
- self.session.headers.update(self.headers)
445
-
446
- # Mount transport adapter
447
- if self.adapter:
448
- self.session.mount("https://", self.adapter)
449
- self.session.mount("http://", self.adapter)
450
-
451
- return self.session
452
-
453
- def close(self, *args) -> None:
454
- """
455
- Manually destroys the API session.
456
- """
457
- log.debug("Closing API session...")
458
- self.session.close()
459
-
460
- def request(
461
- self,
462
- method: str,
463
- route: str,
464
- headers: Dict = None,
465
- params: Dict = None,
466
- **kwargs
467
- ) -> requests.Response:
468
- """
469
- Sends an HTTP request.
470
-
471
- Args:
472
- method: HTTP request method to use (HEAD, GET, POST, PUT, DELETE, OPTIONS, or TRACE).
473
- route: API path to which the request will be sent.
474
- headers (optional): Request headers (overrides global headers).
475
- params (optional): Request parameters (overrides global parameters).
476
- **kwargs: Additional arguments to pass to request.
477
-
478
- Returns:
479
- Response object.
480
-
481
- .. Requests Documentation:
482
- https://docs.python-requests.org/en/latest/api/
483
-
484
- """
485
- uri = urljoin(self.url, route)
486
- log.debug(
487
- "Sending HTTP %(method)s request to %(uri)s",
488
- {'method': method, 'uri': uri}
489
- )
490
-
491
- if self.session:
492
- response = self.session.request(
493
- method,
494
- uri,
495
- headers=merge(self.headers, headers),
496
- params=merge(self.params, params),
497
- **kwargs
498
- )
499
-
500
- else:
501
- log.warning("Session not started: start() method not called before sending request")
502
- response = super().request(
503
- method,
504
- uri,
505
- headers=headers,
506
- params=params,
507
- **kwargs
508
- )
509
-
510
- return response