port-ocean 0.5.18__py3-none-any.whl → 0.5.20__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.

Potentially problematic release.


This version of port-ocean might be problematic. Click here for more details.

@@ -1,4 +1,3 @@
1
- type: {{cookiecutter.integration_slug}}
2
1
  description: {{cookiecutter.integration_name}} integration for Port Ocean
3
2
  icon: Cookiecutter # Should be one of the available icons in Port
4
3
  features:
@@ -1,5 +1,5 @@
1
1
  [tool.poetry]
2
- name = "{{cookiecutter.integration_name}}"
2
+ name = "{{cookiecutter.integration_slug}}"
3
3
  version = "0.1.0"
4
4
  description = "{{cookiecutter.integration_short_description}}"
5
5
  authors = ["{{cookiecutter.full_name}} <{{cookiecutter.email}}>"]
port_ocean/config/base.py CHANGED
@@ -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
- raise FileNotFoundError(f"Could not open yaml settings file at: {path}")
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
- yaml_content = read_yaml_config_settings_source(settings, base_path)
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, validator
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
 
@@ -36,16 +38,27 @@ class PortSettings(BaseOceanModel, extra=Extra.allow):
36
38
  client_id: str = Field(..., sensitive=True)
37
39
  client_secret: str = Field(..., sensitive=True)
38
40
  base_url: AnyHttpUrl = parse_obj_as(AnyHttpUrl, "https://api.getport.io")
41
+ port_app_config_cache_ttl: int = 60
39
42
 
40
43
 
41
44
  class IntegrationSettings(BaseOceanModel, extra=Extra.allow):
42
- identifier: str
43
- type: str
45
+ identifier: str = Field(..., min_length=1)
46
+ type: str = Field(..., min_length=1)
44
47
  config: dict[str, Any] | BaseModel
45
48
 
46
- @validator("identifier", "type")
47
- def validate_lower(cls, v: str) -> str:
48
- return v.lower()
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
49
62
 
50
63
 
51
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
- self._tasks_to_close.append(running_task)
83
+ signal_handler.register(running_task.cancel)
83
84
 
84
85
  await running_task
85
86
 
@@ -5,8 +5,36 @@ from loguru import logger
5
5
  from pydantic import ValidationError
6
6
 
7
7
  from port_ocean.context.event import event
8
+ from port_ocean.context.ocean import PortOceanContext
8
9
  from port_ocean.core.handlers.base import BaseHandler
9
10
  from port_ocean.core.handlers.port_app_config.models import PortAppConfig
11
+ from port_ocean.utils.misc import get_time
12
+
13
+
14
+ class PortAppConfigCache:
15
+ _port_app_config: PortAppConfig | None
16
+ _retrieval_time: float
17
+
18
+ def __init__(self, cache_ttl: int):
19
+ self._cache_ttl = cache_ttl
20
+
21
+ @property
22
+ def port_app_config(self) -> PortAppConfig:
23
+ if self._port_app_config is None:
24
+ raise ValueError("Port app config is not set")
25
+ return self._port_app_config
26
+
27
+ @port_app_config.setter
28
+ def port_app_config(self, value: PortAppConfig) -> None:
29
+ self._retrieval_time = get_time()
30
+ self._port_app_config = value
31
+
32
+ @property
33
+ def is_cache_invalid(self) -> bool:
34
+ return (
35
+ not self._port_app_config
36
+ or self._retrieval_time + self._cache_ttl < get_time()
37
+ )
10
38
 
11
39
 
12
40
  class BasePortAppConfig(BaseHandler):
@@ -21,24 +49,34 @@ class BasePortAppConfig(BaseHandler):
21
49
 
22
50
  CONFIG_CLASS: Type[PortAppConfig] = PortAppConfig
23
51
 
52
+ def __init__(self, context: PortOceanContext):
53
+ super().__init__(context)
54
+ self._app_config_cache = PortAppConfigCache(
55
+ self.context.config.port.port_app_config_cache_ttl
56
+ )
57
+
24
58
  @abstractmethod
