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

@@ -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,21 @@ class PortOceanContext:
63
65
  return self.app.port_client
64
66
 
65
67
  @property
66
- def event_listener_type(self) -> Literal["WEBHOOK", "KAFKA", "POLLING", "ONCE"]:
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(function: RESYNC_EVENT_LISTENER) -> RESYNC_EVENT_LISTENER:
76
+ ) -> Callable[[RESYNC_EVENT_LISTENER], RESYNC_EVENT_LISTENER | None]:
77
+ def wrapper(function: RESYNC_EVENT_LISTENER) -> RESYNC_EVENT_LISTENER | None:
78
+ if not self.app.config.event_listener.should_resync:
79
+ logger.debug(
80
+ "Webhook only event listener is used, resync events are ignored"
81
+ )
82
+ return None
74
83
  return self.integration.on_resync(function, kind)
75
84
 
76
85
  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
  ]
@@ -76,6 +76,7 @@ class BaseEventListener:
76
76
 
77
77
  class EventListenerSettings(BaseOceanModel, extra=Extra.allow):
78
78
  type: str
79
+ should_resync: bool = True
79
80
 
80
81
  def to_request(self) -> dict[str, Any]:
81
82
  """
@@ -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("Starting integration", integration_type=self.context.config.integration.type)
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
 
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.16.1
3
+ Version: 0.17.0
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
@@ -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=2EreWOj-N2H7QUjEt5wGiv5KHP4pTZc70tn_wHcpF4w,4657
66
+ port_ocean/context/ocean.py,sha256=xXVcvfC_mwC74u_NC6F8jk3UwBvw4xJYw3WJnabrcXg,4956
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=mzJ33wRq0kh60fpVdOHVmvMTUQIvz3vxmifyBgwDn0E,889
74
- port_ocean/core/event_listener/base.py,sha256=1Nmpg00OfT2AD2L8eFm4VQEcdG2TClpSWJMhWhAjkEE,2356
75
- port_ocean/core/event_listener/factory.py,sha256=AYYfSHPAF7P5H-uQECXT0JVJjKDHrYkWJJBSL4mGkg8,3697
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,7 +96,7 @@ 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=JxqQApEf7phi_Q_b4U0mKNomxIPdDyKPq3AbApFmhjU,3007
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
101
  port_ocean/core/integrations/mixins/events.py,sha256=Ddfx2L4FpghV38waF8OfVeOV0bHBxNIgjU-q5ffillI,2341
101
102
  port_ocean/core/integrations/mixins/handler.py,sha256=mZ7-0UlG3LcrwJttFbMe-R4xcOU2H_g33tZar7PwTv8,3771
@@ -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=YnqchtVI6diuc6HcyqjcKVqcO0PYnfYjVKVcwKeNO2E,2218
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.16.1.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
160
- port_ocean-0.16.1.dist-info/METADATA,sha256=6Zbwkb10_nBvr-Yan20BoYf42oD77C0je7Ft2UXmZHs,6673
161
- port_ocean-0.16.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
162
- port_ocean-0.16.1.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
163
- port_ocean-0.16.1.dist-info/RECORD,,
160
+ port_ocean-0.17.0.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
161
+ port_ocean-0.17.0.dist-info/METADATA,sha256=nt5XdziRWQIYLJc1UCfeJWClrpOAyQoTKDD2Ge3O48Q,6673
162
+ port_ocean-0.17.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
163
+ port_ocean-0.17.0.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
164
+ port_ocean-0.17.0.dist-info/RECORD,,