port-ocean 0.17.1__tar.gz → 0.17.3__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.

Files changed (163) hide show
  1. {port_ocean-0.17.1 → port_ocean-0.17.3}/PKG-INFO +1 -1
  2. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/context/ocean.py +1 -1
  3. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +35 -5
  4. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +43 -0
  5. {port_ocean-0.17.1 → port_ocean-0.17.3}/pyproject.toml +1 -1
  6. {port_ocean-0.17.1 → port_ocean-0.17.3}/LICENSE.md +0 -0
  7. {port_ocean-0.17.1 → port_ocean-0.17.3}/README.md +0 -0
  8. {port_ocean-0.17.1 → port_ocean-0.17.3}/integrations/_infra/Dockerfile.Deb +0 -0
  9. {port_ocean-0.17.1 → port_ocean-0.17.3}/integrations/_infra/Dockerfile.alpine +0 -0
  10. {port_ocean-0.17.1 → port_ocean-0.17.3}/integrations/_infra/Dockerfile.base.builder +0 -0
  11. {port_ocean-0.17.1 → port_ocean-0.17.3}/integrations/_infra/Dockerfile.base.runner +0 -0
  12. {port_ocean-0.17.1 → port_ocean-0.17.3}/integrations/_infra/Dockerfile.dockerignore +0 -0
  13. {port_ocean-0.17.1 → port_ocean-0.17.3}/integrations/_infra/Makefile +0 -0
  14. {port_ocean-0.17.1 → port_ocean-0.17.3}/integrations/_infra/grpcio.sh +0 -0
  15. {port_ocean-0.17.1 → port_ocean-0.17.3}/integrations/_infra/init.sh +0 -0
  16. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/__init__.py +0 -0
  17. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/bootstrap.py +0 -0
  18. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/__init__.py +0 -0
  19. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cli.py +0 -0
  20. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/__init__.py +0 -0
  21. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/defaults/__init___.py +0 -0
  22. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/defaults/clean.py +0 -0
  23. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/defaults/dock.py +0 -0
  24. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/defaults/group.py +0 -0
  25. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/list_integrations.py +0 -0
  26. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/main.py +0 -0
  27. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/new.py +0 -0
  28. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/pull.py +0 -0
  29. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/sail.py +0 -0
  30. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/commands/version.py +0 -0
  31. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/__init__.py +0 -0
  32. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
  33. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/extensions.py +0 -0
  34. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
  35. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
  36. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
  37. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
  38. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
  39. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
  40. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
  41. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
  42. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
  43. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
  44. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
  45. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
  46. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
  47. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
  48. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
  49. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
  50. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
  51. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
  52. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/cli/utils.py +0 -0
  53. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/__init__.py +0 -0
  54. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/__init__.py +0 -0
  55. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/authentication.py +0 -0
  56. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/client.py +0 -0
  57. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/mixins/__init__.py +0 -0
  58. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/mixins/blueprints.py +0 -0
  59. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/mixins/entities.py +0 -0
  60. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/mixins/integrations.py +0 -0
  61. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/mixins/migrations.py +0 -0
  62. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/retry_transport.py +0 -0
  63. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/types.py +0 -0
  64. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/clients/port/utils.py +0 -0
  65. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/config/__init__.py +0 -0
  66. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/config/base.py +0 -0
  67. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/config/dynamic.py +0 -0
  68. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/config/settings.py +0 -0
  69. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/consumers/__init__.py +0 -0
  70. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/consumers/kafka_consumer.py +0 -0
  71. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/context/__init__.py +0 -0
  72. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/context/event.py +0 -0
  73. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/context/resource.py +0 -0
  74. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/__init__.py +0 -0
  75. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/defaults/__init__.py +0 -0
  76. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/defaults/clean.py +0 -0
  77. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/defaults/common.py +0 -0
  78. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/defaults/initialize.py +0 -0
  79. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/event_listener/__init__.py +0 -0
  80. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/event_listener/base.py +0 -0
  81. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/event_listener/factory.py +0 -0
  82. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/event_listener/http.py +0 -0
  83. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/event_listener/kafka.py +0 -0
  84. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/event_listener/once.py +0 -0
  85. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/event_listener/polling.py +0 -0
  86. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/event_listener/webhooks_only.py +0 -0
  87. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/__init__.py +0 -0
  88. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/base.py +0 -0
  89. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
  90. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
  91. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
  92. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
  93. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
  94. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
  95. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
  96. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/entity_processor/base.py +0 -0
  97. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
  98. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/port_app_config/api.py +0 -0
  99. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/port_app_config/base.py +0 -0
  100. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/port_app_config/models.py +0 -0
  101. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
  102. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
  103. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/integrations/__init__.py +0 -0
  104. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/integrations/base.py +0 -0
  105. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/integrations/mixins/__init__.py +0 -0
  106. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/integrations/mixins/events.py +0 -0
  107. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/integrations/mixins/handler.py +0 -0
  108. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/integrations/mixins/sync.py +0 -0
  109. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/integrations/mixins/sync_raw.py +0 -0
  110. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/integrations/mixins/utils.py +0 -0
  111. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/models.py +0 -0
  112. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/ocean_types.py +0 -0
  113. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
  114. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/core/utils/utils.py +0 -0
  115. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/debug_cli.py +0 -0
  116. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/exceptions/__init__.py +0 -0
  117. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/exceptions/api.py +0 -0
  118. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/exceptions/base.py +0 -0
  119. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/exceptions/clients.py +0 -0
  120. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/exceptions/context.py +0 -0
  121. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/exceptions/core.py +0 -0
  122. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/exceptions/port_defaults.py +0 -0
  123. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/exceptions/utils.py +0 -0
  124. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/helpers/__init__.py +0 -0
  125. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/helpers/async_client.py +0 -0
  126. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/helpers/retry.py +0 -0
  127. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/log/__init__.py +0 -0
  128. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/log/handlers.py +0 -0
  129. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/log/logger_setup.py +0 -0
  130. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/log/sensetive.py +0 -0
  131. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/middlewares.py +0 -0
  132. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/ocean.py +0 -0
  133. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/py.typed +0 -0
  134. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/run.py +0 -0
  135. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/sonar-project.properties +0 -0
  136. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/__init__.py +0 -0
  137. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
  138. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/conftest.py +0 -0
  139. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/core/defaults/test_common.py +0 -0
  140. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +0 -0
  141. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/core/test_utils.py +0 -0
  142. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
  143. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/helpers/__init__.py +0 -0
  144. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/helpers/fake_port_api.py +0 -0
  145. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/helpers/fixtures.py +0 -0
  146. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/helpers/integration.py +0 -0
  147. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/helpers/ocean_app.py +0 -0
  148. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/helpers/port_client.py +0 -0
  149. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/helpers/smoke_test.py +0 -0
  150. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/log/test_handlers.py +0 -0
  151. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/test_smoke.py +0 -0
  152. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/utils/test_async_iterators.py +0 -0
  153. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/tests/utils/test_cache.py +0 -0
  154. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/__init__.py +0 -0
  155. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/async_http.py +0 -0
  156. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/async_iterators.py +0 -0
  157. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/cache.py +0 -0
  158. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/misc.py +0 -0
  159. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/queue_utils.py +0 -0
  160. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/repeat.py +0 -0
  161. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/signal.py +0 -0
  162. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/utils/time.py +0 -0
  163. {port_ocean-0.17.1 → port_ocean-0.17.3}/port_ocean/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.17.1