25
59
  async def _get_port_app_config(self) -> dict[str, Any]:
26
60
  pass
27
61
 
28
- async def get_port_app_config(self) -> PortAppConfig:
29
- """Retrieve and parse the port application configuration.
62
+ async def get_port_app_config(self, use_cache: bool = True) -> PortAppConfig:
63
+ """
64
+ Retrieve and parse the port application configuration.
30
65
 
31
- Returns:
32
- PortAppConfig: The parsed port application configuration.
66
+ :param use_cache: Determines whether to use the cached port-app-config if it exists, or to fetch it regardless
67
+ :return: The parsed port application configuration.
33
68
  """
34
- raw_config = await self._get_port_app_config()
35
- try:
36
- config = self.CONFIG_CLASS.parse_obj(raw_config)
37
- except ValidationError:
38
- logger.error(
39
- "Invalid port app config found. Please check that the integration has been configured correctly."
40
- )
41
- raise
42
-
43
- event.port_app_config = config
44
- return config
69
+ if not use_cache or self._app_config_cache.is_cache_invalid:
70
+ raw_config = await self._get_port_app_config()
71
+ try:
72
+ self._app_config_cache.port_app_config = self.CONFIG_CLASS.parse_obj(
73
+ raw_config
74
+ )
75
+ except ValidationError:
76
+ logger.error(
77
+ "Invalid port app config found. Please check that the integration has been configured correctly."
78
+ )
79
+ raise
80
+
81
+ event.port_app_config = self._app_config_cache.port_app_config
82
+ return self._app_config_cache.port_app_config
@@ -362,7 +362,11 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
362
362
  EventType.RESYNC,
363
363
  trigger_type=trigger_type,
364
364
  ):
365
- app_config = await self.port_app_config_handler.get_port_app_config()
365
+ # If a resync is triggered due to a mappings change, we want to make sure that we have the updated version
366
+ # rather than the old cache
367
+ app_config = await self.port_app_config_handler.get_port_app_config(
368
+ use_cache=False
369
+ )
366
370
 
367
371
  creation_results: list[tuple[list[Entity], list[Exception]]] = []
368
372
 
port_ocean/core/utils.py CHANGED
@@ -28,14 +28,6 @@ def is_same_entity(first_entity: Entity, second_entity: Entity) -> bool:
28
28
  )
29
29
 
30
30
 
31
- def get_unique(array: list[Entity]) -> list[Entity]:
32
- result: list[Entity] = []
33
- for item in array:
34
- if all(not is_same_entity(item, seen_item) for seen_item in result):
35
- result.append(item)
36
- return result
37
-
38
-
39
31
  def get_port_diff(
40
32
  before: Iterable[Entity],
41
33
  after: Iterable[Entity],
port_ocean/ocean.py CHANGED
@@ -1,7 +1,8 @@
1
1
  import asyncio
2
2
  import sys
3
3
  import threading
4
- from typing import Callable, Any, Dict
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
- @self.fast_api_app.on_event("startup")
97
- async def startup() -> None:
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("Failed to start integration")
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)
port_ocean/utils/misc.py CHANGED
@@ -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 get_integration_version() -> str:
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"]["version"]
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:
@@ -33,6 +33,7 @@ async def process_in_queue(
33
33
  This function executes multiple asynchronous tasks in a bounded way
34
34
  (e.g. having 200 tasks to execute, while running only 20 concurrently),
35
35
  to prevent overload and memory issues when dealing with large sets of data and tasks.
36
+ read more -> https://stackoverflow.com/questions/38831322/making-1-milion-requests-with-aiohttp-asyncio-literally
36
37
 
37
38
  Usage:
38
39
  ```python
@@ -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 _exit(self) -> None:
16
+ def exit(self) -> None:
20
17
  """
