port-ocean 0.18.7__py3-none-any.whl → 0.18.9__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- port_ocean/cli/commands/defaults/clean.py +15 -2
- port_ocean/clients/port/mixins/integrations.py +15 -0
- port_ocean/core/defaults/clean.py +18 -3
- port_ocean/core/handlers/entities_state_applier/port/applier.py +1 -1
- port_ocean/tests/core/handlers/port_app_config/test_base.py +8 -8
- port_ocean/tests/core/handlers/webhook/test_abstract_webhook_processor.py +1 -0
- port_ocean/tests/helpers/ocean_app.py +2 -0
- {port_ocean-0.18.7.dist-info → port_ocean-0.18.9.dist-info}/METADATA +1 -1
- {port_ocean-0.18.7.dist-info → port_ocean-0.18.9.dist-info}/RECORD +12 -12
- {port_ocean-0.18.7.dist-info → port_ocean-0.18.9.dist-info}/LICENSE.md +0 -0
- {port_ocean-0.18.7.dist-info → port_ocean-0.18.9.dist-info}/WHEEL +0 -0
- {port_ocean-0.18.7.dist-info → port_ocean-0.18.9.dist-info}/entry_points.txt +0 -0
@@ -8,6 +8,7 @@ from port_ocean.cli.commands.main import print_logo, console
|
|
8
8
|
from port_ocean.core.defaults import clean_defaults
|
9
9
|
from port_ocean.ocean import Ocean
|
10
10
|
from port_ocean.utils.misc import load_module
|
11
|
+
from port_ocean.utils.signal import init_signal_handler
|
11
12
|
from .group import defaults
|
12
13
|
|
13
14
|
|
@@ -27,12 +28,20 @@ from .group import defaults
|
|
27
28
|
is_flag=True,
|
28
29
|
help="Wait for the migration to finish. when force is set to true.",
|
29
30
|
)
|
30
|
-
|
31
|
+
@click.option(
|
32
|
+
"-d",
|
33
|
+
"--destroy",
|
34
|
+
"destroy",
|
35
|
+
is_flag=True,
|
36
|
+
help="Destroy the integration after cleaning the defaults.",
|
37
|
+
)
|
38
|
+
def clean(path: str, force: bool, wait: bool, destroy: bool) -> None:
|
31
39
|
"""
|
32
40
|
Clean defaults of the integration from the .port/resources PATH.
|
33
41
|
|
34
42
|
PATH: Path to the integration. If not provided, the current directory will be used.
|
35
43
|
"""
|
44
|
+
init_signal_handler()
|
36
45
|
print_logo()
|
37
46
|
|
38
47
|
console.print("Cleaning blueprints and configurations! ⚓️")
|
@@ -52,5 +61,9 @@ def clean(path: str, force: bool, wait: bool) -> None:
|
|
52
61
|
)
|
53
62
|
|
54
63
|
clean_defaults(
|
55
|
-
app.integration.AppConfigHandlerClass.CONFIG_CLASS,
|
64
|
+
app.integration.AppConfigHandlerClass.CONFIG_CLASS,
|
65
|
+
app.config,
|
66
|
+
force,
|
67
|
+
wait,
|
68
|
+
destroy,
|
56
69
|
)
|
@@ -178,3 +178,18 @@ class IntegrationClientMixin:
|
|
178
178
|
)
|
179
179
|
handle_status_code(response, should_log=should_log)
|
180
180
|
logger.debug(f"Examples for kind {kind} successfully ingested")
|
181
|
+
|
182
|
+
async def _delete_current_integration(self) -> httpx.Response:
|
183
|
+
logger.info(f"Deleting integration with id: {self.integration_identifier}")
|
184
|
+
response = await self.client.delete(
|
185
|
+
f"{self.auth.api_url}/integration/{self.integration_identifier}",
|
186
|
+
headers=await self.auth.headers(),
|
187
|
+
)
|
188
|
+
return response
|
189
|
+
|
190
|
+
async def delete_current_integration(
|
191
|
+
self, should_raise: bool = True, should_log: bool = True
|
192
|
+
) -> dict[str, Any]:
|
193
|
+
response = await self._delete_current_integration()
|
194
|
+
handle_status_code(response, should_raise, should_log)
|
195
|
+
return response.json()
|
@@ -18,10 +18,11 @@ def clean_defaults(
|
|
18
18
|
integration_config: IntegrationConfiguration,
|
19
19
|
force: bool,
|
20
20
|
wait: bool,
|
21
|
+
destroy: bool,
|
21
22
|
) -> None:
|
22
23
|
try:
|
23
24
|
asyncio.new_event_loop().run_until_complete(
|
24
|
-
_clean_defaults(config_class, integration_config, force, wait)
|
25
|
+
_clean_defaults(config_class, integration_config, force, wait, destroy)
|
25
26
|
)
|
26
27
|
|
27
28
|
except Exception as e:
|
@@ -33,6 +34,7 @@ async def _clean_defaults(
|
|
33
34
|
integration_config: IntegrationConfiguration,
|
34
35
|
force: bool,
|
35
36
|
wait: bool,
|
37
|
+
destroy: bool,
|
36
38
|
) -> None:
|
37
39
|
port_client = ocean.port_client
|
38
40
|
is_exists = await is_integration_exists(port_client)
|
@@ -54,9 +56,9 @@ async def _clean_defaults(
|
|
54
56
|
)
|
55
57
|
)
|
56
58
|
|
57
|
-
if not force:
|
59
|
+
if not force and not destroy:
|
58
60
|
logger.info(
|
59
|
-
"Finished deleting blueprints
|
61
|
+
"Finished deleting blueprints! ⚓️",
|
60
62
|
)
|
61
63
|
return None
|
62
64
|
|
@@ -73,6 +75,19 @@ async def _clean_defaults(
|
|
73
75
|
for migration_id in migration_ids
|
74
76
|
)
|
75
77
|
)
|
78
|
+
if not destroy:
|
79
|
+
logger.info(
|
80
|
+
"Migrations completed successfully! ⚓️",
|
81
|
+
)
|
82
|
+
return None
|
83
|
+
|
84
|
+
result = await ocean.port_client.delete_current_integration()
|
85
|
+
if result.get("ok"):
|
86
|
+
logger.info(
|
87
|
+
"Blueprints deleted, migrations completed, and integration destroyed successfully! ⚓️",
|
88
|
+
)
|
89
|
+
return None
|
90
|
+
|
76
91
|
except httpx.HTTPStatusError as e:
|
77
92
|
logger.error(f"Failed to delete blueprints: {e.response.text}.")
|
78
93
|
raise e
|
@@ -102,7 +102,7 @@ class HttpEntitiesStateApplier(BaseEntitiesStateApplier):
|
|
102
102
|
await self._safe_delete(diff.deleted, kept_entities, user_agent_type)
|
103
103
|
else:
|
104
104
|
logger.info(
|
105
|
-
f"Skipping deletion of entities with
|
105
|
+
f"Skipping deletion of entities with deletion rate {deletion_rate}",
|
106
106
|
deletion_rate=deletion_rate,
|
107
107
|
deleting_entities=len(diff.deleted),
|
108
108
|
total_entities=len(entities),
|
@@ -10,7 +10,7 @@ from port_ocean.context.event import EventType, event_context
|
|
10
10
|
from port_ocean.exceptions.api import EmptyPortAppConfigError
|
11
11
|
|
12
12
|
|
13
|
-
class
|
13
|
+
class MockPortAppConfig(BasePortAppConfig):
|
14
14
|
mock_get_port_app_config: Any
|
15
15
|
|
16
16
|
async def _get_port_app_config(self) -> Dict[str, Any]:
|
@@ -25,15 +25,15 @@ def mock_context() -> PortOceanContext:
|
|
25
25
|
|
26
26
|
|
27
27
|
@pytest.fixture
|
28
|
-
def port_app_config_handler(mock_context: PortOceanContext) ->
|
29
|
-
handler =
|
28
|
+
def port_app_config_handler(mock_context: PortOceanContext) -> MockPortAppConfig:
|
29
|
+
handler = MockPortAppConfig(mock_context)
|
30
30
|
handler.mock_get_port_app_config = MagicMock()
|
31
31
|
return handler
|
32
32
|
|
33
33
|
|
34
34
|
@pytest.mark.asyncio
|
35
35
|
async def test_get_port_app_config_success(
|
36
|
-
port_app_config_handler:
|
36
|
+
port_app_config_handler: MockPortAppConfig,
|
37
37
|
) -> None:
|
38
38
|
# Arrange
|
39
39
|
valid_config = {
|
@@ -83,7 +83,7 @@ async def test_get_port_app_config_success(
|
|
83
83
|
|
84
84
|
@pytest.mark.asyncio
|
85
85
|
async def test_get_port_app_config_uses_cache(
|
86
|
-
port_app_config_handler:
|
86
|
+
port_app_config_handler: MockPortAppConfig,
|
87
87
|
) -> None:
|
88
88
|
# Arrange
|
89
89
|
valid_config = {
|
@@ -122,7 +122,7 @@ async def test_get_port_app_config_uses_cache(
|
|
122
122
|
|
123
123
|
@pytest.mark.asyncio
|
124
124
|
async def test_get_port_app_config_bypass_cache(
|
125
|
-
port_app_config_handler:
|
125
|
+
port_app_config_handler: MockPortAppConfig,
|
126
126
|
) -> None:
|
127
127
|
# Arrange
|
128
128
|
valid_config = {
|
@@ -163,7 +163,7 @@ async def test_get_port_app_config_bypass_cache(
|
|
163
163
|
|
164
164
|
@pytest.mark.asyncio
|
165
165
|
async def test_get_port_app_config_validation_error(
|
166
|
-
port_app_config_handler:
|
166
|
+
port_app_config_handler: MockPortAppConfig, monkeypatch: pytest.MonkeyPatch
|
167
167
|
) -> None:
|
168
168
|
# Arrange
|
169
169
|
invalid_config = {"invalid_field": "invalid_value"}
|
@@ -184,7 +184,7 @@ async def test_get_port_app_config_validation_error(
|
|
184
184
|
|
185
185
|
@pytest.mark.asyncio
|
186
186
|
async def test_get_port_app_config_fetch_error(
|
187
|
-
port_app_config_handler:
|
187
|
+
port_app_config_handler: MockPortAppConfig,
|
188
188
|
) -> None:
|
189
189
|
# Arrange
|
190
190
|
port_app_config_handler.mock_get_port_app_config.side_effect = (
|
@@ -11,6 +11,7 @@ from port_ocean.core.handlers.port_app_config.models import ResourceConfig
|
|
11
11
|
from port_ocean.core.ocean_types import RESYNC_RESULT
|
12
12
|
from port_ocean.ocean import Ocean
|
13
13
|
from port_ocean.utils.misc import get_spec_file, load_module
|
14
|
+
from port_ocean.utils.signal import init_signal_handler
|
14
15
|
|
15
16
|
|
16
17
|
def get_integration_ocean_app(
|
@@ -21,6 +22,7 @@ def get_integration_ocean_app(
|
|
21
22
|
if spec_file is not None:
|
22
23
|
config_factory = default_config_factory(spec_file.get("configurations", []))
|
23
24
|
|
25
|
+
init_signal_handler()
|
24
26
|
default_app = create_default_app(
|
25
27
|
integration_path,
|
26
28
|
config_factory,
|
@@ -12,7 +12,7 @@ port_ocean/cli/__init__.py,sha256=ZjTGS305llhbjC2BH2KkVj34gCASBGwqc5HZEO_0T_Q,32
|
|
12
12
|
port_ocean/cli/cli.py,sha256=RvWTELEn5YFw9aM0vaNqm5YqZZrL50ILaBs27ptiGl0,57
|
13
13
|
port_ocean/cli/commands/__init__.py,sha256=Y9Q6jeYw_ZAZ-mdfE_5DZTdS2KHhieQZoUTggk_AkwM,369
|
14
14
|
port_ocean/cli/commands/defaults/__init___.py,sha256=5OKgakO79bTbplFv1_yWCrw1x_JJqSdRXAHHqKSuEpQ,88
|
15
|
-
port_ocean/cli/commands/defaults/clean.py,sha256=
|
15
|
+
port_ocean/cli/commands/defaults/clean.py,sha256=hmWNqbiYSxUu2F2EoxkKm5UiZK-g02TSeEiO-8eGIpk,1851
|
16
16
|
port_ocean/cli/commands/defaults/dock.py,sha256=pFtHrU_LTvb5Ddrzj09Wxy-jg1Ym10wBYD-0tpDRugE,1104
|
17
17
|
port_ocean/cli/commands/defaults/group.py,sha256=hii_4CYoQ7jSMePbnP4AmruO_RKWCUcoV7dXXBlZafc,115
|
18
18
|
port_ocean/cli/commands/list_integrations.py,sha256=DVVioFruGUE-_v6UUHlcemWNN6RlWwCrf1X4HmAXsf8,1134
|
@@ -50,7 +50,7 @@ port_ocean/clients/port/client.py,sha256=OaNeN3U7Hw0tK4jYE6ESJEPKbTf9nGp2jcJVq00
|
|
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=PJzVZTBW_OheFRGPRCZ6yPbVGEAKsMO9CNDNJUI1l48,10770
|
53
|
-
port_ocean/clients/port/mixins/integrations.py,sha256=
|
53
|
+
port_ocean/clients/port/mixins/integrations.py,sha256=R7ZTdU7UKh1IHOqbOJzK76c_JwAyEosRvIWWs4PO_8k,7543
|
54
54
|
port_ocean/clients/port/mixins/migrations.py,sha256=A6896oJF6WbFL2WroyTkMzr12yhVyWqGoq9dtLNSKBY,1457
|
55
55
|
port_ocean/clients/port/mixins/organization.py,sha256=fCo_ZS8UlQXsyIx-odTuWkbnfcYmVnQfIsSyJuPOPjM,1031
|
56
56
|
port_ocean/clients/port/retry_transport.py,sha256=PtIZOAZ6V-ncpVysRUsPOgt8Sf01QLnTKB5YeKBxkJk,1861
|
@@ -68,7 +68,7 @@ port_ocean/context/ocean.py,sha256=-T8Z_xcUNMeobr33TTABiOQjxC4KCVvVrP0IytRfen8,6
|
|
68
68
|
port_ocean/context/resource.py,sha256=yDj63URzQelj8zJPh4BAzTtPhpKr9Gw9DRn7I_0mJ1s,1692
|
69
69
|
port_ocean/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
70
70
|
port_ocean/core/defaults/__init__.py,sha256=8qCZg8n06WAdMu9s_FiRtDYLGPGHbOuS60vapeUoAks,142
|
71
|
-
port_ocean/core/defaults/clean.py,sha256=
|
71
|
+
port_ocean/core/defaults/clean.py,sha256=_rL-NCl6Q_x3lUxDW5ACOM27IYilTCWl6ISUfRleuL0,2891
|
72
72
|
port_ocean/core/defaults/common.py,sha256=zJsj7jvlqIMLGXhdASUlbKS8GIAf-FDKKB0O7jB6nx0,4166
|
73
73
|
port_ocean/core/defaults/initialize.py,sha256=IYgc6XS5ARdcPM4IQrCSi4cdAomHxJVnP_OWOU9f05U,10382
|
74
74
|
port_ocean/core/event_listener/__init__.py,sha256=T3E52MKs79fNEW381p7zU9F2vOMvIiiTYWlqRUqnsg0,1135
|
@@ -84,7 +84,7 @@ port_ocean/core/handlers/base.py,sha256=cTarblazu8yh8xz2FpB-dzDKuXxtoi143XJgPbV_
|
|
84
84
|
port_ocean/core/handlers/entities_state_applier/__init__.py,sha256=kgLZDCeCEzi4r-0nzW9k78haOZNf6PX7mJOUr34A4c8,173
|
85
85
|
port_ocean/core/handlers/entities_state_applier/base.py,sha256=5wHL0icfFAYRPqk8iV_wN49GdJ3aRUtO8tumSxBi4Wo,2268
|
86
86
|
port_ocean/core/handlers/entities_state_applier/port/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
|
-
port_ocean/core/handlers/entities_state_applier/port/applier.py,sha256=
|
87
|
+
port_ocean/core/handlers/entities_state_applier/port/applier.py,sha256=F9TxWJWtFOtgslaAB37WCKaGNkr_al0HDXFqNrEMbaU,6271
|
88
88
|
port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py,sha256=1zncwCbE-Gej0xaWKlzZgoXxOBe9bgs_YxlZ8QW3NdI,1751
|
89
89
|
port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py,sha256=lyv6xKzhYfd6TioUgR3AVRSJqj7JpAaj1LxxU2xAqeo,1720
|
90
90
|
port_ocean/core/handlers/entity_processor/__init__.py,sha256=FvFCunFg44wNQoqlybem9MthOs7p1Wawac87uSXz9U8,156
|
@@ -146,9 +146,9 @@ port_ocean/tests/core/handlers/entities_state_applier/test_applier.py,sha256=R9b
|
|
146
146
|
port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py,sha256=FnEnaDjuoAbKvKyv6xJ46n3j0ZcaT70Sg2zc7oy7HAA,13596
|
147
147
|
port_ocean/tests/core/handlers/mixins/test_sync_raw.py,sha256=gxQ4e9hQuMS8-o5UbiUSt1I1uaK0DCO3yCFDVigpZvo,31740
|
148
148
|
port_ocean/tests/core/handlers/port_app_config/test_api.py,sha256=eJZ6SuFBLz71y4ca3DNqKag6d6HUjNJS0aqQPwiLMTI,1999
|
149
|
-
port_ocean/tests/core/handlers/port_app_config/test_base.py,sha256=
|
149
|
+
port_ocean/tests/core/handlers/port_app_config/test_base.py,sha256=tdjpFUnUZ6TNMxc3trKkzmMTGTb7oKIeu3rRXv_fV3g,6872
|
150
150
|
port_ocean/tests/core/handlers/queue/test_local_queue.py,sha256=9Ly0HzZXbs6Rbl_bstsIdInC3h2bgABU3roP9S_PnJM,2582
|
151
|
-
port_ocean/tests/core/handlers/webhook/test_abstract_webhook_processor.py,sha256=
|
151
|
+
port_ocean/tests/core/handlers/webhook/test_abstract_webhook_processor.py,sha256=JbwoC63098xlFPjcNaQEWYaA_SJzUt_x1GS65Yp_M3U,3953
|
152
152
|
port_ocean/tests/core/handlers/webhook/test_processor_manager.py,sha256=k7ZjegY4qSfkf5uRqdSpc_v8RhObE_20wd1AwrO08Q4,14976
|
153
153
|
port_ocean/tests/core/handlers/webhook/test_webhook_event.py,sha256=yfsXuJzwEe9WYzyhWwT2IOEwwD9dHtKp_ufREM5v_DI,2090
|
154
154
|
port_ocean/tests/core/test_utils.py,sha256=Z3kdhb5V7Svhcyy3EansdTpgHL36TL6erNtU-OPwAcI,2647
|
@@ -158,7 +158,7 @@ port_ocean/tests/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
158
158
|
port_ocean/tests/helpers/fake_port_api.py,sha256=9rtjC6iTQMfzWK6WipkDzzG0b1IIaRmvdJLOyV613vE,6479
|
159
159
|
port_ocean/tests/helpers/fixtures.py,sha256=IQEplbHhRgjrAsZlnXrgSYA5YQEn25I9HgO3_Fjibxg,1481
|
160
160
|
port_ocean/tests/helpers/integration.py,sha256=_RxS-RHpu11lrbhUXYPZp862HLWx8AoD7iZM6iXN8rs,1104
|
161
|
-
port_ocean/tests/helpers/ocean_app.py,sha256=
|
161
|
+
port_ocean/tests/helpers/ocean_app.py,sha256=N06vcNI1klqdcNFq-PXL5vm77u-hODsOSXnj9p8d1AI,2249
|
162
162
|
port_ocean/tests/helpers/port_client.py,sha256=5d6GNr8vNNSOkrz1AdOhxBUKuusr_-UPDP7AVpHasQw,599
|
163
163
|
port_ocean/tests/helpers/smoke_test.py,sha256=_9aJJFRfuGJEg2D2YQJVJRmpreS6gEPHHQq8Q01x4aQ,2697
|
164
164
|
port_ocean/tests/log/test_handlers.py,sha256=uxgYCEQLP9U5qf-zUN9SgWFogMbYdnBeOVzXZ7E_yFw,2119
|
@@ -175,8 +175,8 @@ port_ocean/utils/repeat.py,sha256=0EFWM9d8lLXAhZmAyczY20LAnijw6UbIECf5lpGbOas,32
|
|
175
175
|
port_ocean/utils/signal.py,sha256=mMVq-1Ab5YpNiqN4PkiyTGlV_G0wkUDMMjTZp5z3pb0,1514
|
176
176
|
port_ocean/utils/time.py,sha256=pufAOH5ZQI7gXvOvJoQXZXZJV-Dqktoj9Qp9eiRwmJ4,1939
|
177
177
|
port_ocean/version.py,sha256=UsuJdvdQlazzKGD3Hd5-U7N69STh8Dq9ggJzQFnu9fU,177
|
178
|
-
port_ocean-0.18.
|
179
|
-
port_ocean-0.18.
|
180
|
-
port_ocean-0.18.
|
181
|
-
port_ocean-0.18.
|
182
|
-
port_ocean-0.18.
|
178
|
+
port_ocean-0.18.9.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
179
|
+
port_ocean-0.18.9.dist-info/METADATA,sha256=wNsXnfPpKx_dLVdrt9CSVl8oLrrHNM4-T0y6j27iHM4,6669
|
180
|
+
port_ocean-0.18.9.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
181
|
+
port_ocean-0.18.9.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
|
182
|
+
port_ocean-0.18.9.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|