port-ocean 0.17.0__tar.gz → 0.17.4__tar.gz
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-0.17.0 → port_ocean-0.17.4}/PKG-INFO +1 -1
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/context/ocean.py +4 -2
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +27 -5
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/integrations/mixins/events.py +3 -1
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +45 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/pyproject.toml +1 -1
- {port_ocean-0.17.0 → port_ocean-0.17.4}/LICENSE.md +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/README.md +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/integrations/_infra/Dockerfile.Deb +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/integrations/_infra/Dockerfile.alpine +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/integrations/_infra/Dockerfile.base.builder +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/integrations/_infra/Dockerfile.base.runner +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/integrations/_infra/Dockerfile.dockerignore +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/integrations/_infra/Makefile +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/integrations/_infra/grpcio.sh +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/integrations/_infra/init.sh +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/bootstrap.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cli.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/defaults/__init___.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/defaults/clean.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/defaults/dock.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/defaults/group.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/list_integrations.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/main.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/new.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/pull.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/sail.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/commands/version.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/extensions.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/utils.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/authentication.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/client.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/mixins/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/mixins/blueprints.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/mixins/entities.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/mixins/integrations.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/mixins/migrations.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/retry_transport.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/types.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/clients/port/utils.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/config/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/config/base.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/config/dynamic.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/config/settings.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/consumers/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/consumers/kafka_consumer.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/context/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/context/event.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/context/resource.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/defaults/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/defaults/clean.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/defaults/common.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/defaults/initialize.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/event_listener/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/event_listener/base.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/event_listener/factory.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/event_listener/http.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/event_listener/kafka.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/event_listener/once.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/event_listener/polling.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/event_listener/webhooks_only.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/base.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entity_processor/base.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/port_app_config/api.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/port_app_config/base.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/port_app_config/models.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/integrations/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/integrations/base.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/integrations/mixins/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/integrations/mixins/handler.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/integrations/mixins/sync.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/integrations/mixins/sync_raw.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/integrations/mixins/utils.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/models.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/ocean_types.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/utils/utils.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/debug_cli.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/exceptions/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/exceptions/api.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/exceptions/base.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/exceptions/clients.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/exceptions/context.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/exceptions/core.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/exceptions/port_defaults.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/exceptions/utils.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/helpers/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/helpers/async_client.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/helpers/retry.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/log/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/log/handlers.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/log/logger_setup.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/log/sensetive.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/middlewares.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/ocean.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/py.typed +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/run.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/sonar-project.properties +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/conftest.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/core/defaults/test_common.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/core/test_utils.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/helpers/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/helpers/fake_port_api.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/helpers/fixtures.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/helpers/integration.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/helpers/ocean_app.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/helpers/port_client.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/helpers/smoke_test.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/log/test_handlers.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/test_smoke.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/utils/test_async_iterators.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/utils/test_cache.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/__init__.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/async_http.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/async_iterators.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/cache.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/misc.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/queue_utils.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/repeat.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/signal.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/utils/time.py +0 -0
- {port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/version.py +0 -0
|
@@ -73,8 +73,10 @@ class PortOceanContext:
|
|
|
73
73
|
def on_resync(
|
|
74
74
|
self,
|
|
75
75
|
kind: str | None = None,
|
|
76
|
-
) -> Callable[[RESYNC_EVENT_LISTENER], RESYNC_EVENT_LISTENER | None]:
|
|
77
|
-
def wrapper(
|
|
76
|
+
) -> Callable[[RESYNC_EVENT_LISTENER | None], RESYNC_EVENT_LISTENER | None]:
|
|
77
|
+
def wrapper(
|
|
78
|
+
function: RESYNC_EVENT_LISTENER | None,
|
|
79
|
+
) -> RESYNC_EVENT_LISTENER | None:
|
|
78
80
|
if not self.app.config.event_listener.should_resync:
|
|
79
81
|
logger.debug(
|
|
80
82
|
"Webhook only event listener is used, resync events are ignored"
|
|
@@ -3,7 +3,6 @@ from asyncio import Task
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
4
|
from functools import lru_cache
|
|
5
5
|
from typing import Any, Optional
|
|
6
|
-
|
|
7
6
|
import jq # type: ignore
|
|
8
7
|
from loguru import logger
|
|
9
8
|
|
|
@@ -66,6 +65,22 @@ class JQEntityProcessor(BaseEntityProcessor):
|
|
|
66
65
|
|
|
67
66
|
return inner
|
|
68
67
|
|
|
68
|
+
@staticmethod
|
|
69
|
+
def _notify_mapping_issues(
|
|
70
|
+
entity_misconfigurations: dict[str, str],
|
|
71
|
+
missing_required_fields: bool,
|
|
72
|
+
entity_mapping_fault_counter: int,
|
|
73
|
+
) -> None:
|
|
74
|
+
|
|
75
|
+
if len(entity_misconfigurations) > 0:
|
|
76
|
+
logger.info(
|
|
77
|
+
f"Unable to find valid data for: {entity_misconfigurations} (null, missing, or misconfigured)"
|
|
78
|
+
)
|
|
79
|
+
if missing_required_fields:
|
|
80
|
+
logger.info(
|
|
81
|
+
f"{entity_mapping_fault_counter} transformations of batch failed due to empty, null or missing values"
|
|
82
|
+
)
|
|
83
|
+
|
|
69
84
|
async def _search(self, data: dict[str, Any], pattern: str) -> Any:
|
|
70
85
|
try:
|
|
71
86
|
loop = asyncio.get_event_loop()
|
|
@@ -252,9 +267,12 @@ class JQEntityProcessor(BaseEntityProcessor):
|
|
|
252
267
|
examples_to_send: list[dict[str, Any]] = []
|
|
253
268
|
entity_misconfigurations: dict[str, str] = {}
|
|
254
269
|
missing_required_fields: bool = False
|
|
270
|
+
entity_mapping_fault_counter: int = 0
|
|
271
|
+
|
|
255
272
|
for result in calculated_entities_results:
|
|
256
273
|
if len(result.misconfigurations) > 0:
|
|
257
274
|
entity_misconfigurations |= result.misconfigurations
|
|
275
|
+
|
|
258
276
|
if result.entity.get("identifier") and result.entity.get("blueprint"):
|
|
259
277
|
parsed_entity = Entity.parse_obj(result.entity)
|
|
260
278
|
if result.did_entity_pass_selector:
|
|
@@ -268,10 +286,14 @@ class JQEntityProcessor(BaseEntityProcessor):
|
|
|
268
286
|
failed_entities.append(parsed_entity)
|
|
269
287
|
else:
|
|
270
288
|
missing_required_fields = True
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
289
|
+
entity_mapping_fault_counter += 1
|
|
290
|
+
|
|
291
|
+
self._notify_mapping_issues(
|
|
292
|
+
entity_misconfigurations,
|
|
293
|
+
missing_required_fields,
|
|
294
|
+
entity_mapping_fault_counter,
|
|
295
|
+
)
|
|
296
|
+
|
|
275
297
|
if (
|
|
276
298
|
not calculated_entities_results
|
|
277
299
|
and raw_results
|
|
@@ -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:
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
from typing import Any
|
|
2
2
|
from unittest.mock import AsyncMock, Mock
|
|
3
|
+
from loguru import logger
|
|
3
4
|
import pytest
|
|
5
|
+
from io import StringIO
|
|
4
6
|
|
|
5
7
|
from port_ocean.context.ocean import PortOceanContext
|
|
6
8
|
from port_ocean.core.handlers.entity_processor.jq_entity_processor import (
|
|
@@ -303,3 +305,46 @@ class TestJQEntityProcessor:
|
|
|
303
305
|
"url": ".foobar",
|
|
304
306
|
"defaultBranch": ".bar.baz",
|
|
305
307
|
}
|
|
308
|
+
|
|
309
|
+
async def test_parse_items_empty_required(
|
|
310
|
+
self, mocked_processor: JQEntityProcessor
|
|
311
|
+
) -> None:
|
|
312
|
+
stream = StringIO()
|
|
313
|
+
sink_id = logger.add(stream, level="DEBUG")
|
|
314
|
+
|
|
315
|
+
mapping = Mock()
|
|
316
|
+
mapping.port.entity.mappings.dict.return_value = {
|
|
317
|
+
"identifier": ".foo",
|
|
318
|
+
"blueprint": ".bar",
|
|
319
|
+
}
|
|
320
|
+
mapping.port.items_to_parse = None
|
|
321
|
+
mapping.selector.query = "true"
|
|
322
|
+
raw_results: list[dict[Any, Any]] = [
|
|
323
|
+
{"foo": "", "bar": "bluePrintMapped"},
|
|
324
|
+
{"foo": "identifierMapped", "bar": ""},
|
|
325
|
+
]
|
|
326
|
+
result = await mocked_processor._parse_items(mapping, raw_results)
|
|
327
|
+
assert "identifier" not in result.misonfigured_entity_keys
|
|
328
|
+
assert "blueprint" not in result.misonfigured_entity_keys
|
|
329
|
+
|
|
330
|
+
raw_results = [
|
|
331
|
+
{"foo": "identifierMapped", "bar": None},
|
|
332
|
+
{"foo": None, "bar": ""},
|
|
333
|
+
]
|
|
334
|
+
result = await mocked_processor._parse_items(mapping, raw_results)
|
|
335
|
+
assert result.misonfigured_entity_keys == {
|
|
336
|
+
"identifier": ".foo",
|
|
337
|
+
"blueprint": ".bar",
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
logger.remove(sink_id)
|
|
341
|
+
logs_captured = stream.getvalue()
|
|
342
|
+
|
|
343
|
+
assert (
|
|
344
|
+
"2 transformations of batch failed due to empty, null or missing values"
|
|
345
|
+
in logs_captured
|
|
346
|
+
)
|
|
347
|
+
assert (
|
|
348
|
+
"{'blueprint': '.bar', 'identifier': '.foo'} (null, missing, or misconfigured)"
|
|
349
|
+
in logs_captured
|
|
350
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entities_state_applier/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entities_state_applier/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/entity_processor/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/port_app_config/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/resync_state_updater/__init__.py
RENAMED
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/core/handlers/resync_state_updater/updater.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/clients/port/mixins/test_entities.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{port_ocean-0.17.0 → port_ocean-0.17.4}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|