python3-commons 0.5.2__tar.gz → 0.5.4__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.

Potentially problematic release.


This version of python3-commons might be problematic. Click here for more details.

Files changed (45) hide show
  1. {python3_commons-0.5.2/src/python3_commons.egg-info → python3_commons-0.5.4}/PKG-INFO +1 -1
  2. {python3_commons-0.5.2 → python3_commons-0.5.4}/setup.cfg +1 -1
  3. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/audit.py +42 -41
  4. {python3_commons-0.5.2 → python3_commons-0.5.4/src/python3_commons.egg-info}/PKG-INFO +1 -1
  5. {python3_commons-0.5.2 → python3_commons-0.5.4}/.coveragerc +0 -0
  6. {python3_commons-0.5.2 → python3_commons-0.5.4}/.github/workflows/python-publish.yaml +0 -0
  7. {python3_commons-0.5.2 → python3_commons-0.5.4}/.gitignore +0 -0
  8. {python3_commons-0.5.2 → python3_commons-0.5.4}/AUTHORS.rst +0 -0
  9. {python3_commons-0.5.2 → python3_commons-0.5.4}/CHANGELOG.rst +0 -0
  10. {python3_commons-0.5.2 → python3_commons-0.5.4}/LICENSE +0 -0
  11. {python3_commons-0.5.2 → python3_commons-0.5.4}/README.md +0 -0
  12. {python3_commons-0.5.2 → python3_commons-0.5.4}/README.rst +0 -0
  13. {python3_commons-0.5.2 → python3_commons-0.5.4}/docs/Makefile +0 -0
  14. {python3_commons-0.5.2 → python3_commons-0.5.4}/docs/_static/.gitignore +0 -0
  15. {python3_commons-0.5.2 → python3_commons-0.5.4}/docs/authors.rst +0 -0
  16. {python3_commons-0.5.2 → python3_commons-0.5.4}/docs/changelog.rst +0 -0
  17. {python3_commons-0.5.2 → python3_commons-0.5.4}/docs/conf.py +0 -0
  18. {python3_commons-0.5.2 → python3_commons-0.5.4}/docs/index.rst +0 -0
  19. {python3_commons-0.5.2 → python3_commons-0.5.4}/docs/license.rst +0 -0
  20. {python3_commons-0.5.2 → python3_commons-0.5.4}/pyproject.toml +0 -0
  21. {python3_commons-0.5.2 → python3_commons-0.5.4}/requirements.txt +0 -0
  22. {python3_commons-0.5.2 → python3_commons-0.5.4}/requirements_dev.txt +0 -0
  23. {python3_commons-0.5.2 → python3_commons-0.5.4}/requirements_test.txt +0 -0
  24. {python3_commons-0.5.2 → python3_commons-0.5.4}/setup.py +0 -0
  25. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/__init__.py +0 -0
  26. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/conf.py +0 -0
  27. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/db.py +0 -0
  28. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/fs.py +0 -0
  29. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/helpers.py +0 -0
  30. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/logging/__init__.py +0 -0
  31. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/logging/filters.py +0 -0
  32. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/logging/formatter.py +0 -0
  33. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/object_storage.py +0 -0
  34. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/serializers/__init__.py +0 -0
  35. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/serializers/json.py +0 -0
  36. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/serializers/msgpack.py +0 -0
  37. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons/serializers/msgspec.py +0 -0
  38. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons.egg-info/SOURCES.txt +0 -0
  39. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons.egg-info/dependency_links.txt +0 -0
  40. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons.egg-info/not-zip-safe +0 -0
  41. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons.egg-info/requires.txt +0 -0
  42. {python3_commons-0.5.2 → python3_commons-0.5.4}/src/python3_commons.egg-info/top_level.txt +0 -0
  43. {python3_commons-0.5.2 → python3_commons-0.5.4}/tests/conftest.py +0 -0
  44. {python3_commons-0.5.2 → python3_commons-0.5.4}/tests/test_msgpack.py +0 -0
  45. {python3_commons-0.5.2 → python3_commons-0.5.4}/tests/test_msgspec.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python3-commons
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: Re-usable Python3 code
5
5
  Home-page: https://github.com/kamikaze/python3-commons
6
6
  Author: Oleg Korsak
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = python3-commons
3
- version = 0.5.2
3
+ version = 0.5.4
4
4
  description = Re-usable Python3 code
5
5
  author = Oleg Korsak
6
6
  author_email = kamikaze.is.waiting.you@gmail.com
@@ -1,64 +1,29 @@
1
1
  import asyncio
2
+ import io
2
3
  import logging
3
4
  import tarfile
4
- from datetime import date, datetime, timedelta, UTC
5
+ from datetime import datetime, timedelta, UTC
5
6
  from io import BytesIO
6
7
  from uuid import uuid4
7
- from zoneinfo import ZoneInfo
8
8
 
9
9
  from lxml import etree
10
+ from minio import S3Error
10
11
  from zeep.plugins import Plugin
