port-ocean 0.12.0__tar.gz → 0.12.2.dev1__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.
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/PKG-INFO +1 -1
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/base.py +11 -2
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +24 -13
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/log/handlers.py +8 -7
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/ocean.py +12 -11
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +36 -1
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/pyproject.toml +1 -1
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/LICENSE.md +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/README.md +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/bootstrap.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cli.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/defaults/__init___.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/defaults/clean.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/defaults/dock.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/defaults/group.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/list_integrations.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/main.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/new.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/pull.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/sail.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/version.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/extensions.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.dockerignore +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Dockerfile +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/utils.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/authentication.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/client.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/blueprints.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/entities.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/integrations.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/migrations.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/retry_transport.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/types.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/utils.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/config/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/config/base.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/config/dynamic.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/config/settings.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/consumers/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/consumers/kafka_consumer.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/context/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/context/event.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/context/ocean.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/context/resource.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/defaults/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/defaults/clean.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/defaults/common.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/defaults/initialize.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/factory.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/http.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/kafka.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/once.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/polling.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/base.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entity_processor/base.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/api.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/base.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/models.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/base.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/events.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/handler.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/sync.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/sync_raw.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/utils.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/models.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/ocean_types.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/utils.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/api.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/base.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/clients.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/context.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/core.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/port_defaults.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/utils.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/helpers/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/helpers/async_client.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/helpers/retry.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/log/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/log/logger_setup.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/log/sensetive.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/middlewares.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/py.typed +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/run.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/sonar-project.properties +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/conftest.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/fixtures.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/integration.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/ocean_app.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/port_client.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/smoke_test.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/test_smoke.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/__init__.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/async_http.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/async_iterators.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/cache.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/misc.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/queue_utils.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/repeat.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/signal.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/time.py +0 -0
- {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/version.py +0 -0
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import asyncio
|
|
1
2
|
from abc import abstractmethod
|
|
3
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
2
4
|
from typing import TypedDict, Callable, Any, Awaitable
|
|
3
5
|
|
|
4
6
|
from pydantic import Extra
|
|
5
7
|
|
|
6
8
|
from port_ocean.config.base import BaseOceanModel
|
|
7
|
-
from port_ocean.utils.signal import signal_handler
|
|
8
9
|
from port_ocean.context.ocean import ocean
|
|
9
10
|
from port_ocean.utils.misc import IntegrationStateStatus
|
|
11
|
+
from port_ocean.utils.signal import signal_handler
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
class EventListenerEvents(TypedDict):
|
|
@@ -67,7 +69,14 @@ class BaseEventListener:
|
|
|
67
69
|
"""
|
|
68
70
|
await self._before_resync()
|
|
69
71
|
try:
|
|
70
|
-
|
|
72
|
+
loop = asyncio.get_event_loop()
|
|
73
|
+
with ThreadPoolExecutor() as executor:
|
|
74
|
+
e = executor.submit(
|
|
75
|
+
lambda: asyncio.run_coroutine_threadsafe(
|
|
76
|
+
self.events["on_resync"](resync_args), loop
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
signal_handler.register(e.cancel)
|
|
71
80
|
await self._after_resync()
|
|
72
81
|
except Exception as e:
|
|
73
82
|
await self._on_resync_failure(e)
|
|
@@ -47,37 +47,48 @@ class JQEntityProcessor(BaseEntityProcessor):
|
|
|
47
47
|
pattern = "def env: {}; {} as $ENV | " + pattern
|
|
48
48
|
return jq.compile(pattern)
|
|
49
49
|
|
|
50
|
+
@staticmethod
|
|
51
|
+
def _stop_iterator_handler(func: Any) -> Any:
|
|
52
|
+
"""
|
|
53
|
+
Wrap the function to handle StopIteration exceptions.
|
|
54
|
+
Prevents StopIteration from stopping the thread and skipping further queue processing.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def inner() -> Any:
|
|
58
|
+
try:
|
|
59
|
+
return func()
|
|
60
|
+
except StopIteration:
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
return inner
|
|
64
|
+
|
|
50
65
|
async def _search(self, data: dict[str, Any], pattern: str) -> Any:
|
|
51
66
|
try:
|
|
52
67
|
loop = asyncio.get_event_loop()
|
|
53
68
|
compiled_pattern = self._compile(pattern)
|
|
54
69
|
func = compiled_pattern.input_value(data)
|
|
55
|
-
return await loop.run_in_executor(
|
|
70
|
+
return await loop.run_in_executor(
|
|
71
|
+
None, self._stop_iterator_handler(func.first)
|
|
72
|
+
)
|
|
56
73
|
except Exception as exc:
|
|
57
74
|
logger.debug(
|
|
58
|
-
f"
|
|
75
|
+
f"Search failed for pattern '{pattern}' in data: {data}, Error: {exc}"
|
|
59
76
|
)
|
|
60
77
|
return None
|
|
61
78
|
|
|
62
79
|
async def _search_as_bool(self, data: dict[str, Any], pattern: str) -> bool:
|
|
63
80
|
loop = asyncio.get_event_loop()
|
|
64
|
-
|
|
81
|
+
|
|
65
82
|
compiled_pattern = self._compile(pattern)
|
|
66
83
|
func = compiled_pattern.input_value(data)
|
|
67
|
-
|
|
68
|
-
value = await loop.run_in_executor(
|
|
69
|
-
|
|
70
|
-
logger.debug(
|
|
71
|
-
f"Search for pattern {execute_time:.2f} seconds, compile time {compile_time:.2f} seconds",
|
|
72
|
-
pattern=pattern,
|
|
73
|
-
compile_time=compile_time,
|
|
74
|
-
execute_time=execute_time,
|
|
84
|
+
|
|
85
|
+
value = await loop.run_in_executor(
|
|
86
|
+
None, self._stop_iterator_handler(func.first)
|
|
75
87
|
)
|
|
76
88
|
if isinstance(value, bool):
|
|
77
89
|
return value
|
|
78
|
-
|
|
79
90
|
raise EntityProcessorException(
|
|
80
|
-
f"Expected boolean value, got {type(value)} instead"
|
|
91
|
+
f"Expected boolean value, got value:{value} of type: {type(value)} instead"
|
|
81
92
|
)
|
|
82
93
|
|
|
83
94
|
async def _search_as_object(
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import logging
|
|
3
3
|
import sys
|
|
4
|
-
import threading
|
|
5
4
|
import time
|
|
5
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
6
6
|
from datetime import datetime
|
|
7
7
|
from logging.handlers import MemoryHandler
|
|
8
8
|
from typing import Any
|
|
@@ -65,18 +65,19 @@ class HTTPMemoryHandler(MemoryHandler):
|
|
|
65
65
|
if self.ocean is None or not self.buffer:
|
|
66
66
|
return
|
|
67
67
|
|
|
68
|
-
def _wrap_event_loop(_ocean: Ocean, logs_to_send: list[dict[str, Any]]) -> None:
|
|
69
|
-
loop = asyncio.new_event_loop()
|
|
70
|
-
loop.run_until_complete(self.send_logs(_ocean, logs_to_send))
|
|
71
|
-
loop.close()
|
|
72
|
-
|
|
73
68
|
self.acquire()
|
|
74
69
|
logs = list(self._serialized_buffer)
|
|
75
70
|
if logs:
|
|
76
71
|
self.buffer.clear()
|
|
77
72
|
self._serialized_buffer.clear()
|
|
78
73
|
self.last_flush_time = time.time()
|
|
79
|
-
|
|
74
|
+
loop = asyncio.new_event_loop()
|
|
75
|
+
with ThreadPoolExecutor() as executor:
|
|
76
|
+
executor.submit(
|
|
77
|
+
lambda: asyncio.run_coroutine_threadsafe(
|
|
78
|
+
self.send_logs(self.ocean, logs), loop
|
|
79
|
+
)
|
|
80
|
+
)
|
|
80
81
|
self.release()
|
|
81
82
|
|
|
82
83
|
async def send_logs(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import sys
|
|
3
|
-
import
|
|
3
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
4
4
|
from contextlib import asynccontextmanager
|
|
5
5
|
from typing import Callable, Any, Dict, AsyncIterator, Type
|
|
6
6
|
|
|
@@ -9,8 +9,6 @@ from loguru import logger
|
|
|
9
9
|
from pydantic import BaseModel
|
|
10
10
|
from starlette.types import Scope, Receive, Send
|
|
11
11
|
|
|
12
|
-
from port_ocean.core.handlers.resync_state_updater import ResyncStateUpdater
|
|
13
|
-
from port_ocean.core.models import Runtime
|
|
14
12
|
from port_ocean.clients.port.client import PortClient
|
|
15
13
|
from port_ocean.config.settings import (
|
|
16
14
|
IntegrationConfiguration,
|
|
@@ -20,13 +18,15 @@ from port_ocean.context.ocean import (
|
|
|
20
18
|
ocean,
|
|
21
19
|
initialize_port_ocean_context,
|
|
22
20
|
)
|
|
21
|
+
from port_ocean.core.handlers.resync_state_updater import ResyncStateUpdater
|
|
23
22
|
from port_ocean.core.integrations.base import BaseIntegration
|
|
23
|
+
from port_ocean.core.models import Runtime
|
|
24
24
|
from port_ocean.log.sensetive import sensitive_log_filter
|
|
25
25
|
from port_ocean.middlewares import request_handler
|
|
26
|
+
from port_ocean.utils.misc import IntegrationStateStatus
|
|
26
27
|
from port_ocean.utils.repeat import repeat_every
|
|
27
28
|
from port_ocean.utils.signal import signal_handler
|
|
28
29
|
from port_ocean.version import __integration_version__
|
|
29
|
-
from port_ocean.utils.misc import IntegrationStateStatus
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class Ocean:
|
|
@@ -92,6 +92,13 @@ class Ocean:
|
|
|
92
92
|
)
|
|
93
93
|
raise e
|
|
94
94
|
|
|
95
|
+
def pool_executor_wrapper(event_loop) -> None:
|
|
96
|
+
with ThreadPoolExecutor() as executor:
|
|
97
|
+
e = executor.submit(lambda: asyncio.run_coroutine_threadsafe(
|
|
98
|
+
execute_resync_all(), event_loop
|
|
99
|
+
))
|
|
100
|
+
signal_handler.register(e.cancel)
|
|
101
|
+
|
|
95
102
|
interval = self.config.scheduled_resync_interval
|
|
96
103
|
loop = asyncio.get_event_loop()
|
|
97
104
|
if interval is not None:
|
|
@@ -103,13 +110,7 @@ class Ocean:
|
|
|
103
110
|
seconds=interval * 60,
|
|
104
111
|
# Not running the resync immediately because the event listener should run resync on startup
|
|
105
112
|
wait_first=True,
|
|
106
|
-
)(
|
|
107
|
-
lambda: threading.Thread(
|
|
108
|
-
target=lambda: asyncio.run_coroutine_threadsafe(
|
|
109
|
-
execute_resync_all(), loop
|
|
110
|
-
)
|
|
111
|
-
).start()
|
|
112
|
-
)
|
|
113
|
+
)(lambda _: pool_executor_wrapper(loop))
|
|
113
114
|
await repeated_function()
|
|
114
115
|
|
|
115
116
|
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
|
|
@@ -195,10 +195,45 @@ class TestJQEntityProcessor:
|
|
|
195
195
|
pattern = ".foo"
|
|
196
196
|
with pytest.raises(
|
|
197
197
|
EntityProcessorException,
|
|
198
|
-
match="Expected boolean value, got <class 'str'> instead",
|
|
198
|
+
match="Expected boolean value, got value:bar of type: <class 'str'> instead",
|
|
199
199
|
):
|
|
200
200
|
await mocked_processor._search_as_bool(data, pattern)
|
|
201
201
|
|
|
202
|
+
@pytest.mark.parametrize(
|
|
203
|
+
"pattern, expected",
|
|
204
|
+
[
|
|
205
|
+
('.parameters[] | select(.name == "not_exists") | .value', None),
|
|
206
|
+
(
|
|
207
|
+
'.parameters[] | select(.name == "parameter_name") | .value',
|
|
208
|
+
"parameter_value",
|
|
209
|
+
),
|
|
210
|
+
(
|
|
211
|
+
'.parameters[] | select(.name == "another_parameter") | .value',
|
|
212
|
+
"another_value",
|
|
213
|
+
),
|
|
214
|
+
],
|
|
215
|
+
)
|
|
216
|
+
async def test_search_fails_on_stop_iteration(
|
|
217
|
+
self, mocked_processor: JQEntityProcessor, pattern: str, expected: Any
|
|
218
|
+
) -> None:
|
|
219
|
+
data = {
|
|
220
|
+
"parameters": [
|
|
221
|
+
{"name": "parameter_name", "value": "parameter_value"},
|
|
222
|
+
{"name": "another_parameter", "value": "another_value"},
|
|
223
|
+
{"name": "another_parameter", "value": "another_value2"},
|
|
224
|
+
]
|
|
225
|
+
}
|
|
226
|
+
result = await mocked_processor._search(data, pattern)
|
|
227
|
+
assert result == expected
|
|
228
|
+
|
|
229
|
+
async def test_return_a_list_of_values(
|
|
230
|
+
self, mocked_processor: JQEntityProcessor
|
|
231
|
+
) -> None:
|
|
232
|
+
data = {"parameters": ["parameter_value", "another_value", "another_value2"]}
|
|
233
|
+
pattern = ".parameters"
|
|
234
|
+
result = await mocked_processor._search(data, pattern)
|
|
235
|
+
assert result == ["parameter_value", "another_value", "another_value2"]
|
|
236
|
+
|
|
202
237
|
@pytest.mark.timeout(3)
|
|
203
238
|
async def test_search_performance_10000(
|
|
204
239
|
self, mocked_processor: JQEntityProcessor
|
|
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.0 → port_ocean-0.12.2.dev1}/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
|
|
File without changes
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/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.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entity_processor/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entity_processor/base.py
RENAMED
|
File without changes
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/api.py
RENAMED
|
File without changes
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/base.py
RENAMED
|
File without changes
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/sync_raw.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
|
{port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/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
|