port-ocean 0.5.19__tar.gz → 0.5.20__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.5.19 → port_ocean-0.5.20}/PKG-INFO +1 -1
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -1
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +1 -1
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/config/base.py +4 -6
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/config/settings.py +18 -6
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/event_listener/base.py +0 -7
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/event_listener/polling.py +2 -1
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/ocean.py +10 -6
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/utils/misc.py +15 -3
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/utils/signal.py +1 -4
- {port_ocean-0.5.19 → port_ocean-0.5.20}/pyproject.toml +1 -1
- port_ocean-0.5.19/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/config.yaml +0 -17
- {port_ocean-0.5.19 → port_ocean-0.5.20}/LICENSE.md +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/README.md +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/bootstrap.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cli.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/defaults/__init___.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/defaults/clean.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/defaults/dock.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/defaults/group.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/list_integrations.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/main.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/new.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/pull.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/sail.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/commands/version.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/extensions.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.dockerignore +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Dockerfile +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Makefile +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/cli/utils.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/authentication.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/client.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/mixins/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/mixins/blueprints.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/mixins/entities.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/mixins/integrations.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/mixins/migrations.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/retry_transport.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/types.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/clients/port/utils.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/config/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/config/dynamic.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/consumers/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/consumers/kafka_consumer.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/context/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/context/event.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/context/ocean.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/context/resource.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/defaults/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/defaults/clean.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/defaults/common.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/defaults/initialize.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/event_listener/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/event_listener/factory.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/event_listener/http.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/event_listener/kafka.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/event_listener/once.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/base.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entity_processor/base.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/port_app_config/api.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/port_app_config/base.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/port_app_config/models.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/integrations/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/integrations/base.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/integrations/mixins/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/integrations/mixins/events.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/integrations/mixins/handler.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/integrations/mixins/sync.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/integrations/mixins/sync_raw.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/integrations/mixins/utils.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/models.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/ocean_types.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/utils.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/exceptions/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/exceptions/api.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/exceptions/base.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/exceptions/clients.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/exceptions/context.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/exceptions/core.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/exceptions/port_defaults.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/exceptions/utils.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/helpers/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/helpers/async_client.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/helpers/retry.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/log/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/log/handlers.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/log/logger_setup.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/log/sensetive.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/middlewares.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/py.typed +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/run.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/sonar-project.properties +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/utils/__init__.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/utils/async_http.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/utils/async_iterators.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/utils/cache.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/utils/queue_utils.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/utils/repeat.py +0 -0
- {port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/version.py +0 -0
|
@@ -16,16 +16,15 @@ PROVIDER_CONFIG_PATTERN = r"^[a-zA-Z0-9]+ .*$"
|
|
|
16
16
|
|
|
17
17
|
def read_yaml_config_settings_source(
|
|
18
18
|
settings: "BaseOceanSettings", base_path: str
|
|
19
|
-
) -> str:
|
|
19
|
+
) -> dict[str, Any]:
|
|
20
20
|
yaml_file = getattr(settings.__config__, "yaml_file", "")
|
|
21
21
|
|
|
22
22
|
assert yaml_file, "Settings.yaml_file not properly configured"
|
|
23
23
|
path = Path(base_path, yaml_file)
|
|
24
24
|
|
|
25
25
|
if not path.exists():
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return path.read_text("utf-8")
|
|
26
|
+
return {}
|
|
27
|
+
return yaml.safe_load(path.read_text("utf-8"))
|
|
29
28
|
|
|
30
29
|
|
|
31
30
|
def parse_config_provider(value: str) -> tuple[str, str]:
|
|
@@ -122,8 +121,7 @@ def decamelize_config(
|
|
|
122
121
|
def load_providers(
|
|
123
122
|
settings: "BaseOceanSettings", existing_values: dict[str, Any], base_path: str
|
|
124
123
|
) -> dict[str, Any]:
|
|
125
|
-
|
|
126
|
-
data = yaml.safe_load(yaml_content)
|
|
124
|
+
data = read_yaml_config_settings_source(settings, base_path)
|
|
127
125
|
snake_case_config = decamelize_config(settings, data)
|
|
128
126
|
return parse_providers(settings, snake_case_config, existing_values)
|
|
129
127
|
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
from typing import Any, Literal
|
|
2
2
|
|
|
3
|
-
from pydantic import Extra, AnyHttpUrl, parse_obj_as
|
|
3
|
+
from pydantic import Extra, AnyHttpUrl, parse_obj_as
|
|
4
|
+
from pydantic.class_validators import root_validator
|
|
4
5
|
from pydantic.env_settings import InitSettingsSource, EnvSettingsSource, BaseSettings
|
|
5
6
|
from pydantic.fields import Field
|
|
6
7
|
from pydantic.main import BaseModel
|
|
7
8
|
|
|
8
9
|
from port_ocean.config.base import BaseOceanSettings, BaseOceanModel
|
|
9
10
|
from port_ocean.core.event_listener import EventListenerSettingsType
|
|
11
|
+
from port_ocean.utils.misc import get_integration_name
|
|
10
12
|
|
|
11
13
|
LogLevelType = Literal["ERROR", "WARNING", "INFO", "DEBUG", "CRITICAL"]
|
|
12
14
|
|
|
@@ -40,13 +42,23 @@ class PortSettings(BaseOceanModel, extra=Extra.allow):
|
|
|
40
42
|
|
|
41
43
|
|
|
42
44
|
class IntegrationSettings(BaseOceanModel, extra=Extra.allow):
|
|
43
|
-
identifier: str
|
|
44
|
-
type: str
|
|
45
|
+
identifier: str = Field(..., min_length=1)
|
|
46
|
+
type: str = Field(..., min_length=1)
|
|
45
47
|
config: dict[str, Any] | BaseModel
|
|
46
48
|
|
|
47
|
-
@
|
|
48
|
-
def
|
|
49
|
-
|
|
49
|
+
@root_validator(pre=True)
|
|
50
|
+
def a(cls, values: dict[str, Any]) -> dict[str, Any]:
|
|
51
|
+
integ_type = values.get("type")
|
|
52
|
+
|
|
53
|
+
if not integ_type:
|
|
54
|
+
integ_type = get_integration_name()
|
|
55
|
+
|
|
56
|
+
values["type"] = integ_type.lower() if integ_type else None
|
|
57
|
+
values["identifier"] = values.get(
|
|
58
|
+
"identifier", f"my-{integ_type}-integration".lower()
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
return values
|
|
50
62
|
|
|
51
63
|
|
|
52
64
|
class IntegrationConfiguration(BaseOceanSettings, extra=Extra.allow):
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from abc import abstractmethod
|
|
2
|
-
from asyncio import Task
|
|
3
2
|
from typing import TypedDict, Callable, Any, Awaitable
|
|
4
3
|
|
|
5
4
|
from pydantic import Extra
|
|
@@ -22,7 +21,6 @@ class BaseEventListener:
|
|
|
22
21
|
events: EventListenerEvents,
|
|
23
22
|
):
|
|
24
23
|
self.events = events
|
|
25
|
-
self._tasks_to_close: list[Task[Any]] = []
|
|
26
24
|
|
|
27
25
|
async def start(self) -> None:
|
|
28
26
|
signal_handler.register(self._stop)
|
|
@@ -32,11 +30,6 @@ class BaseEventListener:
|
|
|
32
30
|
async def _start(self) -> None:
|
|
33
31
|
pass
|
|
34
32
|
|
|
35
|
-
def stop(self) -> None:
|
|
36
|
-
self._stop()
|
|
37
|
-
for task in self._tasks_to_close:
|
|
38
|
-
task.cancel()
|
|
39
|
-
|
|
40
33
|
def _stop(self) -> None:
|
|
41
34
|
"""
|
|
42
35
|
Can be used for event listeners that need cleanup before exiting.
|
|
@@ -10,6 +10,7 @@ from port_ocean.core.event_listener.base import (
|
|
|
10
10
|
EventListenerSettings,
|
|
11
11
|
)
|
|
12
12
|
from port_ocean.utils.repeat import repeat_every
|
|
13
|
+
from port_ocean.utils.signal import signal_handler
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
class PollingEventListenerSettings(EventListenerSettings):
|
|
@@ -79,7 +80,7 @@ class PollingEventListener(BaseEventListener):
|
|
|
79
80
|
running_task: Task[Any] = get_event_loop().create_task(
|
|
80
81
|
self.events["on_resync"]({}) # type: ignore
|
|
81
82
|
)
|
|
82
|
-
|
|
83
|
+
signal_handler.register(running_task.cancel)
|
|
83
84
|
|
|
84
85
|
await running_task
|
|
85
86
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import sys
|
|
3
3
|
import threading
|
|
4
|
-
from
|
|
4
|
+
from contextlib import asynccontextmanager
|
|
5
|
+
from typing import Callable, Any, Dict, AsyncIterator
|
|
5
6
|
|
|
6
7
|
from fastapi import FastAPI, APIRouter
|
|
7
8
|
from loguru import logger
|
|
@@ -21,7 +22,7 @@ from port_ocean.core.integrations.base import BaseIntegration
|
|
|
21
22
|
from port_ocean.log.sensetive import sensitive_log_filter
|
|
22
23
|
from port_ocean.middlewares import request_handler
|
|
23
24
|
from port_ocean.utils.repeat import repeat_every
|
|
24
|
-
from port_ocean.utils.signal import init_signal_handler
|
|
25
|
+
from port_ocean.utils.signal import signal_handler, init_signal_handler
|
|
25
26
|
from port_ocean.version import __integration_version__
|
|
26
27
|
|
|
27
28
|
|
|
@@ -93,14 +94,17 @@ class Ocean:
|
|
|
93
94
|
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
|
|
94
95
|
self.fast_api_app.include_router(self.integration_router, prefix="/integration")
|
|
95
96
|
|
|
96
|
-
@
|
|
97
|
-
async def
|
|
98
|
-
init_signal_handler()
|
|
97
|
+
@asynccontextmanager
|
|
98
|
+
async def lifecycle(_: FastAPI) -> AsyncIterator[None]:
|
|
99
99
|
try:
|
|
100
|
+
init_signal_handler()
|
|
100
101
|
await self.integration.start()
|
|
101
102
|
await self._setup_scheduled_resync()
|
|
103
|
+
yield None
|
|
104
|
+
signal_handler.exit()
|
|
102
105
|
except Exception:
|
|
103
|
-
logger.exception("
|
|
106
|
+
logger.exception("Integration had a fatal error. Shutting down.")
|
|
104
107
|
sys.exit("Server stopped")
|
|
105
108
|
|
|
109
|
+
self.fast_api_app.router.lifespan_context = lifecycle
|
|
106
110
|
await self.fast_api_app(scope, receive, send)
|
|
@@ -29,13 +29,25 @@ def get_function_location(func: Callable[..., Any]) -> str:
|
|
|
29
29
|
return f"{file_path}:{line_number}"
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
def
|
|
32
|
+
def get_pyproject_data() -> dict[str, Any] | None:
|
|
33
33
|
try:
|
|
34
34
|
with open("./pyproject.toml", "rb") as toml_file:
|
|
35
35
|
pyproject_data = tomli.load(toml_file)
|
|
36
|
-
return pyproject_data["tool"]["poetry"]
|
|
36
|
+
return pyproject_data["tool"]["poetry"]
|
|
37
37
|
except (FileNotFoundError, KeyError):
|
|
38
|
-
return
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def get_integration_version() -> str:
|
|
42
|
+
if data := get_pyproject_data():
|
|
43
|
+
return data["version"]
|
|
44
|
+
return ""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_integration_name() -> str:
|
|
48
|
+
if data := get_pyproject_data():
|
|
49
|
+
return data["name"]
|
|
50
|
+
return ""
|
|
39
51
|
|
|
40
52
|
|
|
41
53
|
def get_spec_file(path: Path = Path(".")) -> dict[str, Any] | None:
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import signal
|
|
2
1
|
from typing import Callable, Any
|
|
3
2
|
|
|
4
3
|
from werkzeug.local import LocalProxy, LocalStack
|
|
@@ -13,10 +12,8 @@ from port_ocean.utils.misc import generate_uuid
|
|
|
13
12
|
class SignalHandler:
|
|
14
13
|
def __init__(self) -> None:
|
|
15
14
|
self._handlers: dict[str, Callable[[], Any]] = {}
|
|
16
|
-
signal.signal(signal.SIGINT, lambda _, __: self._exit())
|
|
17
|
-
signal.signal(signal.SIGTERM, lambda _, __: self._exit())
|
|
18
15
|
|
|
19
|
-
def
|
|
16
|
+
def exit(self) -> None:
|
|
20
17
|
"""
|
|
21
18
|
Handles the exit signal.
|
|
22
19
|
"""
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{{ "# This is an example configuration file for the integration service." }}
|
|
2
|
-
{{ "# Please copy this file to config.yaml file in the integration folder and edit it to your needs." }}
|
|
3
|
-
|
|
4
|
-
port:
|
|
5
|
-
clientId: "{{ '{{' }} from env PORT_CLIENT_ID {{ '}}' }}" {{ "# Can be loaded via environment variable: PORT_CLIENT_ID" }}
|
|
6
|
-
clientSecret: "{{ '{{' }} from env PORT_CLIENT_SECRET {{ '}}' }}" {{ "# Can be loaded via environment variable: PORT_CLIENT_SECRET" }}
|
|
7
|
-
{{ "# The event listener to use for the integration service." }}
|
|
8
|
-
eventListener:
|
|
9
|
-
type: KAFKA
|
|
10
|
-
integration:
|
|
11
|
-
{{ "# The identifier of this integration instance." }}
|
|
12
|
-
identifier: "{{ '{{' }} from env INTEGRATION_IDENTIFIER {{ '}}' }}"
|
|
13
|
-
{{ "# The type of the integration." }}
|
|
14
|
-
type: "My Integration type (Gitlab, Jira, etc.)"
|
|
15
|
-
config:
|
|
16
|
-
myGitToken: "{{ '{{' }} from env MY_GIT_TOKEN {{ '}}' }}"
|
|
17
|
-
someApplicationUrl: "https://I-Am-Not-A-Real-Url.com"
|
|
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.5.19 → port_ocean-0.5.20}/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
|
{port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entities_state_applier/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.5.19 → port_ocean-0.5.20}/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.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/entity_processor/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.5.19 → port_ocean-0.5.20}/port_ocean/core/handlers/port_app_config/__init__.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
|