port-ocean 0.12.8__tar.gz → 0.12.9__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 port-ocean might be problematic. Click here for more details.
- {port_ocean-0.12.8 → port_ocean-0.12.9}/PKG-INFO +1 -1
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/mixins/integrations.py +0 -1
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/log/handlers.py +23 -2
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/log/logger_setup.py +1 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/ocean.py +1 -0
- port_ocean-0.12.9/port_ocean/tests/log/test_handlers.py +71 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/pyproject.toml +1 -1
- {port_ocean-0.12.8 → port_ocean-0.12.9}/LICENSE.md +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/README.md +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/bootstrap.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cli.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/defaults/__init___.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/defaults/clean.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/defaults/dock.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/defaults/group.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/list_integrations.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/main.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/new.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/pull.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/sail.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/commands/version.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/extensions.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.dockerignore +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Dockerfile +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/utils.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/authentication.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/client.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/mixins/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/mixins/blueprints.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/mixins/entities.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/mixins/migrations.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/retry_transport.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/types.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/clients/port/utils.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/config/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/config/base.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/config/dynamic.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/config/settings.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/consumers/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/consumers/kafka_consumer.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/context/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/context/event.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/context/ocean.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/context/resource.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/defaults/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/defaults/clean.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/defaults/common.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/defaults/initialize.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/event_listener/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/event_listener/base.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/event_listener/factory.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/event_listener/http.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/event_listener/kafka.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/event_listener/once.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/event_listener/polling.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/base.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entity_processor/base.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/port_app_config/api.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/port_app_config/base.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/port_app_config/models.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/integrations/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/integrations/base.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/integrations/mixins/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/integrations/mixins/events.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/integrations/mixins/handler.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/integrations/mixins/sync.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/integrations/mixins/sync_raw.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/integrations/mixins/utils.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/models.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/ocean_types.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/utils.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/exceptions/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/exceptions/api.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/exceptions/base.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/exceptions/clients.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/exceptions/context.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/exceptions/core.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/exceptions/port_defaults.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/exceptions/utils.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/helpers/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/helpers/async_client.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/helpers/retry.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/log/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/log/sensetive.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/middlewares.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/py.typed +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/run.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/sonar-project.properties +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/conftest.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/helpers/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/helpers/fixtures.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/helpers/integration.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/helpers/ocean_app.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/helpers/port_client.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/helpers/smoke_test.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/test_smoke.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/utils/test_async_iterators.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/__init__.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/async_http.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/async_iterators.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/cache.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/misc.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/queue_utils.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/repeat.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/signal.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/utils/time.py +0 -0
- {port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/version.py +0 -0
|
@@ -3,7 +3,6 @@ from urllib.parse import quote_plus
|
|
|
3
3
|
|
|
4
4
|
import httpx
|
|
5
5
|
from loguru import logger
|
|
6
|
-
|
|
7
6
|
from port_ocean.clients.port.authentication import PortAuthentication
|
|
8
7
|
from port_ocean.clients.port.utils import handle_status_code
|
|
9
8
|
from port_ocean.log.sensetive import sensitive_log_filter
|
|
@@ -11,16 +11,22 @@ from loguru import logger
|
|
|
11
11
|
|
|
12
12
|
from port_ocean import Ocean
|
|
13
13
|
from port_ocean.context.ocean import ocean
|
|
14
|
+
from copy import deepcopy
|
|
15
|
+
from traceback import format_exception
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
def _serialize_record(record: logging.LogRecord) -> dict[str, Any]:
|
|
19
|
+
extra = {**deepcopy(record.__dict__["extra"])}
|
|
20
|
+
if isinstance(extra.get("exc_info"), Exception):
|
|
21
|
+
serialized_exception = "".join(format_exception(extra.get("exc_info")))
|
|
22
|
+
extra["exc_info"] = serialized_exception
|
|
17
23
|
return {
|
|
18
24
|
"message": record.msg,
|
|
19
25
|
"level": record.levelname,
|
|
20
26
|
"timestamp": datetime.utcfromtimestamp(record.created).strftime(
|
|
21
27
|
"%Y-%m-%dT%H:%M:%S.%fZ"
|
|
22
28
|
),
|
|
23
|
-
"extra":
|
|
29
|
+
"extra": extra,
|
|
24
30
|
}
|
|
25
31
|
|
|
26
32
|
|
|
@@ -37,6 +43,7 @@ class HTTPMemoryHandler(MemoryHandler):
|
|
|
37
43
|
self.flush_size = flush_size
|
|
38
44
|
self.last_flush_time = time.time()
|
|
39
45
|
self._serialized_buffer: list[dict[str, Any]] = []
|
|
46
|
+
self._thread_pool: list[threading.Thread] = []
|
|
40
47
|
|
|
41
48
|
@property
|
|
42
49
|
def ocean(self) -> Ocean | None:
|
|
@@ -46,6 +53,7 @@ class HTTPMemoryHandler(MemoryHandler):
|
|
|
46
53
|
return None
|
|
47
54
|
|
|
48
55
|
def emit(self, record: logging.LogRecord) -> None:
|
|
56
|
+
|
|
49
57
|
self._serialized_buffer.append(_serialize_record(record))
|
|
50
58
|
super().emit(record)
|
|
51
59
|
|
|
@@ -61,6 +69,11 @@ class HTTPMemoryHandler(MemoryHandler):
|
|
|
61
69
|
return True
|
|
62
70
|
return False
|
|
63
71
|
|
|
72
|
+
def wait_for_lingering_threads(self) -> None:
|
|
73
|
+
for thread in self._thread_pool:
|
|
74
|
+
if thread.is_alive():
|
|
75
|
+
thread.join()
|
|
76
|
+
|
|
64
77
|
def flush(self) -> None:
|
|
65
78
|
if self.ocean is None or not self.buffer:
|
|
66
79
|
return
|
|
@@ -70,13 +83,21 @@ class HTTPMemoryHandler(MemoryHandler):
|
|
|
70
83
|
loop.run_until_complete(self.send_logs(_ocean, logs_to_send))
|
|
71
84
|
loop.close()
|
|
72
85
|
|
|
86
|
+
def clear_thread_pool() -> None:
|
|
87
|
+
for thread in self._thread_pool:
|
|
88
|
+
if not thread.is_alive():
|
|
89
|
+
self._thread_pool.remove(thread)
|
|
90
|
+
|
|
73
91
|
self.acquire()
|
|
74
92
|
logs = list(self._serialized_buffer)
|
|
75
93
|
if logs:
|
|
76
94
|
self.buffer.clear()
|
|
77
95
|
self._serialized_buffer.clear()
|
|
78
96
|
self.last_flush_time = time.time()
|
|
79
|
-
|
|
97
|
+
clear_thread_pool()
|
|
98
|
+
thread = threading.Thread(target=_wrap_event_loop, args=(self.ocean, logs))
|
|
99
|
+
thread.start()
|
|
100
|
+
self._thread_pool.append(thread)
|
|
80
101
|
self.release()
|
|
81
102
|
|
|
82
103
|
async def send_logs(
|
|
@@ -55,6 +55,7 @@ def _http_loguru_handler(level: LogLevelType) -> None:
|
|
|
55
55
|
logger.configure(patcher=exception_deserializer)
|
|
56
56
|
|
|
57
57
|
http_memory_handler = HTTPMemoryHandler()
|
|
58
|
+
signal_handler.register(http_memory_handler.wait_for_lingering_threads)
|
|
58
59
|
signal_handler.register(http_memory_handler.flush)
|
|
59
60
|
|
|
60
61
|
queue_listener = QueueListener(queue, http_memory_handler)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from port_ocean.log.handlers import _serialize_record
|
|
2
|
+
from loguru import logger
|
|
3
|
+
from logging import LogRecord
|
|
4
|
+
from queue import Queue
|
|
5
|
+
from logging.handlers import QueueHandler
|
|
6
|
+
from typing import Callable, Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
log_message = "This is a test log message."
|
|
10
|
+
exception_grouop_message = "Test Exception group"
|
|
11
|
+
exception_message = "Test Exception"
|
|
12
|
+
expected_keys = ["message", "level", "timestamp", "extra"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def test_serialize_record_log_shape() -> None:
|
|
16
|
+
record = log_record(
|
|
17
|
+
lambda: logger.exception(
|
|
18
|
+
log_message,
|
|
19
|
+
exc_info=None,
|
|
20
|
+
)
|
|
21
|
+
)
|
|
22
|
+
serialized_record = _serialize_record(record)
|
|
23
|
+
assert all(key in serialized_record for key in expected_keys)
|
|
24
|
+
assert log_message in serialized_record.get("message", None)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_serialize_record_exc_info_single_exception() -> None:
|
|
28
|
+
record = log_record(
|
|
29
|
+
lambda: logger.exception(
|
|
30
|
+
log_message,
|
|
31
|
+
exc_info=ExceptionGroup(
|
|
32
|
+
exception_grouop_message, [Exception(exception_message)]
|
|
33
|
+
),
|
|
34
|
+
)
|
|
35
|
+
)
|
|
36
|
+
serialized_record = _serialize_record(record)
|
|
37
|
+
exc_info = assert_extra(serialized_record.get("extra", {}))
|
|
38
|
+
assert exception_grouop_message in exc_info
|
|
39
|
+
assert exception_message in exc_info
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_serialize_record_exc_info_group_exception() -> None:
|
|
43
|
+
record = log_record(
|
|
44
|
+
lambda: logger.exception(log_message, exc_info=Exception(exception_message))
|
|
45
|
+
)
|
|
46
|
+
serialized_record = _serialize_record(record)
|
|
47
|
+
exc_info = assert_extra(serialized_record.get("extra", {}))
|
|
48
|
+
assert exception_message in exc_info
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def assert_extra(extra: dict[str, Any]) -> str:
|
|
52
|
+
exc_info = extra.get("exc_info", None)
|
|
53
|
+
assert type(exc_info) is str
|
|
54
|
+
return exc_info
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def log_record(cb: Callable[[], None]) -> LogRecord:
|
|
58
|
+
queue = Queue[LogRecord]()
|
|
59
|
+
queue_handler = QueueHandler(queue)
|
|
60
|
+
logger_id = logger.add(
|
|
61
|
+
queue_handler,
|
|
62
|
+
level="DEBUG",
|
|
63
|
+
format="{message}",
|
|
64
|
+
diagnose=False,
|
|
65
|
+
enqueue=True,
|
|
66
|
+
)
|
|
67
|
+
cb()
|
|
68
|
+
logger.complete()
|
|
69
|
+
logger.remove(logger_id)
|
|
70
|
+
record = queue.get()
|
|
71
|
+
return record
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entities_state_applier/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entities_state_applier/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/entity_processor/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/port_app_config/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/resync_state_updater/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/core/handlers/resync_state_updater/updater.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.12.8 → port_ocean-0.12.9}/port_ocean/tests/clients/port/mixins/test_entities.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|