port-ocean 0.17.5__tar.gz → 0.17.7__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.5 → port_ocean-0.17.7}/PKG-INFO +1 -1
  2. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/defaults/initialize.py +6 -4
  3. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/base.py +11 -3
  4. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/http.py +10 -2
  5. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/kafka.py +13 -0
  6. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/once.py +0 -3
  7. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/polling.py +0 -3
  8. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/sync_raw.py +5 -2
  9. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +152 -0
  10. {port_ocean-0.17.5 → port_ocean-0.17.7}/pyproject.toml +1 -1
  11. {port_ocean-0.17.5 → port_ocean-0.17.7}/LICENSE.md +0 -0
  12. {port_ocean-0.17.5 → port_ocean-0.17.7}/README.md +0 -0
  13. {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.Deb +0 -0
  14. {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.alpine +0 -0
  15. {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.base.builder +0 -0
  16. {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.base.runner +0 -0
  17. {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Dockerfile.dockerignore +0 -0
  18. {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/Makefile +0 -0
  19. {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/grpcio.sh +0 -0
  20. {port_ocean-0.17.5 → port_ocean-0.17.7}/integrations/_infra/init.sh +0 -0
  21. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/__init__.py +0 -0
  22. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/bootstrap.py +0 -0
  23. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/__init__.py +0 -0
  24. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cli.py +0 -0
  25. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/__init__.py +0 -0
  26. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/defaults/__init___.py +0 -0
  27. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/defaults/clean.py +0 -0
  28. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/defaults/dock.py +0 -0
  29. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/defaults/group.py +0 -0
  30. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/list_integrations.py +0 -0
  31. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/main.py +0 -0
  32. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/new.py +0 -0
  33. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/pull.py +0 -0
  34. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/sail.py +0 -0
  35. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/commands/version.py +0 -0
  36. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/__init__.py +0 -0
  37. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
  38. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/extensions.py +0 -0
  39. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
  40. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
  41. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
  42. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
  43. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
  44. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
  45. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
  46. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
  47. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
  48. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
  49. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
  50. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
  51. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
  52. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
  53. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
  54. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
  55. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
  56. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
  57. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/cli/utils.py +0 -0
  58. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/__init__.py +0 -0
  59. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/__init__.py +0 -0
  60. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/authentication.py +0 -0
  61. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/client.py +0 -0
  62. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/__init__.py +0 -0
  63. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/blueprints.py +0 -0
  64. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/entities.py +0 -0
  65. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/integrations.py +0 -0
  66. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/mixins/migrations.py +0 -0
  67. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/retry_transport.py +0 -0
  68. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/types.py +0 -0
  69. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/clients/port/utils.py +0 -0
  70. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/config/__init__.py +0 -0
  71. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/config/base.py +0 -0
  72. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/config/dynamic.py +0 -0
  73. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/config/settings.py +0 -0
  74. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/consumers/__init__.py +0 -0
  75. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/consumers/kafka_consumer.py +0 -0
  76. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/context/__init__.py +0 -0
  77. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/context/event.py +0 -0
  78. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/context/ocean.py +0 -0
  79. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/context/resource.py +0 -0
  80. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/__init__.py +0 -0
  81. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/defaults/__init__.py +0 -0
  82. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/defaults/clean.py +0 -0
  83. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/defaults/common.py +0 -0
  84. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/__init__.py +0 -0
  85. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/factory.py +0 -0
  86. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/event_listener/webhooks_only.py +0 -0
  87. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/__init__.py +0 -0
  88. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/base.py +0 -0
  89. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
  90. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
  91. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
  92. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
  93. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
  94. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
  95. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
  96. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entity_processor/base.py +0 -0
  97. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +0 -0
  98. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
  99. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/api.py +0 -0
  100. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/base.py +0 -0
  101. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/port_app_config/models.py +0 -0
  102. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
  103. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
  104. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/__init__.py +0 -0
  105. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/base.py +0 -0
  106. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/__init__.py +0 -0
  107. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/events.py +0 -0
  108. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/handler.py +0 -0
  109. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/sync.py +0 -0
  110. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/integrations/mixins/utils.py +0 -0
  111. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/models.py +0 -0
  112. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/ocean_types.py +0 -0
  113. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
  114. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/core/utils/utils.py +0 -0
  115. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/debug_cli.py +0 -0
  116. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/__init__.py +0 -0
  117. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/api.py +0 -0
  118. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/base.py +0 -0
  119. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/clients.py +0 -0
  120. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/context.py +0 -0
  121. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/core.py +0 -0
  122. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/port_defaults.py +0 -0
  123. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/exceptions/utils.py +0 -0
  124. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/helpers/__init__.py +0 -0
  125. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/helpers/async_client.py +0 -0
  126. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/helpers/retry.py +0 -0
  127. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/log/__init__.py +0 -0
  128. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/log/handlers.py +0 -0
  129. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/log/logger_setup.py +0 -0
  130. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/log/sensetive.py +0 -0
  131. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/middlewares.py +0 -0
  132. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/ocean.py +0 -0
  133. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/py.typed +0 -0
  134. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/run.py +0 -0
  135. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/sonar-project.properties +0 -0
  136. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/__init__.py +0 -0
  137. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
  138. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/conftest.py +0 -0
  139. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/defaults/test_common.py +0 -0
  140. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +0 -0
  141. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/test_utils.py +0 -0
  142. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
  143. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/__init__.py +0 -0
  144. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/fake_port_api.py +0 -0
  145. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/fixtures.py +0 -0
  146. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/integration.py +0 -0
  147. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/ocean_app.py +0 -0
  148. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/port_client.py +0 -0
  149. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/helpers/smoke_test.py +0 -0
  150. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/log/test_handlers.py +0 -0
  151. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/test_smoke.py +0 -0
  152. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/utils/test_async_iterators.py +0 -0
  153. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/tests/utils/test_cache.py +0 -0
  154. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/__init__.py +0 -0
  155. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/async_http.py +0 -0
  156. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/async_iterators.py +0 -0
  157. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/cache.py +0 -0
  158. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/misc.py +0 -0
  159. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/queue_utils.py +0 -0
  160. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/repeat.py +0 -0
  161. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/signal.py +0 -0
  162. {port_ocean-0.17.5 → port_ocean-0.17.7}/port_ocean/utils/time.py +0 -0
  163. {port_ocean-0.17.5 → port_ocean-0.17.7}/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.5
3
+ Version: 0.17.7
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
@@ -68,7 +68,7 @@ async def _initialize_required_integration_settings(
68
68
  )
69
69
  integration = await port_client.create_integration(
70
70
  integration_config.integration.type,
71
- integration_config.event_listener.to_request(),
71
+ integration_config.event_listener.get_changelog_destination_details(),
72
72
  port_app_config=default_mapping,
73
73
  )
74
74
  elif not integration.get("config"):
@@ -77,7 +77,7 @@ async def _initialize_required_integration_settings(
77
77
  )
78
78
  integration = await port_client.patch_integration(
79
79
  integration_config.integration.type,
80
- integration_config.event_listener.to_request(),
80
+ integration_config.event_listener.get_changelog_destination_details(),
81
81
  port_app_config=default_mapping,
82
82
  )
83
83
  except httpx.HTTPStatusError as err:
@@ -85,8 +85,10 @@ async def _initialize_required_integration_settings(
85
85
  raise err
86
86
 
87
87
  logger.info("Checking for diff in integration configuration")
88
- changelog_destination = integration_config.event_listener.to_request().get(
89
- "changelog_destination"
88
+ changelog_destination = (
89
+ integration_config.event_listener.get_changelog_destination_details().get(
90
+ "changelog_destination"
91
+ )
90
92
  )
91
93
  if (
92
94
  integration.get("changelogDestination") != changelog_destination
@@ -78,8 +78,16 @@ class EventListenerSettings(BaseOceanModel, extra=Extra.allow):
78
78
  type: str
79
79
  should_resync: bool = True
80
80
 
81
- def to_request(self) -> dict[str, Any]:
81
+ def get_changelog_destination_details(self) -> dict[str, Any]:
82
82
  """
83
- Converts the Settings object to a dictionary representation (request format).
83
+ Returns the changelog destination configuration for the event listener.
84
+ By default, returns an empty dict. Only KAFKA and WEBHOOK event listeners need to override this
85
+ to provide their specific changelog destination details.
86
+
87
+ Returns:
88
+ dict[str, Any]: The changelog destination configuration. For example:
89
+ - KAFKA returns {"type": "KAFKA"}
90
+ - WEBHOOK returns {"type": "WEBHOOK", "url": "https://example.com/resync"}
91
+ - Other event listeners return {}
84
92
  """
85
- return {"type": self.type}
93
+ return {}
@@ -27,9 +27,17 @@ class HttpEventListenerSettings(EventListenerSettings):
27
27
  type: Literal["WEBHOOK"]
28
28
  app_host: AnyHttpUrl = Field(..., sensitive=True)
29
29
 
30
- def to_request(self) -> dict[str, Any]:
30
+ def get_changelog_destination_details(self) -> dict[str, Any]:
31
+ """
32
+ Returns the changelog destination configuration for the webhook event listener.
33
+ For webhook event listeners, this specifies the URL where changelog events should be sent.
34
+
35
+ Returns:
36
+ dict[str, Any]: A dictionary with the webhook URL where changelog events should be sent,
37
+ constructed by appending "/resync" to the app_host.
38
+ """
31
39
  return {
32
- **super().to_request(),
40
+ "type": self.type,
33
41
  "url": self.app_host + "/resync",
34
42
  }
35
43
 
@@ -46,6 +46,19 @@ class KafkaEventListenerSettings(EventListenerSettings):
46
46
  kafka_security_enabled: bool = True
47
47
  consumer_poll_timeout: int = 1
48
48
 
49
+ def get_changelog_destination_details(self) -> dict[str, Any]:
50
+ """
51
+ Returns the changelog destination configuration for the Kafka event listener.
52
+ For Kafka event listeners, this specifies that changelog events should be sent via Kafka.
53
+
54
+ Returns:
55
+ dict[str, Any]: A dictionary with type "KAFKA" to indicate that changelog events
56
+ should be sent through the Kafka message bus.
57
+ """
58
+ return {
59
+ "type": self.type,
60
+ }
61
+
49
62
 
50
63
  class KafkaEventListener(BaseEventListener):
51
64
  """
@@ -23,9 +23,6 @@ class OnceEventListenerSettings(EventListenerSettings):
23
23
 
24
24
  type: Literal["ONCE"]
25
25
 
26
- def to_request(self) -> dict[str, Any]:
27
- return {}
28
-
29
26
 
30
27
  class OnceEventListener(BaseEventListener):
31
28
  """
@@ -27,9 +27,6 @@ class PollingEventListenerSettings(EventListenerSettings):
27
27
  resync_on_start: bool = True
28
28
  interval: int = 60
29
29
 
30
- def to_request(self) -> dict[str, Any]:
31
- return {}
32
-
33
30
 
34
31
  class PollingEventListener(BaseEventListener):
35
32
  """
@@ -147,6 +147,7 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
147
147
  return CalculationResult(
148
148
  objects_diff[0].entity_selector_diff._replace(passed=modified_objects),
149
149
  errors=objects_diff[0].errors,
150
+ misonfigured_entity_keys=objects_diff[0].misonfigured_entity_keys,
150
151
  )
151
152
 
152
153
  async def _unregister_resource_raw(
@@ -162,7 +163,7 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
162
163
  return [], []
163
164
 
164
165
  objects_diff = await self._calculate_raw([(resource, results)])
165
- entities_selector_diff, errors = objects_diff[0]
166
+ entities_selector_diff, errors, _ = objects_diff[0]
166
167
 
167
168
  await self.entities_state_applier.delete(
168
169
  entities_selector_diff.passed, user_agent_type
@@ -245,7 +246,7 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
245
246
  if not resource_mappings:
246
247
  return []
247
248
 
248
- diffs, errors = zip(
249
+ diffs, errors, misconfigured_entity_keys = zip(
249
250
  *await asyncio.gather(
250
251
  *(
251
252
  self._register_resource_raw(
@@ -258,6 +259,8 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
258
259
 
259
260
  diffs = list(diffs)
260
261
  errors = sum(errors, [])
262
+ misconfigured_entity_keys = list(misconfigured_entity_keys)
263
+
261
264
 
262
265
  if errors:
263
266
  message = f"Failed to register {len(errors)} entities. Skipping delete phase due to incomplete state"
@@ -164,6 +164,14 @@ def mock_sync_raw_mixin(
164
164
  return sync_raw_mixin
165
165
 
166
166
 
167
+ @pytest.fixture
168
+ def mock_sync_raw_mixin_with_jq_processor(
169
+ mock_sync_raw_mixin: SyncRawMixin,
170
+ ) -> SyncRawMixin:
171
+ mock_sync_raw_mixin._entity_processor = JQEntityProcessor(mock_context) # type: ignore
172
+ return mock_sync_raw_mixin
173
+
174
+
167
175
  @asynccontextmanager
168
176
  async def no_op_event_context(
169
177
  existing_event: EventContext,
@@ -398,3 +406,147 @@ async def test_sync_raw_mixin_dependency(
398
406
  "entity_3-entity_1-entity_4-entity_2-entity_5",
399
407
  "entity_3-entity_1-entity_4-entity_5-entity_2",
400
408
  )
409
+
410
+
411
+ @pytest.mark.asyncio
412
+ async def test_register_raw(
413
+ mock_sync_raw_mixin_with_jq_processor: SyncRawMixin, mock_ocean: Ocean
414
+ ) -> None:
415
+ kind = "service"
416
+ user_agent_type = UserAgentType.exporter
417
+ raw_entity = [
418
+ {"id": "entity_1", "name": "entity_1", "web_url": "https://example.com"},
419
+ ]
420
+ expected_result = [
421
+ {
422
+ "identifier": "entity_1",
423
+ "blueprint": "service",
424
+ "name": "entity_1",
425
+ "properties": {"url": "https://example.com"},
426
+ },
427
+ ]
428
+
429
+ async with event_context(EventType.HTTP_REQUEST, trigger_type="machine") as event:
430
+ # Use patch to mock the method instead of direct assignment
431
+ with patch.object(
432
+ mock_sync_raw_mixin_with_jq_processor.port_app_config_handler,
433
+ "get_port_app_config",
434
+ return_value=PortAppConfig(
435
+ enable_merge_entity=True,
436
+ delete_dependent_entities=True,
437
+ create_missing_related_entities=False,
438
+ resources=[
439
+ ResourceConfig(
440
+ kind=kind,
441
+ selector=Selector(query="true"),
442
+ port=PortResourceConfig(
443
+ entity=MappingsConfig(
444
+ mappings=EntityMapping(
445
+ identifier=".id | tostring",
446
+ title=".name",
447
+ blueprint='"service"',
448
+ properties={"url": ".web_url"},
449
+ relations={},
450
+ )
451
+ )
452
+ ),
453
+ )
454
+ ],
455
+ ),
456
+ ):
457
+ # Ensure the event.port_app_config is set correctly
458
+ event.port_app_config = await mock_sync_raw_mixin_with_jq_processor.port_app_config_handler.get_port_app_config(
459
+ use_cache=False
460
+ )
461
+
462
+ def upsert_side_effect(
463
+ entities: list[Entity], user_agent_type: UserAgentType
464
+ ) -> list[Entity]:
465
+ # Simulate returning the passed entities
466
+ return entities
467
+
468
+ # Patch the upsert method with the side effect
469
+ with patch.object(
470
+ mock_sync_raw_mixin_with_jq_processor.entities_state_applier,
471
+ "upsert",
472
+ side_effect=upsert_side_effect,
473
+ ):
474
+ # Call the register_raw method
475
+ registered_entities = (
476
+ await mock_sync_raw_mixin_with_jq_processor.register_raw(
477
+ kind, raw_entity, user_agent_type
478
+ )
479
+ )
480
+
481
+ # Assert that the registered entities match the expected results
482
+ assert len(registered_entities) == len(expected_result)
483
+ for entity, result in zip(registered_entities, expected_result):
484
+ assert entity.identifier == result["identifier"]
485
+ assert entity.blueprint == result["blueprint"]
486
+ assert entity.properties == result["properties"]
487
+
488
+
489
+ @pytest.mark.asyncio
490
+ async def test_unregister_raw(
491
+ mock_sync_raw_mixin_with_jq_processor: SyncRawMixin, mock_ocean: Ocean
492
+ ) -> None:
493
+ kind = "service"
494
+ user_agent_type = UserAgentType.exporter
495
+ raw_entity = [
496
+ {"id": "entity_1", "name": "entity_1", "web_url": "https://example.com"},
497
+ ]
498
+ expected_result = [
499
+ {
500
+ "identifier": "entity_1",
501
+ "blueprint": "service",
502
+ "name": "entity_1",
503
+ "properties": {"url": "https://example.com"},
504
+ },
505
+ ]
506
+
507
+ async with event_context(EventType.HTTP_REQUEST, trigger_type="machine") as event:
508
+ # Use patch to mock the method instead of direct assignment
509
+ with patch.object(
510
+ mock_sync_raw_mixin_with_jq_processor.port_app_config_handler,
511
+ "get_port_app_config",
512
+ return_value=PortAppConfig(
513
+ enable_merge_entity=True,
514
+ delete_dependent_entities=True,
515
+ create_missing_related_entities=False,
516
+ resources=[
517
+ ResourceConfig(
518
+ kind=kind,
519
+ selector=Selector(query="true"),
520
+ port=PortResourceConfig(
521
+ entity=MappingsConfig(
522
+ mappings=EntityMapping(
523
+ identifier=".id | tostring",
524
+ title=".name",
525
+ blueprint='"service"',
526
+ properties={"url": ".web_url"},
527
+ relations={},
528
+ )
529
+ )
530
+ ),
531
+ )
532
+ ],
533
+ ),
534
+ ):
535
+ # Ensure the event.port_app_config is set correctly
536
+ event.port_app_config = await mock_sync_raw_mixin_with_jq_processor.port_app_config_handler.get_port_app_config(
537
+ use_cache=False
538
+ )
539
+
540
+ # Call the unregister_raw method
541
+ unregistered_entities = (
542
+ await mock_sync_raw_mixin_with_jq_processor.unregister_raw(
543
+ kind, raw_entity, user_agent_type
544
+ )
545
+ )
546
+
547
+ # Assert that the unregistered entities match the expected results
548
+ assert len(unregistered_entities) == len(expected_result)
549
+ for entity, result in zip(unregistered_entities, expected_result):
550
+ assert entity.identifier == result["identifier"]
551
+ assert entity.blueprint == result["blueprint"]
552
+ assert entity.properties == result["properties"]
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "port-ocean"
3
- version = "0.17.5"
3
+ version = "0.17.7"
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