21
18
  Handles the exit signal.
22
19
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.5.18
3
+ Version: 0.5.20
4
4
  Summary: Port Ocean is a CLI tool for managing your Port projects.
5
5
  Home-page: https://app.getport.io
6
6
  Keywords: ocean,port-ocean,port
@@ -20,17 +20,16 @@ port_ocean/cli/cookiecutter/hooks/post_gen_project.py,sha256=4WpFM5O7FXuaqBMrhtn
20
20
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.dockerignore,sha256=9Mz_WI7XBpKzlJ7ILb4vlcuzYkh98Ql3bP_5GHN1sRY,1034
21
21
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore,sha256=32p1lDW_g5hyBz486GWfDeR9m7ikFlASVri5a8vmNoo,2698
22
22
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore,sha256=kCpRPdl3S_jqYYZaOrc0-xa6-l3KqVjNRXc6jCkd_-Q,12
23
- port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml,sha256=Yq06gYoC6jFWES5mxlvJGFTGXbfD7E9R8j_PDbVIM3M,497
23
+ port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml,sha256=jTYvu-Iayl-bxc917Y7ejcC9KyvH-LSq4-bdYZCYsuM,457
24
24
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md,sha256=nzAmB0Bjnd2eZo79OjrlyVOdpTBHTmTxvO7c2C8Q-VQ,292
25
25
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Dockerfile,sha256=Hh1dBnL959V2n28pmqFpXSrNvSMQjX6fDCUos8ITiu0,326
26
26
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Makefile,sha256=kTa72qEp8pi-joOH6zl8oeIgjEHSCF628p2074yHHNA,1779
27
27
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md,sha256=5VZmgDRW9gO4d8UuzkujslOIDfIDBiAGL2Hd74HK770,468
28
28
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore,sha256=kCpRPdl3S_jqYYZaOrc0-xa6-l3KqVjNRXc6jCkd_-Q,12
29
- port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/config.yaml,sha256=zKaBQNCbWEE3MFxDHaMn9NIeBGVPiZUV6cBjH35f2kw,906
30
29
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py,sha256=_TRsA2s6GV2E3CTI8CHcsH-ZuH4_Eh5-juDXWaET0ho,65
31
30
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py,sha256=KxxtBrRygYOP0bulXySVYwX0fm_mm3QHqeEqwDwgXgY,1669
32
31
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml,sha256=kENq8nNmFPIzw9vySheyG4xHxAPuBSpZO1CYGD6G2NE,46
33
- port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml,sha256=r7xF1yf7gtKIXhm5WKvtbVht4JHHtLxM249BbS58J-o,1928
32
+ port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml,sha256=zmkwpiBDiDhMKp1egULLnx6ftVBcVYh4ztGohs53rWA,1928
34
33
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties,sha256=timmRpoSd50BdxLf45OcFUk2qs855z610kzz3yLAqJw,124
35
34
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
35
  port_ocean/cli/utils.py,sha256=IUK2UbWqjci-lrcDdynZXqVP5B5TcjF0w5CpEVUks-k,54
@@ -47,9 +46,9 @@ port_ocean/clients/port/retry_transport.py,sha256=PtIZOAZ6V-ncpVysRUsPOgt8Sf01QL
47
46
  port_ocean/clients/port/types.py,sha256=nvlgiAq4WH5_F7wQbz_GAWl-faob84LVgIjZ2Ww5mTk,451
48
47
  port_ocean/clients/port/utils.py,sha256=O9mBu6zp4TfpS4SQ3qCPpn9ZVyYF8GKnji4UnYhM3yg,2373
49
48
  port_ocean/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- port_ocean/config/base.py,sha256=8JoyjTPJS_BeYMnGnKN_q4SDaI-ydctuKl9ccK-Uq78,6474