3
+ Version: 0.17.3
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
@@ -73,7 +73,7 @@ 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]:
76
+ ) -> Callable[[RESYNC_EVENT_LISTENER | None], RESYNC_EVENT_LISTENER | None]:
77
77
  def wrapper(
78
78
  function: RESYNC_EVENT_LISTENER | None,
79
79
  ) -> RESYNC_EVENT_LISTENER | None:
@@ -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 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,22 @@ class JQEntityProcessor(BaseEntityProcessor):
268
286
  failed_entities.append(parsed_entity)
269
287
  else:
270
288
  missing_required_fields = True
271
- if len(entity_misconfigurations) > 0:
272
- logger.info(
273
- f"The mapping resulted with invalid values for{" identifier, blueprint," if missing_required_fields else " "} properties. Mapping result: {entity_misconfigurations}"
274
- )
289
+ if (result.entity.get("identifier") == "") or (
290
+ result.entity.get("blueprint") == ""
291
+ ):
292
+ entity_mapping_fault_counter += 1
293
+ else:
294
+ logger.debug(
295
+ f"Mapping failed, values verification for identifier: {result.entity.get("identifier")}, \
296
+ for blueprint: {result.entity.get("blueprint")}"
297
+ )
298
+
299
+ self._notify_mapping_issues(
300
+ entity_misconfigurations,
301
+ missing_required_fields,
302
+ entity_mapping_fault_counter,
303
+ )
304
+
275
305
  if (
276
306
  not calculated_entities_results
277
307
  and raw_results
@@ -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,44 @@ 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 "2 transformations of batch failed due to empty values" in logs_captured
344
+ assert (
345
+ "{'blueprint': '.bar', 'identifier': '.foo'} (null, missing, or misconfigured)"
346
+ in logs_captured
347
+ )
348
+ assert "1 transformations of batch failed due to empty values" in logs_captured
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "port-ocean"
3
- version = "0.17.1"
3
+ version = "0.17.3"
4
4
  description = "Port Ocean is a CLI tool for managing your Port projects."
5
5
  readme = "README.md"
6
6
  homepage = "https://app.getport.io"
File without changes
File without changes