port-ocean 0.18.1__py3-none-any.whl → 0.18.3__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.
- integrations/_infra/Makefile +9 -1
- port_ocean/clients/port/client.py +3 -0
- port_ocean/clients/port/mixins/integrations.py +56 -4
- port_ocean/clients/port/mixins/organization.py +31 -0
- port_ocean/config/settings.py +17 -1
- port_ocean/core/defaults/initialize.py +56 -8
- port_ocean/core/integrations/mixins/sync_raw.py +8 -13
- port_ocean/core/models.py +6 -1
- port_ocean/exceptions/port_defaults.py +10 -0
- port_ocean/tests/clients/port/mixins/test_organization_mixin.py +27 -0
- {port_ocean-0.18.1.dist-info → port_ocean-0.18.3.dist-info}/METADATA +1 -1
- {port_ocean-0.18.1.dist-info → port_ocean-0.18.3.dist-info}/RECORD +15 -13
- {port_ocean-0.18.1.dist-info → port_ocean-0.18.3.dist-info}/LICENSE.md +0 -0
- {port_ocean-0.18.1.dist-info → port_ocean-0.18.3.dist-info}/WHEEL +0 -0
- {port_ocean-0.18.1.dist-info → port_ocean-0.18.3.dist-info}/entry_points.txt +0 -0
integrations/_infra/Makefile
CHANGED
|
@@ -41,7 +41,7 @@ define deactivate_virtualenv
|
|
|
41
41
|
fi
|
|
42
42
|
endef
|
|
43
43
|
|
|
44
|
-
.SILENT: install install/prod install/local-core lint lint/fix run test clean
|
|
44
|
+
.SILENT: install install/prod install/local-core lint lint/fix run test clean seed
|
|
45
45
|
|
|
46
46
|
install:
|
|
47
47
|
$(call deactivate_virtualenv) && \
|
|
@@ -85,3 +85,11 @@ clean:
|
|
|
85
85
|
rm -rf .tox/
|
|
86
86
|
rm -rf docs/_build
|
|
87
87
|
rm -rf dist/
|
|
88
|
+
|
|
89
|
+
seed:
|
|
90
|
+
@if [ -f "tests/seed_data.py" ]; then \
|
|
91
|
+
$(ACTIVATE) && python tests/seed_data.py; \
|
|
92
|
+
else \
|
|
93
|
+
echo "No seeding script found. Create tests/seed_data.py for this integration if needed."; \
|
|
94
|
+
exit 0; \
|
|
95
|
+
fi
|
|
@@ -5,6 +5,7 @@ from port_ocean.clients.port.mixins.blueprints import BlueprintClientMixin
|
|
|
5
5
|
from port_ocean.clients.port.mixins.entities import EntityClientMixin
|
|
6
6
|
from port_ocean.clients.port.mixins.integrations import IntegrationClientMixin
|
|
7
7
|
from port_ocean.clients.port.mixins.migrations import MigrationClientMixin
|
|
8
|
+
from port_ocean.clients.port.mixins.organization import OrganizationClientMixin
|
|
8
9
|
from port_ocean.clients.port.types import (
|
|
9
10
|
KafkaCreds,
|
|
10
11
|
)
|
|
@@ -21,6 +22,7 @@ class PortClient(
|
|
|
21
22
|
IntegrationClientMixin,
|
|
22
23
|
BlueprintClientMixin,
|
|
23
24
|
MigrationClientMixin,
|
|
25
|
+
OrganizationClientMixin,
|
|
24
26
|
):
|
|
25
27
|
def __init__(
|
|
26
28
|
self,
|
|
@@ -48,6 +50,7 @@ class PortClient(
|
|
|
48
50
|
)
|
|
49
51
|
BlueprintClientMixin.__init__(self, self.auth, self.client)
|
|
50
52
|
MigrationClientMixin.__init__(self, self.auth, self.client)
|
|
53
|
+
OrganizationClientMixin.__init__(self, self.auth, self.client)
|
|
51
54
|
|
|
52
55
|
async def get_kafka_creds(self) -> KafkaCreds:
|
|
53
56
|
logger.info("Fetching organization kafka credentials")
|
|
@@ -1,16 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
import asyncio
|
|
2
|
+
from typing import Any, Dict, TYPE_CHECKING, Optional, TypedDict
|
|
2
3
|
from urllib.parse import quote_plus
|
|
3
4
|
|
|
4
5
|
import httpx
|
|
5
6
|
from loguru import logger
|
|
6
7
|
from port_ocean.clients.port.authentication import PortAuthentication
|
|
7
8
|
from port_ocean.clients.port.utils import handle_status_code
|
|
9
|
+
from port_ocean.exceptions.port_defaults import DefaultsProvisionFailed
|
|
8
10
|
from port_ocean.log.sensetive import sensitive_log_filter
|
|
9
11
|
|
|
10
12
|
if TYPE_CHECKING:
|
|
11
13
|
from port_ocean.core.handlers.port_app_config.models import PortAppConfig
|
|
12
14
|
|
|
13
15
|
|
|
16
|
+
INTEGRATION_POLLING_INTERVAL_INITIAL_SECONDS = 3
|
|
17
|
+
INTEGRATION_POLLING_INTERVAL_BACKOFF_FACTOR = 1.15
|
|
18
|
+
INTEGRATION_POLLING_RETRY_LIMIT = 30
|
|
19
|
+
CREATE_RESOURCES_PARAM_NAME = "integration_modes"
|
|
20
|
+
CREATE_RESOURCES_PARAM_VALUE = ["create_resources"]
|
|
21
|
+
|
|
22
|
+
|
|
14
23
|
class LogAttributes(TypedDict):
|
|
15
24
|
ingestUrl: str
|
|
16
25
|
|
|
@@ -50,12 +59,41 @@ class IntegrationClientMixin:
|
|
|
50
59
|
self._log_attributes = response["logAttributes"]
|
|
51
60
|
return self._log_attributes
|
|
52
61
|
|
|
62
|
+
async def _poll_integration_until_default_provisioning_is_complete(
|
|
63
|
+
self,
|
|
64
|
+
) -> Dict[str, Any]:
|
|
65
|
+
attempts = 0
|
|
66
|
+
current_interval_seconds = INTEGRATION_POLLING_INTERVAL_INITIAL_SECONDS
|
|
67
|
+
|
|
68
|
+
while attempts < INTEGRATION_POLLING_RETRY_LIMIT:
|
|
69
|
+
logger.info(
|
|
70
|
+
f"Fetching created integration and validating config, attempt {attempts+1}/{INTEGRATION_POLLING_RETRY_LIMIT}",
|
|
71
|
+
attempt=attempts,
|
|
72
|
+
)
|
|
73
|
+
response = await self._get_current_integration()
|
|
74
|
+
integration_json = response.json()
|
|
75
|
+
if integration_json.get("integration", {}).get("config", {}):
|
|
76
|
+
return integration_json
|
|
77
|
+
|
|
78
|
+
logger.info(
|
|
79
|
+
f"Integration config is still being provisioned, retrying in {current_interval_seconds} seconds"
|
|
80
|
+
)
|
|
81
|
+
await asyncio.sleep(current_interval_seconds)
|
|
82
|
+
|
|
83
|
+
attempts += 1
|
|
84
|
+
current_interval_seconds = int(
|
|
85
|
+
current_interval_seconds * INTEGRATION_POLLING_INTERVAL_BACKOFF_FACTOR
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
raise DefaultsProvisionFailed(INTEGRATION_POLLING_RETRY_LIMIT)
|
|
89
|
+
|
|
53
90
|
async def create_integration(
|
|
54
91
|
self,
|
|
55
92
|
_type: str,
|
|
56
93
|
changelog_destination: dict[str, Any],
|
|
57
94
|
port_app_config: Optional["PortAppConfig"] = None,
|
|
58
|
-
|
|
95
|
+
create_port_resources_origin_in_port: Optional[bool] = False,
|
|
96
|
+
) -> Dict[str, Any]:
|
|
59
97
|
logger.info(f"Creating integration with id: {self.integration_identifier}")
|
|
60
98
|
headers = await self.auth.headers()
|
|
61
99
|
json = {
|
|
@@ -65,12 +103,26 @@ class IntegrationClientMixin:
|
|
|
65
103
|
"changelogDestination": changelog_destination,
|
|
66
104
|
"config": {},
|
|
67
105
|
}
|
|
68
|
-
|
|
106
|
+
|
|
107
|
+
query_params = {}
|
|
108
|
+
|
|
109
|
+
if create_port_resources_origin_in_port:
|
|
110
|
+
query_params[CREATE_RESOURCES_PARAM_NAME] = CREATE_RESOURCES_PARAM_VALUE
|
|
111
|
+
|
|
112
|
+
if port_app_config and not create_port_resources_origin_in_port:
|
|
69
113
|
json["config"] = port_app_config.to_request()
|
|
70
114
|
response = await self.client.post(
|
|
71
|
-
f"{self.auth.api_url}/integration",
|
|
115
|
+
f"{self.auth.api_url}/integration",
|
|
116
|
+
headers=headers,
|
|
117
|
+
json=json,
|
|
118
|
+
params=query_params,
|
|
72
119
|
)
|
|
73
120
|
handle_status_code(response)
|
|
121
|
+
if create_port_resources_origin_in_port:
|
|
122
|
+
result = (
|
|
123
|
+
await self._poll_integration_until_default_provisioning_is_complete()
|
|
124
|
+
)
|
|
125
|
+
return result["integration"]
|
|
74
126
|
return response.json()["integration"]
|
|
75
127
|
|
|
76
128
|
async def patch_integration(
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
import httpx
|
|
3
|
+
from loguru import logger
|
|
4
|
+
from port_ocean.clients.port.authentication import PortAuthentication
|
|
5
|
+
from port_ocean.clients.port.utils import handle_status_code
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class OrganizationClientMixin:
|
|
9
|
+
def __init__(
|
|
10
|
+
self,
|
|
11
|
+
auth: PortAuthentication,
|
|
12
|
+
client: httpx.AsyncClient,
|
|
13
|
+
):
|
|
14
|
+
self.auth = auth
|
|
15
|
+
self.client = client
|
|
16
|
+
|
|
17
|
+
async def _get_organization_feature_flags(self) -> httpx.Response:
|
|
18
|
+
logger.info("Fetching organization feature flags")
|
|
19
|
+
|
|
20
|
+
response = await self.client.get(
|
|
21
|
+
f"{self.auth.api_url}/organization",
|
|
22
|
+
headers=await self.auth.headers(),
|
|
23
|
+
)
|
|
24
|
+
return response
|
|
25
|
+
|
|
26
|
+
async def get_organization_feature_flags(
|
|
27
|
+
self, should_raise: bool = True, should_log: bool = True
|
|
28
|
+
) -> List[str]:
|
|
29
|
+
response = await self._get_organization_feature_flags()
|
|
30
|
+
handle_status_code(response, should_raise, should_log)
|
|
31
|
+
return response.json().get("organization", {}).get("featureFlags", [])
|
port_ocean/config/settings.py
CHANGED
|
@@ -8,7 +8,7 @@ from pydantic.main import BaseModel
|
|
|
8
8
|
|
|
9
9
|
from port_ocean.config.base import BaseOceanSettings, BaseOceanModel
|
|
10
10
|
from port_ocean.core.event_listener import EventListenerSettingsType
|
|
11
|
-
from port_ocean.core.models import Runtime
|
|
11
|
+
from port_ocean.core.models import CreatePortResourcesOrigin, Runtime
|
|
12
12
|
from port_ocean.utils.misc import get_integration_name, get_spec_file
|
|
13
13
|
|
|
14
14
|
LogLevelType = Literal["ERROR", "WARNING", "INFO", "DEBUG", "CRITICAL"]
|
|
@@ -68,6 +68,8 @@ class IntegrationConfiguration(BaseOceanSettings, extra=Extra.allow):
|
|
|
68
68
|
initialize_port_resources: bool = True
|
|
69
69
|
scheduled_resync_interval: int | None = None
|
|
70
70
|
client_timeout: int = 60
|
|
71
|
+
# Determines if Port should generate resources such as blueprints and pages instead of ocean
|
|
72
|
+
create_port_resources_origin: CreatePortResourcesOrigin | None = None
|
|
71
73
|
send_raw_data_examples: bool = True
|
|
72
74
|
port: PortSettings
|
|
73
75
|
event_listener: EventListenerSettingsType = Field(
|
|
@@ -101,6 +103,20 @@ class IntegrationConfiguration(BaseOceanSettings, extra=Extra.allow):
|
|
|
101
103
|
|
|
102
104
|
return values
|
|
103
105
|
|
|
106
|
+
@validator("create_port_resources_origin")
|
|
107
|
+
def validate_create_port_resources_origin(
|
|
108
|
+
cls, create_port_resources_origin: CreatePortResourcesOrigin | None
|
|
109
|
+
) -> CreatePortResourcesOrigin | None:
|
|
110
|
+
spec = get_spec_file()
|
|
111
|
+
if spec and spec.get("create_port_resources_origin", None):
|
|
112
|
+
spec_create_port_resources_origin = spec.get("create_port_resources_origin")
|
|
113
|
+
if spec_create_port_resources_origin in [
|
|
114
|
+
CreatePortResourcesOrigin.Port,
|
|
115
|
+
CreatePortResourcesOrigin.Ocean,
|
|
116
|
+
]:
|
|
117
|
+
return CreatePortResourcesOrigin(spec_create_port_resources_origin)
|
|
118
|
+
return create_port_resources_origin
|
|
119
|
+
|
|
104
120
|
@validator("runtime")
|
|
105
121
|
def validate_runtime(cls, runtime: Runtime) -> Runtime:
|
|
106
122
|
if runtime.is_saas_runtime:
|
|
@@ -13,12 +13,14 @@ from port_ocean.core.defaults.common import (
|
|
|
13
13
|
get_port_integration_defaults,
|
|
14
14
|
)
|
|
15
15
|
from port_ocean.core.handlers.port_app_config.models import PortAppConfig
|
|
16
|
-
from port_ocean.core.models import Blueprint
|
|
16
|
+
from port_ocean.core.models import Blueprint, CreatePortResourcesOrigin
|
|
17
17
|
from port_ocean.core.utils.utils import gather_and_split_errors_from_results
|
|
18
18
|
from port_ocean.exceptions.port_defaults import (
|
|
19
19
|
AbortDefaultCreationError,
|
|
20
20
|
)
|
|
21
21
|
|
|
22
|
+
ORG_USE_PROVISIONED_DEFAULTS_FEATURE_FLAG = "USE_PROVISIONED_DEFAULTS"
|
|
23
|
+
|
|
22
24
|
|
|
23
25
|
def deconstruct_blueprints_to_creation_steps(
|
|
24
26
|
raw_blueprints: list[dict[str, Any]],
|
|
@@ -54,8 +56,8 @@ def deconstruct_blueprints_to_creation_steps(
|
|
|
54
56
|
|
|
55
57
|
async def _initialize_required_integration_settings(
|
|
56
58
|
port_client: PortClient,
|
|
57
|
-
default_mapping: PortAppConfig,
|
|
58
59
|
integration_config: IntegrationConfiguration,
|
|
60
|
+
default_mapping: PortAppConfig | None = None,
|
|
59
61
|
) -> None:
|
|
60
62
|
try:
|
|
61
63
|
logger.info("Initializing integration at port")
|
|
@@ -70,6 +72,8 @@ async def _initialize_required_integration_settings(
|
|
|
70
72
|
integration_config.integration.type,
|
|
71
73
|
integration_config.event_listener.get_changelog_destination_details(),
|
|
72
74
|
port_app_config=default_mapping,
|
|
75
|
+
create_port_resources_origin_in_port=integration_config.create_port_resources_origin
|
|
76
|
+
== CreatePortResourcesOrigin.Port,
|
|
73
77
|
)
|
|
74
78
|
elif not integration.get("config"):
|
|
75
79
|
logger.info(
|
|
@@ -102,8 +106,10 @@ async def _initialize_required_integration_settings(
|
|
|
102
106
|
|
|
103
107
|
async def _create_resources(
|
|
104
108
|
port_client: PortClient,
|
|
105
|
-
defaults: Defaults,
|
|
109
|
+
defaults: Defaults | None = None,
|
|
106
110
|
) -> None:
|
|
111
|
+
if not defaults:
|
|
112
|
+
return
|
|
107
113
|
creation_stage, *blueprint_patches = deconstruct_blueprints_to_creation_steps(
|
|
108
114
|
defaults.blueprints
|
|
109
115
|
)
|
|
@@ -199,22 +205,64 @@ async def _create_resources(
|
|
|
199
205
|
async def _initialize_defaults(
|
|
200
206
|
config_class: Type[PortAppConfig], integration_config: IntegrationConfiguration
|
|
201
207
|
) -> None:
|
|
208
|
+
if not integration_config.initialize_port_resources:
|
|
209
|
+
return
|
|
210
|
+
|
|
202
211
|
port_client = ocean.port_client
|
|
203
212
|
defaults = get_port_integration_defaults(
|
|
204
213
|
config_class, integration_config.resources_path
|
|
205
214
|
)
|
|
206
|
-
|
|
215
|
+
|
|
216
|
+
if (
|
|
217
|
+
not integration_config.create_port_resources_origin
|
|
218
|
+
and integration_config.runtime.is_saas_runtime
|
|
219
|
+
):
|
|
220
|
+
logger.info("Setting resources origin to be Port")
|
|
221
|
+
integration_config.create_port_resources_origin = CreatePortResourcesOrigin.Port
|
|
222
|
+
|
|
223
|
+
if (
|
|
224
|
+
integration_config.create_port_resources_origin
|
|
225
|
+
== CreatePortResourcesOrigin.Port
|
|
226
|
+
):
|
|
227
|
+
logger.info(
|
|
228
|
+
"Resources origin is set to be Port, verifying integration is supported"
|
|
229
|
+
)
|
|
230
|
+
org_feature_flags = await port_client.get_organization_feature_flags()
|
|
231
|
+
if ORG_USE_PROVISIONED_DEFAULTS_FEATURE_FLAG not in org_feature_flags:
|
|
232
|
+
logger.info(
|
|
233
|
+
"Port origin for Integration is not supported, changing resources origin to use Ocean"
|
|
234
|
+
)
|
|
235
|
+
integration_config.create_port_resources_origin = (
|
|
236
|
+
CreatePortResourcesOrigin.Ocean
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
if (
|
|
240
|
+
integration_config.create_port_resources_origin
|
|
241
|
+
!= CreatePortResourcesOrigin.Port
|
|
242
|
+
and not defaults
|
|
243
|
+
):
|
|
207
244
|
logger.warning("No defaults found. Skipping initialization...")
|
|
208
245
|
return None
|
|
209
246
|
|
|
210
|
-
if
|
|
247
|
+
if (
|
|
248
|
+
(defaults and defaults.port_app_config)
|
|
249
|
+
or integration_config.create_port_resources_origin
|
|
250
|
+
== CreatePortResourcesOrigin.Port
|
|
251
|
+
):
|
|
211
252
|
await _initialize_required_integration_settings(
|
|
212
|
-
port_client,
|
|
253
|
+
port_client,
|
|
254
|
+
integration_config,
|
|
255
|
+
defaults.port_app_config if defaults else None,
|
|
213
256
|
)
|
|
214
257
|
|
|
215
|
-
if
|
|
258
|
+
if (
|
|
259
|
+
integration_config.create_port_resources_origin
|
|
260
|
+
== CreatePortResourcesOrigin.Port
|
|
261
|
+
):
|
|
262
|
+
logger.info(
|
|
263
|
+
"Skipping creating defaults resources due to `create_port_resources_origin` being `Port`"
|
|
264
|
+
)
|
|
216
265
|
return
|
|
217
|
-
|
|
218
266
|
try:
|
|
219
267
|
logger.info("Found default resources, starting creation process")
|
|
220
268
|
await _create_resources(port_client, defaults)
|
|
@@ -143,19 +143,14 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
|
|
|
143
143
|
"combinator": "and",
|
|
144
144
|
"rules": [
|
|
145
145
|
{
|
|
146
|
-
"
|
|
147
|
-
"
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
"property": "$blueprint",
|
|
155
|
-
"operator": "=",
|
|
156
|
-
"value": entities[0].blueprint,
|
|
157
|
-
}
|
|
158
|
-
]
|
|
146
|
+
"property": "$identifier",
|
|
147
|
+
"operator": "in",
|
|
148
|
+
"value": [entity.identifier for entity in entities]
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"property": "$blueprint",
|
|
152
|
+
"operator": "=",
|
|
153
|
+
"value": entities[0].blueprint
|
|
159
154
|
}
|
|
160
155
|
]
|
|
161
156
|
}
|
port_ocean/core/models.py
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
from dataclasses import dataclass, field
|
|
2
|
-
from enum import Enum
|
|
2
|
+
from enum import Enum, StrEnum
|
|
3
3
|
from typing import Any
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel
|
|
6
6
|
from pydantic.fields import Field
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
class CreatePortResourcesOrigin(StrEnum):
|
|
10
|
+
Ocean = "Ocean"
|
|
11
|
+
Port = "Port"
|
|
12
|
+
|
|
13
|
+
|
|
9
14
|
class Runtime(Enum):
|
|
10
15
|
Saas = "Saas"
|
|
11
16
|
OnPrem = "OnPrem"
|
|
@@ -14,3 +14,13 @@ class AbortDefaultCreationError(BaseOceanException):
|
|
|
14
14
|
|
|
15
15
|
class UnsupportedDefaultFileType(BaseOceanException):
|
|
16
16
|
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class DefaultsProvisionFailed(BaseOceanException):
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
retries: int,
|
|
23
|
+
):
|
|
24
|
+
super().__init__(
|
|
25
|
+
f"Failed to retrieve integration config after {retries} attempts"
|
|
26
|
+
)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from unittest.mock import MagicMock, AsyncMock
|
|
3
|
+
|
|
4
|
+
from port_ocean.clients.port.mixins.organization import OrganizationClientMixin
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@pytest.fixture
|
|
8
|
+
async def mocked_org_mixin() -> OrganizationClientMixin:
|
|
9
|
+
auth = MagicMock()
|
|
10
|
+
auth.headers = AsyncMock()
|
|
11
|
+
auth.headers.return_value = {"auth": "enticated"}
|
|
12
|
+
client = MagicMock()
|
|
13
|
+
client.get = AsyncMock()
|
|
14
|
+
client.get.return_value = MagicMock()
|
|
15
|
+
client.get.return_value.json = MagicMock()
|
|
16
|
+
client.get.return_value.json.return_value = {
|
|
17
|
+
"organization": {"featureFlags": ["aa", "bb"]}
|
|
18
|
+
}
|
|
19
|
+
return OrganizationClientMixin(auth=auth, client=client)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
async def test_org_feature_flags_should_fetch_proper_json_path(
|
|
23
|
+
mocked_org_mixin: OrganizationClientMixin,
|
|
24
|
+
) -> None:
|
|
25
|
+
result = await mocked_org_mixin.get_organization_feature_flags()
|
|
26
|
+
|
|
27
|
+
assert result == ["aa", "bb"]
|
|
@@ -3,7 +3,7 @@ integrations/_infra/Dockerfile.alpine,sha256=iauglyEzz5uEPBxsN-9SLFr6qca3Tf4b0DP
|
|
|
3
3
|
integrations/_infra/Dockerfile.base.builder,sha256=LwKLfJvQfKksMqacAT_aDQxFMC2Ty5fFKIa0Eu4QcCc,619
|
|
4
4
|
integrations/_infra/Dockerfile.base.runner,sha256=dsjTWgLQFm4x5gcm-IPhwkDv-M6VRKwdf-qct457h2c,357
|
|
5
5
|
integrations/_infra/Dockerfile.dockerignore,sha256=CM1Fxt3I2AvSvObuUZRmy5BNLSGC7ylnbpWzFgD4cso,1163
|
|
6
|
-
integrations/_infra/Makefile,sha256=
|
|
6
|
+
integrations/_infra/Makefile,sha256=NWX1QLd429KyCzvwNwpkWtSm5QTVarnh5SYO822-ea4,2360
|
|
7
7
|
integrations/_infra/grpcio.sh,sha256=m924poYznoRZ6Tt7Ct8Cs5AV_cmmOx598yIZ3z4DvZE,616
|
|
8
8
|
integrations/_infra/init.sh,sha256=nN8lTrOhB286UfFvD6sJ9YJ-9asT9zVSddQB-RAb7Z4,99
|
|
9
9
|
port_ocean/__init__.py,sha256=J3Mqp7d-CkEe9eMigGG8gSEiVKICY2bf7csNEwVOXk0,294
|
|
@@ -46,19 +46,20 @@ port_ocean/cli/utils.py,sha256=IUK2UbWqjci-lrcDdynZXqVP5B5TcjF0w5CpEVUks-k,54
|
|
|
46
46
|
port_ocean/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
47
|
port_ocean/clients/port/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
48
|
port_ocean/clients/port/authentication.py,sha256=6-uDMWsJ0xLe1-9IoYXHWmwtufj8rJR4BCRXJlSkCSQ,3447
|
|
49
|
-
port_ocean/clients/port/client.py,sha256=
|
|
49
|
+
port_ocean/clients/port/client.py,sha256=OaNeN3U7Hw0tK4jYE6ESJEPKbTf9nGp2jcJVq00gnf8,3546
|
|
50
50
|
port_ocean/clients/port/mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
51
51
|
port_ocean/clients/port/mixins/blueprints.py,sha256=POBl4uDocrgJBw4rvCAzwRcD4jk-uBL6pDAuKMTajdg,4633
|
|
52
52
|
port_ocean/clients/port/mixins/entities.py,sha256=_aEGE_kGOucw6ZH9qleM5Tjt-YiPAbq9rjSOwcI-py0,10677
|
|
53
|
-
port_ocean/clients/port/mixins/integrations.py,sha256=
|
|
53
|
+
port_ocean/clients/port/mixins/integrations.py,sha256=cOmHdR0NdU8dXMD-5w3OpSEPPbaND0jSjJ4BGcHDsJQ,6900
|
|
54
54
|
port_ocean/clients/port/mixins/migrations.py,sha256=A6896oJF6WbFL2WroyTkMzr12yhVyWqGoq9dtLNSKBY,1457
|
|
55
|
+
port_ocean/clients/port/mixins/organization.py,sha256=fCo_ZS8UlQXsyIx-odTuWkbnfcYmVnQfIsSyJuPOPjM,1031
|
|
55
56
|
port_ocean/clients/port/retry_transport.py,sha256=PtIZOAZ6V-ncpVysRUsPOgt8Sf01QLnTKB5YeKBxkJk,1861
|
|
56
57
|
port_ocean/clients/port/types.py,sha256=nvlgiAq4WH5_F7wQbz_GAWl-faob84LVgIjZ2Ww5mTk,451
|
|
57
58
|
port_ocean/clients/port/utils.py,sha256=SjhgmJXAqH2JqXfGy8GoGwzUYiJvUhWDrJyxQcenxZc,2512
|
|
58
59
|
port_ocean/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
60
|
port_ocean/config/base.py,sha256=x1gFbzujrxn7EJudRT81C6eN9WsYAb3vOHwcpcpX8Tc,6370
|
|
60
61
|
port_ocean/config/dynamic.py,sha256=qOFkRoJsn_BW7581omi_AoMxoHqasf_foxDQ_G11_SI,2030
|
|
61
|
-
port_ocean/config/settings.py,sha256=
|
|
62
|
+
port_ocean/config/settings.py,sha256=q5KgDIr8snIxejoKyWSyf21R_AYEEXiEd3-ry9qf3ss,5227
|
|
62
63
|
port_ocean/consumers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
64
|
port_ocean/consumers/kafka_consumer.py,sha256=N8KocjBi9aR0BOPG8hgKovg-ns_ggpEjrSxqSqF_BSo,4710
|
|
64
65
|
port_ocean/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -69,7 +70,7 @@ port_ocean/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
69
70
|
port_ocean/core/defaults/__init__.py,sha256=8qCZg8n06WAdMu9s_FiRtDYLGPGHbOuS60vapeUoAks,142
|
|
70
71
|
port_ocean/core/defaults/clean.py,sha256=TOVe5b5FAjFspAkQuKA70k2BClCEFbrQ3xgiAoKXKYE,2427
|
|
71
72
|
port_ocean/core/defaults/common.py,sha256=zJsj7jvlqIMLGXhdASUlbKS8GIAf-FDKKB0O7jB6nx0,4166
|
|
72
|
-
port_ocean/core/defaults/initialize.py,sha256=
|
|
73
|
+
port_ocean/core/defaults/initialize.py,sha256=IYgc6XS5ARdcPM4IQrCSi4cdAomHxJVnP_OWOU9f05U,10382
|
|
73
74
|
port_ocean/core/event_listener/__init__.py,sha256=T3E52MKs79fNEW381p7zU9F2vOMvIiiTYWlqRUqnsg0,1135
|
|
74
75
|
port_ocean/core/event_listener/base.py,sha256=VdIdp7RLOSxH3ICyV-wCD3NiJoUzsh2KkJ0a9B29GeI,2847
|
|
75
76
|
port_ocean/core/event_listener/factory.py,sha256=M4Qi05pI840sjDIbdjUEgYe9Gp5ckoCkX-KgLBxUpZg,4096
|
|
@@ -101,9 +102,9 @@ port_ocean/core/integrations/mixins/__init__.py,sha256=FA1FEKMM6P-L2_m7Q4L20mFa4
|
|
|
101
102
|
port_ocean/core/integrations/mixins/events.py,sha256=0jKRsBw6lU8Mqs7MaQK4n-t_H6Z4NEkXZ5VWzqTrKEc,2396
|
|
102
103
|
port_ocean/core/integrations/mixins/handler.py,sha256=mZ7-0UlG3LcrwJttFbMe-R4xcOU2H_g33tZar7PwTv8,3771
|
|
103
104
|
port_ocean/core/integrations/mixins/sync.py,sha256=B9fEs8faaYLLikH9GBjE_E61vo0bQDjIGQsQ1SRXOlA,3931
|
|
104
|
-
port_ocean/core/integrations/mixins/sync_raw.py,sha256=
|
|
105
|
+
port_ocean/core/integrations/mixins/sync_raw.py,sha256=Ke-wCBv2zVEgF-6QafXKRkmJ59qAsqSHr61XPfq19J8,24752
|
|
105
106
|
port_ocean/core/integrations/mixins/utils.py,sha256=oN4Okz6xlaefpid1_Pud8HPSw9BwwjRohyNsknq-Myg,2309
|
|
106
|
-
port_ocean/core/models.py,sha256=
|
|
107
|
+
port_ocean/core/models.py,sha256=FvTp-BlpbvLbMbngE0wsiimsCfmIhUR1PvsE__Z--1I,2206
|
|
107
108
|
port_ocean/core/ocean_types.py,sha256=j_-or1VxDy22whLLxwxgzIsE4wAhFLH19Xff9l4oJA8,1124
|
|
108
109
|
port_ocean/core/utils/entity_topological_sorter.py,sha256=MDUjM6OuDy4Xj68o-7InNN0w1jqjxeDfeY8U02vySNI,3081
|
|
109
110
|
port_ocean/core/utils/utils.py,sha256=HmumOeH27N0NX1_OP3t4oGKt074ht9XyXhvfZ5I05s4,6474
|
|
@@ -114,7 +115,7 @@ port_ocean/exceptions/base.py,sha256=uY4DX7fIITDFfemCJDWpaZi3bD51lcANc5swpoNvMJA
|
|
|
114
115
|
port_ocean/exceptions/clients.py,sha256=LKLLs-Zy3caNG85rwxfOw2rMr8qqVV6SHUq4fRCZ99U,180
|
|
115
116
|
port_ocean/exceptions/context.py,sha256=mA8HII6Rl4QxKUz98ppy1zX3kaziaen21h1ZWuU3ADc,372
|
|
116
117
|
port_ocean/exceptions/core.py,sha256=Zmb1m6NnkSPWpAiQA5tgejm3zpDMt1WQEN47OJNo54A,856
|
|
117
|
-
port_ocean/exceptions/port_defaults.py,sha256=
|
|
118
|
+
port_ocean/exceptions/port_defaults.py,sha256=2a7Koy541KxMan33mU-gbauUxsumG3NT4itVxSpQqfw,666
|
|
118
119
|
port_ocean/exceptions/utils.py,sha256=gjOqpi-HpY1l4WlMFsGA9yzhxDhajhoGGdDDyGbLnqI,197
|
|
119
120
|
port_ocean/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
120
121
|
port_ocean/helpers/async_client.py,sha256=SRlP6o7_FCSY3UHnRlZdezppePVxxOzZ0z861vE3K40,1783
|
|
@@ -130,6 +131,7 @@ port_ocean/run.py,sha256=COoRSmLG4hbsjIW5DzhV0NYVegI9xHd1POv6sg4U1No,2217
|
|
|
130
131
|
port_ocean/sonar-project.properties,sha256=X_wLzDOkEVmpGLRMb2fg9Rb0DxWwUFSvESId8qpvrPI,73
|
|
131
132
|
port_ocean/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
132
133
|
port_ocean/tests/clients/port/mixins/test_entities.py,sha256=A9myrnkLhKSQrnOLv1Zz2wiOVSxW65Q9RIUIRbn_V7w,1586
|
|
134
|
+
port_ocean/tests/clients/port/mixins/test_organization_mixin.py,sha256=-8iHM33Oe8PuyEfj3O_6Yob8POp4fSmB0hnIT0Gv-8Y,868
|
|
133
135
|
port_ocean/tests/conftest.py,sha256=JXASSS0IY0nnR6bxBflhzxS25kf4iNaABmThyZ0mZt8,101
|
|
134
136
|
port_ocean/tests/core/defaults/test_common.py,sha256=sR7RqB3ZYV6Xn6NIg-c8k5K6JcGsYZ2SCe_PYX5vLYM,5560
|
|
135
137
|
port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py,sha256=FnEnaDjuoAbKvKyv6xJ46n3j0ZcaT70Sg2zc7oy7HAA,13596
|
|
@@ -158,8 +160,8 @@ port_ocean/utils/repeat.py,sha256=0EFWM9d8lLXAhZmAyczY20LAnijw6UbIECf5lpGbOas,32
|
|
|
158
160
|
port_ocean/utils/signal.py,sha256=K-6kKFQTltcmKDhtyZAcn0IMa3sUpOHGOAUdWKgx0_E,1369
|
|
159
161
|
port_ocean/utils/time.py,sha256=pufAOH5ZQI7gXvOvJoQXZXZJV-Dqktoj9Qp9eiRwmJ4,1939
|
|
160
162
|
port_ocean/version.py,sha256=UsuJdvdQlazzKGD3Hd5-U7N69STh8Dq9ggJzQFnu9fU,177
|
|
161
|
-
port_ocean-0.18.
|
|
162
|
-
port_ocean-0.18.
|
|
163
|
-
port_ocean-0.18.
|
|
164
|
-
port_ocean-0.18.
|
|
165
|
-
port_ocean-0.18.
|
|
163
|
+
port_ocean-0.18.3.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
|
164
|
+
port_ocean-0.18.3.dist-info/METADATA,sha256=k7KXJ85jjLvSZZ-pxaqD_YIFe3mQvoXJcoyoTg9qlHM,6669
|
|
165
|
+
port_ocean-0.18.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
166
|
+
port_ocean-0.18.3.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
|
|
167
|
+
port_ocean-0.18.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|