49
+ port_ocean/config/base.py,sha256=J_FUvlo0D4FbEbr4mgJsbGB5JjW9I7zMwfekj6T30KY,6389
51
50
  port_ocean/config/dynamic.py,sha256=qOFkRoJsn_BW7581omi_AoMxoHqasf_foxDQ_G11_SI,2030
52
- port_ocean/config/settings.py,sha256=5bQmOAIZ2IMDzUEsiVkfZokv9LxHLPOUVKA0TPoJh68,1769
51
+ port_ocean/config/settings.py,sha256=cmDA2HfJW2N4XYH0UYz8G2H84IT_1XwdeFGOoaH3kTQ,2268
53
52
  port_ocean/consumers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
53
  port_ocean/consumers/kafka_consumer.py,sha256=N8KocjBi9aR0BOPG8hgKovg-ns_ggpEjrSxqSqF_BSo,4710
55
54
  port_ocean/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -62,12 +61,12 @@ port_ocean/core/defaults/clean.py,sha256=S3UAfca-oU89WJKIB4OgGjGjPr0vxBQ2aRZsLTZ
62
61
  port_ocean/core/defaults/common.py,sha256=QnLFTkT3yIWIRtLQb7fUvvfe5AfInYJy0q5LjlzHkOw,3553
63
62
  port_ocean/core/defaults/initialize.py,sha256=z7IdE_WN1_gF5_60OwSlid9-di7pYOJhzX8VdFjkXdc,7702
64
63
  port_ocean/core/event_listener/__init__.py,sha256=mzJ33wRq0kh60fpVdOHVmvMTUQIvz3vxmifyBgwDn0E,889
65
- port_ocean/core/event_listener/base.py,sha256=ntd41fGg_8X58hgnOrZaUVhDM1XbJSk5shf_MW3eAMQ,1327
64
+ port_ocean/core/event_listener/base.py,sha256=4RujgPz4VfDFlviu4qLGJFnJougSCL-Ewf0rfTQfwgc,1133
66
65
  port_ocean/core/event_listener/factory.py,sha256=AYYfSHPAF7P5H-uQECXT0JVJjKDHrYkWJJBSL4mGkg8,3697
67
66
  port_ocean/core/event_listener/http.py,sha256=UjONC_OODHjpGjvsBPAvO6zGzosdmv5Hx96B4WFqpXs,2577
68
67
  port_ocean/core/event_listener/kafka.py,sha256=0U_TwmlmtS8N2lprkCmnyOmdqOAvghWxHhSfyu46kEs,6875
69
68
  port_ocean/core/event_listener/once.py,sha256=KdvUqjIcyp8XqhY1GfR_KYJfParFIRrjCtcMf3JMegk,2150
70
- port_ocean/core/event_listener/polling.py,sha256=GFb89aqC2PrqDkah6gdxjsX1s4q3B87w0dVlZlUbScU,3485
69
+ port_ocean/core/event_listener/polling.py,sha256=3UxjgQJly5y-hA8R798oFWb7bFsYMxSc6GRozA3biiM,3539
71
70
  port_ocean/core/handlers/__init__.py,sha256=R2HIRD8JTzupY4mXuXveMBQbuiPiiB3Oivmpc5C2jjI,610
72
71
  port_ocean/core/handlers/base.py,sha256=cTarblazu8yh8xz2FpB-dzDKuXxtoi143XJgPbV_DcM,157
73
72
  port_ocean/core/handlers/entities_state_applier/__init__.py,sha256=kgLZDCeCEzi4r-0nzW9k78haOZNf6PX7mJOUr34A4c8,173
@@ -81,7 +80,7 @@ port_ocean/core/handlers/entity_processor/base.py,sha256=4JVCAAohEKtl8FdlnuyIxJ1
81
80
  port_ocean/core/handlers/entity_processor/jq_entity_processor.py,sha256=FDpMeBntu5x-p2DGuk8BpQVe1zy7afJ93nWfrLnZPRc,5479
