port-ocean 0.16.1__py3-none-any.whl → 0.17.1__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.
- port_ocean/context/ocean.py +14 -3
- port_ocean/core/event_listener/__init__.py +8 -0
- port_ocean/core/event_listener/base.py +1 -0
- port_ocean/core/event_listener/factory.py +9 -1
- port_ocean/core/event_listener/webhooks_only.py +41 -0
- port_ocean/core/integrations/base.py +5 -1
- port_ocean/core/integrations/mixins/events.py +3 -1
- port_ocean/run.py +0 -1
- {port_ocean-0.16.1.dist-info → port_ocean-0.17.1.dist-info}/METADATA +1 -1
- {port_ocean-0.16.1.dist-info → port_ocean-0.17.1.dist-info}/RECORD +13 -12
- {port_ocean-0.16.1.dist-info → port_ocean-0.17.1.dist-info}/LICENSE.md +0 -0
- {port_ocean-0.16.1.dist-info → port_ocean-0.17.1.dist-info}/WHEEL +0 -0
- {port_ocean-0.16.1.dist-info → port_ocean-0.17.1.dist-info}/entry_points.txt +0 -0
port_ocean/context/ocean.py
CHANGED
|
@@ -23,6 +23,8 @@ if TYPE_CHECKING:
|
|
|
23
23
|
from port_ocean.ocean import Ocean
|
|
24
24
|
from port_ocean.clients.port.client import PortClient
|
|
25
25
|
|
|
26
|
+
from loguru import logger
|
|
27
|
+
|
|
26
28
|
|
|
27
29
|
class PortOceanContext:
|
|
28
30
|
def __init__(self, app: Union["Ocean", None]) -> None:
|
|
@@ -63,14 +65,23 @@ class PortOceanContext:
|
|
|
63
65
|
return self.app.port_client
|
|
64
66
|
|
|
65
67
|
@property
|
|
66
|
-
def event_listener_type(
|
|
68
|
+
def event_listener_type(
|
|
69
|
+
self,
|
|
70
|
+
) -> Literal["WEBHOOK", "KAFKA", "POLLING", "ONCE", "WEBHOOKS_ONLY"]:
|
|
67
71
|
return self.app.config.event_listener.type
|
|
68
72
|
|
|
69
73
|
def on_resync(
|
|
70
74
|
self,
|
|
71
75
|
kind: str | None = None,
|
|
72
|
-
) -> Callable[[RESYNC_EVENT_LISTENER], RESYNC_EVENT_LISTENER]:
|
|
73
|
-
def wrapper(
|
|
76
|
+
) -> Callable[[RESYNC_EVENT_LISTENER], RESYNC_EVENT_LISTENER | None]:
|
|
77
|
+
def wrapper(
|
|
78
|
+
function: RESYNC_EVENT_LISTENER | None,
|
|
79
|
+
) -> RESYNC_EVENT_LISTENER | None:
|
|
80
|
+
if not self.app.config.event_listener.should_resync:
|
|
81
|
+
logger.debug(
|
|
82
|
+
"Webhook only event listener is used, resync events are ignored"
|
|
83
|
+
)
|
|
84
|
+
return None
|
|
74
85
|
return self.integration.on_resync(function, kind)
|
|
75
86
|
|
|
76
87
|
return wrapper
|
|
@@ -16,12 +16,18 @@ from port_ocean.core.event_listener.once import (
|
|
|
16
16
|
OnceEventListener,
|
|
17
17
|
)
|
|
18
18
|
|
|
19
|
+
from port_ocean.core.event_listener.webhooks_only import (
|
|
20
|
+
WebhooksOnlyEventListener,
|
|
21
|
+
WebhooksOnlyEventListenerSettings,
|
|
22
|
+
)
|
|
23
|
+
|
|
19
24
|
|
|
20
25
|
EventListenerSettingsType = (
|
|
21
26
|
HttpEventListenerSettings
|
|
22
27
|
| KafkaEventListenerSettings
|
|
23
28
|
| PollingEventListenerSettings
|
|
24
29
|
| OnceEventListenerSettings
|
|
30
|
+
| WebhooksOnlyEventListenerSettings
|
|
25
31
|
)
|
|
26
32
|
|
|
27
33
|
__all__ = [
|
|
@@ -34,4 +40,6 @@ __all__ = [
|
|
|
34
40
|
"PollingEventListenerSettings",
|
|
35
41
|
"OnceEventListener",
|
|
36
42
|
"OnceEventListenerSettings",
|
|
43
|
+
"WebhooksOnlyEventListener",
|
|
44
|
+
"WebhooksOnlyEventListenerSettings",
|
|
37
45
|
]
|
|
@@ -17,6 +17,10 @@ from port_ocean.core.event_listener.base import (
|
|
|
17
17
|
BaseEventListener,
|
|
18
18
|
EventListenerEvents,
|
|
19
19
|
)
|
|
20
|
+
from port_ocean.core.event_listener.webhooks_only import (
|
|
21
|
+
WebhooksOnlyEventListener,
|
|
22
|
+
WebhooksOnlyEventListenerSettings,
|
|
23
|
+
)
|
|
20
24
|
from port_ocean.exceptions.core import UnsupportedEventListenerTypeException
|
|
21
25
|
|
|
22
26
|
|
|
@@ -88,7 +92,11 @@ class EventListenerFactory:
|
|
|
88
92
|
config, OnceEventListenerSettings
|
|
89
93
|
), assert_message.format(type(config))
|
|
90
94
|
event_listener = OnceEventListener(wrapped_events, config)
|
|
91
|
-
|
|
95
|
+
case "webhooks_only":
|
|
96
|
+
assert isinstance(
|
|
97
|
+
config, WebhooksOnlyEventListenerSettings
|
|
98
|
+
), assert_message.format(type(config))
|
|
99
|
+
event_listener = WebhooksOnlyEventListener(wrapped_events, config)
|
|
92
100
|
case _:
|
|
93
101
|
raise UnsupportedEventListenerTypeException(
|
|
94
102
|
f"Event listener {_type} not supported"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from typing import Literal
|
|
2
|
+
|
|
3
|
+
from loguru import logger
|
|
4
|
+
|
|
5
|
+
from port_ocean.core.event_listener.base import (
|
|
6
|
+
BaseEventListener,
|
|
7
|
+
EventListenerEvents,
|
|
8
|
+
EventListenerSettings,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class WebhooksOnlyEventListenerSettings(EventListenerSettings):
|
|
13
|
+
"""
|
|
14
|
+
This class inherits from `EventListenerSettings`, which provides a foundation for creating event listener settings.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
type: Literal["WEBHOOKS_ONLY"]
|
|
18
|
+
should_resync: bool = False
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class WebhooksOnlyEventListener(BaseEventListener):
|
|
22
|
+
"""
|
|
23
|
+
No resync event listener.
|
|
24
|
+
|
|
25
|
+
It is used to handle events exclusively through webhooks without supporting resync events.
|
|
26
|
+
|
|
27
|
+
Parameters:
|
|
28
|
+
events (EventListenerEvents): A dictionary containing event types and their corresponding event handlers.
|
|
29
|
+
event_listener_config (OnceEventListenerSettings): The event listener configuration settings.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(
|
|
33
|
+
self,
|
|
34
|
+
events: EventListenerEvents,
|
|
35
|
+
event_listener_config: WebhooksOnlyEventListenerSettings,
|
|
36
|
+
):
|
|
37
|
+
super().__init__(events)
|
|
38
|
+
self.event_listener_config = event_listener_config
|
|
39
|
+
|
|
40
|
+
async def _start(self) -> None:
|
|
41
|
+
logger.info("Starting Webhooks-only event listener")
|
|
@@ -54,13 +54,17 @@ class BaseIntegration(SyncRawMixin, SyncMixin):
|
|
|
54
54
|
"""
|
|
55
55
|
Initializes handlers, establishes integration at the specified port, and starts the event listener.
|
|
56
56
|
"""
|
|
57
|
-
logger.info(
|
|
57
|
+
logger.info(
|
|
58
|
+
"Starting integration",
|
|
59
|
+
integration_type=self.context.config.integration.type,
|
|
60
|
+
)
|
|
58
61
|
if self.started:
|
|
59
62
|
raise IntegrationAlreadyStartedException("Integration already started")
|
|
60
63
|
|
|
61
64
|
if (
|
|
62
65
|
not self.event_strategy["resync"]
|
|
63
66
|
and self.__class__._on_resync == BaseIntegration._on_resync
|
|
67
|
+
and self.context.config.event_listener.should_resync
|
|
64
68
|
):
|
|
65
69
|
raise NotImplementedError("on_resync is not implemented")
|
|
66
70
|
|
|
@@ -46,7 +46,7 @@ class EventsMixin:
|
|
|
46
46
|
return func
|
|
47
47
|
|
|
48
48
|
def on_resync(
|
|
49
|
-
self, func: RESYNC_EVENT_LISTENER, kind: str | None = None
|
|
49
|
+
self, func: RESYNC_EVENT_LISTENER| None, kind: str | None = None
|
|
50
50
|
) -> RESYNC_EVENT_LISTENER:
|
|
51
51
|
"""Register a function as a listener for a "resync" event.
|
|
52
52
|
|
|
@@ -57,6 +57,8 @@ class EventsMixin:
|
|
|
57
57
|
Returns:
|
|
58
58
|
RESYNC_EVENT_LISTENER: The input function, unchanged.
|
|
59
59
|
"""
|
|
60
|
+
if func is None:
|
|
61
|
+
return None
|
|
60
62
|
if kind is None:
|
|
61
63
|
logger.debug(f"Registering resync event listener any kind")
|
|
62
64
|
else:
|
port_ocean/run.py
CHANGED
|
@@ -57,7 +57,6 @@ def run(
|
|
|
57
57
|
# Override config with arguments
|
|
58
58
|
if initialize_port_resources is not None:
|
|
59
59
|
app.config.initialize_port_resources = initialize_port_resources
|
|
60
|
-
|
|
61
60
|
initialize_defaults(app.integration.AppConfigHandlerClass.CONFIG_CLASS, app.config)
|
|
62
61
|
|
|
63
62
|
uvicorn.run(app, host="0.0.0.0", port=application_settings.port)
|
|
@@ -63,20 +63,21 @@ port_ocean/consumers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
63
63
|
port_ocean/consumers/kafka_consumer.py,sha256=N8KocjBi9aR0BOPG8hgKovg-ns_ggpEjrSxqSqF_BSo,4710
|
|
64
64
|
port_ocean/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
65
|
port_ocean/context/event.py,sha256=tf254jMqBW1GBmYDhfXMCkOqHA7C_chaYp1OY3Dfnsg,5869
|
|
66
|
-
port_ocean/context/ocean.py,sha256=
|
|
66
|
+
port_ocean/context/ocean.py,sha256=ViRfr_E7R575_s01vhk8ta5P0mLvm2FF8K2EXR0eD8Y,4986
|
|
67
67
|
port_ocean/context/resource.py,sha256=yDj63URzQelj8zJPh4BAzTtPhpKr9Gw9DRn7I_0mJ1s,1692
|
|
68
68
|
port_ocean/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
69
69
|
port_ocean/core/defaults/__init__.py,sha256=8qCZg8n06WAdMu9s_FiRtDYLGPGHbOuS60vapeUoAks,142
|
|
70
70
|
port_ocean/core/defaults/clean.py,sha256=TOVe5b5FAjFspAkQuKA70k2BClCEFbrQ3xgiAoKXKYE,2427
|
|
71
71
|
port_ocean/core/defaults/common.py,sha256=zJsj7jvlqIMLGXhdASUlbKS8GIAf-FDKKB0O7jB6nx0,4166
|
|
72
72
|
port_ocean/core/defaults/initialize.py,sha256=eX5AMo3fug202lHvnwwGAuYlVbh3yDvUQaimTzre1do,8477
|
|
73
|
-
port_ocean/core/event_listener/__init__.py,sha256=
|
|
74
|
-
port_ocean/core/event_listener/base.py,sha256=
|
|
75
|
-
port_ocean/core/event_listener/factory.py,sha256=
|
|
73
|
+
port_ocean/core/event_listener/__init__.py,sha256=T3E52MKs79fNEW381p7zU9F2vOMvIiiTYWlqRUqnsg0,1135
|
|
74
|
+
port_ocean/core/event_listener/base.py,sha256=dZjz4y8PtiTJAU2fNbvUO7ibHY8mVIgwLUKC9_ydUJ4,2387
|
|
75
|
+
port_ocean/core/event_listener/factory.py,sha256=M4Qi05pI840sjDIbdjUEgYe9Gp5ckoCkX-KgLBxUpZg,4096
|
|
76
76
|
port_ocean/core/event_listener/http.py,sha256=N8HrfFqR3KGKz96pWdp_pP-m30jGtcz_1CkijovkBN8,2565
|
|
77
77
|
port_ocean/core/event_listener/kafka.py,sha256=ulidnp4sz-chXwHsbH9JayVjcxy_mG6ts_Im3YKmLpI,6983
|
|
78
78
|
port_ocean/core/event_listener/once.py,sha256=iL3NkujZOw-7LpxT-EAUJUcAuiAZPm4ZzjHTSt9EdHs,5918
|
|
79
79
|
port_ocean/core/event_listener/polling.py,sha256=d9E3oRLy-Ogb0oadZNxSDgSLIHe4z92uMVwztscZycg,3667
|
|
80
|
+
port_ocean/core/event_listener/webhooks_only.py,sha256=PTWnmbLtbJb3ySfotMpTWMYgDVy9zOSYIIGqNbWK0UU,1214
|
|
80
81
|
port_ocean/core/handlers/__init__.py,sha256=d7ShmS90gLRzGKJA6oNy2Zs_dF2yjkmYZInRhBnO9Rw,572
|
|
81
82
|
port_ocean/core/handlers/base.py,sha256=cTarblazu8yh8xz2FpB-dzDKuXxtoi143XJgPbV_DcM,157
|
|
82
83
|
port_ocean/core/handlers/entities_state_applier/__init__.py,sha256=kgLZDCeCEzi4r-0nzW9k78haOZNf6PX7mJOUr34A4c8,173
|
|
@@ -95,9 +96,9 @@ port_ocean/core/handlers/port_app_config/models.py,sha256=YvYtf_44KD_rN4xK-3xHtd
|
|
|
95
96
|
port_ocean/core/handlers/resync_state_updater/__init__.py,sha256=kG6y-JQGpPfuTHh912L_bctIDCzAK4DN-d00S7rguWU,81
|
|
96
97
|
port_ocean/core/handlers/resync_state_updater/updater.py,sha256=Yg9ET6ZV5B9GW7u6zZA6GlB_71kmvxvYX2FWgQNzMvo,3182
|
|
97
98
|
port_ocean/core/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
98
|
-
port_ocean/core/integrations/base.py,sha256=
|
|
99
|
+
port_ocean/core/integrations/base.py,sha256=eS0WDOfCTim1UOQQrNuP14I6hvT_fr8dof_cr1ls01s,3107
|
|
99
100
|
port_ocean/core/integrations/mixins/__init__.py,sha256=FA1FEKMM6P-L2_m7Q4L20mFa4_RgZnwSRmTCreKcBVM,220
|
|
100
|
-
port_ocean/core/integrations/mixins/events.py,sha256=
|
|
101
|
+
port_ocean/core/integrations/mixins/events.py,sha256=0jKRsBw6lU8Mqs7MaQK4n-t_H6Z4NEkXZ5VWzqTrKEc,2396
|
|
101
102
|
port_ocean/core/integrations/mixins/handler.py,sha256=mZ7-0UlG3LcrwJttFbMe-R4xcOU2H_g33tZar7PwTv8,3771
|
|
102
103
|
port_ocean/core/integrations/mixins/sync.py,sha256=B9fEs8faaYLLikH9GBjE_E61vo0bQDjIGQsQ1SRXOlA,3931
|
|
103
104
|
port_ocean/core/integrations/mixins/sync_raw.py,sha256=Wir4aTSCkIvG6Ny9Eo0Xf55OkSbh_6wHfNSaCffAKJQ,20279
|
|
@@ -125,7 +126,7 @@ port_ocean/log/sensetive.py,sha256=lVKiZH6b7TkrZAMmhEJRhcl67HNM94e56x12DwFgCQk,2
|
|
|
125
126
|
port_ocean/middlewares.py,sha256=9wYCdyzRZGK1vjEJ28FY_DkfwDNENmXp504UKPf5NaQ,2727
|
|
126
127
|
port_ocean/ocean.py,sha256=XxO-aRExs1hcy6aJY_nceu-QXRWB2ZLpkIPPuBkp-bQ,5247
|
|
127
128
|
port_ocean/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
|
-
port_ocean/run.py,sha256=
|
|
129
|
+
port_ocean/run.py,sha256=COoRSmLG4hbsjIW5DzhV0NYVegI9xHd1POv6sg4U1No,2217
|
|
129
130
|
port_ocean/sonar-project.properties,sha256=X_wLzDOkEVmpGLRMb2fg9Rb0DxWwUFSvESId8qpvrPI,73
|
|
130
131
|
port_ocean/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
131
132
|
port_ocean/tests/clients/port/mixins/test_entities.py,sha256=A9myrnkLhKSQrnOLv1Zz2wiOVSxW65Q9RIUIRbn_V7w,1586
|
|
@@ -156,8 +157,8 @@ port_ocean/utils/repeat.py,sha256=0EFWM9d8lLXAhZmAyczY20LAnijw6UbIECf5lpGbOas,32
|
|
|
156
157
|
port_ocean/utils/signal.py,sha256=K-6kKFQTltcmKDhtyZAcn0IMa3sUpOHGOAUdWKgx0_E,1369
|
|
157
158
|
port_ocean/utils/time.py,sha256=pufAOH5ZQI7gXvOvJoQXZXZJV-Dqktoj9Qp9eiRwmJ4,1939
|
|
158
159
|
port_ocean/version.py,sha256=UsuJdvdQlazzKGD3Hd5-U7N69STh8Dq9ggJzQFnu9fU,177
|
|
159
|
-
port_ocean-0.
|
|
160
|
-
port_ocean-0.
|
|
161
|
-
port_ocean-0.
|
|
162
|
-
port_ocean-0.
|
|
163
|
-
port_ocean-0.
|
|
160
|
+
port_ocean-0.17.1.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
|
161
|
+
port_ocean-0.17.1.dist-info/METADATA,sha256=0OWjckTIgh6CjguvP_HQccZLFi2DSh5GrTS52PaJuqA,6673
|
|
162
|
+
port_ocean-0.17.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
163
|
+
port_ocean-0.17.1.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
|
|
164
|
+
port_ocean-0.17.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|