11
12
  from zeep.wsdl.definitions import AbstractOperation
12
13
 
13
14
  from python3_commons import object_storage
14
15
  from python3_commons.conf import S3Settings, s3_settings
16
+ from python3_commons.object_storage import get_s3_client
15
17
 
16
18
  logger = logging.getLogger(__name__)
17
19
 
18
20
 
19
- class ZeepAuditPlugin(Plugin):
20
- def __init__(self, audit_name: str = 'zeep'):
21
- super().__init__()
22
- self.audit_name = audit_name
23
-
24
- @staticmethod
25
- def store_audit_in_s3(envelope, operation: AbstractOperation, direction: str):
26
- xml = etree.tostring(envelope, encoding='UTF-8', pretty_print=True)
27
- now = datetime.now(tz=UTC)
28
- date_path = now.strftime('%Y/%m/%d')
29
- timestamp = now.strftime('%H%M%S')
30
- coro = object_storage.store_bytes_in_s3(
31
- settings, xml,
32
- f'audit/{date_path}/{self.audit_name}/{operation.name}/{timestamp}_{str(uuid4())[-12:]}_{direction}.xml'
33
- )
34
-
35
- try:
36
- loop = asyncio.get_running_loop()
37
- except RuntimeError:
38
- loop = None
39
-
40
- if loop and loop.is_running():
41
- loop.create_task(coro)
42
- else:
43
- asyncio.run(coro)
44
-
45
- def ingress(self, envelope, http_headers, operation: AbstractOperation):
46
- self.store_audit_in_s3(envelope, operation, 'ingress')
47
-
48
- return envelope, http_headers
49
-
50
- def egress(self, envelope, http_headers, operation: AbstractOperation, binding_options):
51
- self.store_audit_in_s3(envelope, operation, 'egress')
52
-
53
- return envelope, http_headers
54
-
55
-
56
21
  async def write_audit_data(settings: S3Settings, key: str, data: bytes):
57
22
  if settings.s3_secret_access_key:
58
23
  try:
59
24
  client = get_s3_client(settings)
60
25
 
61
- client.put_object(settings.s3_bucket, key, io.BytesIO(data), len(data))
26
+ client.put_object(settings.s3_bucket, f'audit/{key}', io.BytesIO(data), len(data))
62
27
  except S3Error as e:
63
28
  logger.error(f'Failed storing object in storage: {e}')
64
29
  else:
@@ -92,7 +57,7 @@ async def archive_audit_data(root_path: str = 'audit'):
92
57
 
93
58
  if object_names:
94
59
  archive_path = object_storage.get_absolute_path(
95
- f'.archive/{year}_{month:02}/{year}_{month:02}_{day:02}.tar.bz2')
60
+ f'audit/.archive/{year}_{month:02}_{day:02}.tar.bz2')
96
61
  object_storage.put_object(bucket_name, archive_path, fo, fo.getbuffer().nbytes)
97
62
 
98
63
  if errors := object_storage.remove_objects(bucket_name, object_names=object_names):
@@ -100,3 +65,39 @@ async def archive_audit_data(root_path: str = 'audit'):
100
65
  logger.error(f'Failed to delete object in {bucket_name=}: {error}')
101
66
  else:
102
67
  logger.info('No objects to archive found.')
68
+
69
+
70
+ class ZeepAuditPlugin(Plugin):
71
+ def __init__(self, audit_name: str = 'zeep'):
72
+ super().__init__()
73
+ self.audit_name = audit_name
74
+
75
+ def store_audit_in_s3(self, envelope, operation: AbstractOperation, direction: str):
76
+ xml = etree.tostring(envelope, encoding='UTF-8', pretty_print=True)
77
+ now = datetime.now(tz=UTC)
78
+ date_path = now.strftime('%Y/%m/%d')
79
+ timestamp = now.strftime('%H%M%S')
80
+ coro = write_audit_data(
81
+ s3_settings,
82
+ f'{date_path}/{self.audit_name}/{operation.name}/{timestamp}_{str(uuid4())[-12:]}_{direction}.xml', xml
83
+ )
84
+
85
+ try:
86
+ loop = asyncio.get_running_loop()
87
+ except RuntimeError:
88
+ loop = None
89
+
90
+ if loop and loop.is_running():
91
+ loop.create_task(coro)
92
+ else:
93
+ asyncio.run(coro)
94
+
95
+ def ingress(self, envelope, http_headers, operation: AbstractOperation):
96
+ self.store_audit_in_s3(envelope, operation, 'ingress')
97
+
98
+ return envelope, http_headers
99
+
100
+ def egress(self, envelope, http_headers, operation: AbstractOperation, binding_options):
101
+ self.store_audit_in_s3(envelope, operation, 'egress')
102
+
103
+ return envelope, http_headers
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python3-commons
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: Re-usable Python3 code
5
5
  Home-page: https://github.com/kamikaze/python3-commons
6
6
  Author: Oleg Korsak
File without changes