82
81
  port_ocean/core/handlers/port_app_config/__init__.py,sha256=8AAT5OthiVM7KCcM34iEgEeXtn2pRMrT4Dze5r1Ixbk,134
83
82
  port_ocean/core/handlers/port_app_config/api.py,sha256=6VbKPwFzsWG0IYsVD81hxSmfqtHUFqrfUuj1DBX5g4w,853
84
- port_ocean/core/handlers/port_app_config/base.py,sha256=nnMZ4jH6a-4Of9Cn-apMsU0CgNLD9avd5q0gRmc7nZ8,1495
83
+ port_ocean/core/handlers/port_app_config/base.py,sha256=oufdNLzUmEgJY5PgIz75zDlowWrjA-y8WR4UnM58E58,2897
85
84
  port_ocean/core/handlers/port_app_config/models.py,sha256=WtF2uW4KPUPfDpy6E2tl9qXh5GUcDucVvKt0DCTYv6w,1985
86
85
  port_ocean/core/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
86
  port_ocean/core/integrations/base.py,sha256=3jU0skK_gMLB8a_fN8whsRKva-Dz058TFoI0vXTbryU,3193
@@ -89,11 +88,11 @@ port_ocean/core/integrations/mixins/__init__.py,sha256=FA1FEKMM6P-L2_m7Q4L20mFa4
89
88
  port_ocean/core/integrations/mixins/events.py,sha256=Ddfx2L4FpghV38waF8OfVeOV0bHBxNIgjU-q5ffillI,2341
90
89
  port_ocean/core/integrations/mixins/handler.py,sha256=mZ7-0UlG3LcrwJttFbMe-R4xcOU2H_g33tZar7PwTv8,3771
91
90
  port_ocean/core/integrations/mixins/sync.py,sha256=TKqRytxXONVhuCo3CB3rDvWNbITnZz33TYTDs3SWWVk,3880
92
- port_ocean/core/integrations/mixins/sync_raw.py,sha256=kWZ44L2M2G6B0n3oOqF1Ko9Rct06CXnTnWY25Q2eh3c,15049
91
+ port_ocean/core/integrations/mixins/sync_raw.py,sha256=iWI8fXd36TwUNFDAgEJj4SGvWwDOQsez1sQpc2EriKQ,15253
93
92
  port_ocean/core/integrations/mixins/utils.py,sha256=7y1rGETZIjOQadyIjFJXIHKkQFKx_SwiP-TrAIsyyLY,2303
94
93
  port_ocean/core/models.py,sha256=bDO_I4Yd33TEZIh2QSV8UwXQIuwE7IgrINkYDHI0dkc,714
95
94
  port_ocean/core/ocean_types.py,sha256=ltnn22eRuDMFW02kIgmIAu6S06-i9jJV2NJ-MZcwwj0,879
96
- port_ocean/core/utils.py,sha256=n_TcPlZ03Skif45bwQ6_qb1ut0H-42aPTmbYxqAh9f8,2059
95
+ port_ocean/core/utils.py,sha256=6rYtsb1bjW8owxWngGiV3awMLZkP3tXZdxXClmRD1SU,1824
97
96
  port_ocean/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
97
  port_ocean/exceptions/api.py,sha256=TLmTMqn4uHGaHgZK8PMIJ0TVJlPB4iP7xl9rx7GtCyY,426
99
98
  port_ocean/exceptions/base.py,sha256=uY4DX7fIITDFfemCJDWpaZi3bD51lcANc5swpoNvMJA,46
@@ -110,7 +109,7 @@ port_ocean/log/handlers.py,sha256=k9G_Mb4ga2-Jke9irpdlYqj6EYiwv0gEsh4TgyqqOmI,28
110
109
  port_ocean/log/logger_setup.py,sha256=NGU9EdRTPLloiHdgSw0JYaYGr9mx1hYJUEPFHP6BA14,2175
111
110
  port_ocean/log/sensetive.py,sha256=4aD7tdOwoDGi69ah1E4qLnpjE7G6r_UxJ1MwxYit02g,2335
112
111
  port_ocean/middlewares.py,sha256=6GrhldYAazxSwK2TbS-J28XdZ-9wO3PgCcyIMhnnJvI,2480
113
- port_ocean/ocean.py,sha256=6MAg7qEVRqpMrKaFiuOKFYc4IEGnSQQJQSigk5Mge8w,4072
112
+ port_ocean/ocean.py,sha256=nRTTh6faPrt77ozvKBFk6eCNxwzKcTDzJ4KPgpO4VRk,4304
114
113
  port_ocean/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
114
  port_ocean/run.py,sha256=vyShtqg_jEiE6M4SJpci6c4oRD9k2ztesAXEx_6Sc9M,1906
116
115
  port_ocean/sonar-project.properties,sha256=X_wLzDOkEVmpGLRMb2fg9Rb0DxWwUFSvESId8qpvrPI,73
@@ -118,13 +117,13 @@ port_ocean/utils/__init__.py,sha256=KMGnCPXZJbNwtgxtyMycapkDz8tpSyw23MSYT3iVeHs,
118
117
  port_ocean/utils/async_http.py,sha256=arnH458TExn2Dju_Sy6pHas_vF5RMWnOp-jBz5WAAcE,1226
119
118
  port_ocean/utils/async_iterators.py,sha256=buFBiPdsqkNMCk91h6ZG8hJa181j7RjgHajbfgeB8A8,1608
120
119
  port_ocean/utils/cache.py,sha256=3KItZDE2yVrbVDr-hoM8lNna8s2dlpxhP4ICdLjH4LQ,2231
121
- port_ocean/utils/misc.py,sha256=2XmO8W0SgPjV0rd9HZvrHhoMlHprIwmMFsINxlAmgyw,1723
122
- port_ocean/utils/queue_utils.py,sha256=9z3C1-Sv5g3CXNKg2QsTCXslSj0ImZbtEOkNtgarLPE,2382
120
+ port_ocean/utils/misc.py,sha256=WZjrEDRfyeqbesVt_Nkp2yjazbKF-BOnxJMFAI721yQ,1965
121
+ port_ocean/utils/queue_utils.py,sha256=Pzb6e8PcjylZpXcb9EEIK-QcTty_E2k1egMiJF5J_8Q,2500
123
122
  port_ocean/utils/repeat.py,sha256=0EFWM9d8lLXAhZmAyczY20LAnijw6UbIECf5lpGbOas,3231
124
- port_ocean/utils/signal.py,sha256=Fab0049Cjs69TPTQgvEvilaVZKACQr6tGkRdySjNCi8,1515
123
+ port_ocean/utils/signal.py,sha256=K-6kKFQTltcmKDhtyZAcn0IMa3sUpOHGOAUdWKgx0_E,1369
125
124
  port_ocean/version.py,sha256=UsuJdvdQlazzKGD3Hd5-U7N69STh8Dq9ggJzQFnu9fU,177
126
- port_ocean-0.5.18.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
127
- port_ocean-0.5.18.dist-info/METADATA,sha256=ANv4ALqYFuYCXfY2p-mYG3v7Zn3kYwVCPI14XTmz7xU,6554
128
- port_ocean-0.5.18.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
129
- port_ocean-0.5.18.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
130
- port_ocean-0.5.18.dist-info/RECORD,,
125
+ port_ocean-0.5.20.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
126
+ port_ocean-0.5.20.dist-info/METADATA,sha256=P-lM1MWrk7XNev6ZAJ1h4ZgnBXxhkNs7K6pEWjMJ9Mk,6554
127
+ port_ocean-0.5.20.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
128
+ port_ocean-0.5.20.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
129
+ port_ocean-0.5.20.dist-info/RECORD,,
@@ -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"