port-ocean 0.18.5__tar.gz → 0.18.6__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. {port_ocean-0.18.5 → port_ocean-0.18.6}/PKG-INFO +1 -1
  2. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/integrations/mixins/sync_raw.py +25 -19
  3. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +149 -124
  4. {port_ocean-0.18.5 → port_ocean-0.18.6}/pyproject.toml +1 -1
  5. {port_ocean-0.18.5 → port_ocean-0.18.6}/LICENSE.md +0 -0
  6. {port_ocean-0.18.5 → port_ocean-0.18.6}/README.md +0 -0
  7. {port_ocean-0.18.5 → port_ocean-0.18.6}/integrations/_infra/Dockerfile.Deb +0 -0
  8. {port_ocean-0.18.5 → port_ocean-0.18.6}/integrations/_infra/Dockerfile.alpine +0 -0
  9. {port_ocean-0.18.5 → port_ocean-0.18.6}/integrations/_infra/Dockerfile.base.builder +0 -0
  10. {port_ocean-0.18.5 → port_ocean-0.18.6}/integrations/_infra/Dockerfile.base.runner +0 -0
  11. {port_ocean-0.18.5 → port_ocean-0.18.6}/integrations/_infra/Dockerfile.dockerignore +0 -0
  12. {port_ocean-0.18.5 → port_ocean-0.18.6}/integrations/_infra/Makefile +0 -0
  13. {port_ocean-0.18.5 → port_ocean-0.18.6}/integrations/_infra/grpcio.sh +0 -0
  14. {port_ocean-0.18.5 → port_ocean-0.18.6}/integrations/_infra/init.sh +0 -0
  15. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/__init__.py +0 -0
  16. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/bootstrap.py +0 -0
  17. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/__init__.py +0 -0
  18. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cli.py +0 -0
  19. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/__init__.py +0 -0
  20. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/defaults/__init___.py +0 -0
  21. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/defaults/clean.py +0 -0
  22. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/defaults/dock.py +0 -0
  23. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/defaults/group.py +0 -0
  24. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/list_integrations.py +0 -0
  25. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/main.py +0 -0
  26. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/new.py +0 -0
  27. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/pull.py +0 -0
  28. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/sail.py +0 -0
  29. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/commands/version.py +0 -0
  30. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/__init__.py +0 -0
  31. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
  32. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/extensions.py +0 -0
  33. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
  34. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
  35. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
  36. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
  37. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
  38. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
  39. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
  40. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
  41. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
  42. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
  43. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
  44. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
  45. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
  46. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
  47. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
  48. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
  49. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
  50. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
  51. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/cli/utils.py +0 -0
  52. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/__init__.py +0 -0
  53. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/__init__.py +0 -0
  54. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/authentication.py +0 -0
  55. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/client.py +0 -0
  56. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/mixins/__init__.py +0 -0
  57. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/mixins/blueprints.py +0 -0
  58. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/mixins/entities.py +0 -0
  59. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/mixins/integrations.py +0 -0
  60. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/mixins/migrations.py +0 -0
  61. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/mixins/organization.py +0 -0
  62. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/retry_transport.py +0 -0
  63. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/types.py +0 -0
  64. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/clients/port/utils.py +0 -0
  65. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/config/__init__.py +0 -0
  66. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/config/base.py +0 -0
  67. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/config/dynamic.py +0 -0
  68. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/config/settings.py +0 -0
  69. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/consumers/__init__.py +0 -0
  70. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/consumers/kafka_consumer.py +0 -0
  71. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/context/__init__.py +0 -0
  72. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/context/event.py +0 -0
  73. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/context/ocean.py +0 -0
  74. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/context/resource.py +0 -0
  75. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/__init__.py +0 -0
  76. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/defaults/__init__.py +0 -0
  77. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/defaults/clean.py +0 -0
  78. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/defaults/common.py +0 -0
  79. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/defaults/initialize.py +0 -0
  80. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/event_listener/__init__.py +0 -0
  81. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/event_listener/base.py +0 -0
  82. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/event_listener/factory.py +0 -0
  83. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/event_listener/http.py +0 -0
  84. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/event_listener/kafka.py +0 -0
  85. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/event_listener/once.py +0 -0
  86. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/event_listener/polling.py +0 -0
  87. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/event_listener/webhooks_only.py +0 -0
  88. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/__init__.py +0 -0
  89. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/base.py +0 -0
  90. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
  91. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
  92. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
  93. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
  94. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
  95. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
  96. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
  97. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entity_processor/base.py +0 -0
  98. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +0 -0
  99. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
  100. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/port_app_config/api.py +0 -0
  101. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/port_app_config/base.py +0 -0
  102. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/port_app_config/models.py +0 -0
  103. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
  104. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
  105. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/integrations/__init__.py +0 -0
  106. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/integrations/base.py +0 -0
  107. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/integrations/mixins/__init__.py +0 -0
  108. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/integrations/mixins/events.py +0 -0
  109. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/integrations/mixins/handler.py +0 -0
  110. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/integrations/mixins/sync.py +0 -0
  111. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/integrations/mixins/utils.py +0 -0
  112. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/models.py +0 -0
  113. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/ocean_types.py +0 -0
  114. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
  115. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/core/utils/utils.py +0 -0
  116. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/debug_cli.py +0 -0
  117. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/exceptions/__init__.py +0 -0
  118. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/exceptions/api.py +0 -0
  119. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/exceptions/base.py +0 -0
  120. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/exceptions/clients.py +0 -0
  121. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/exceptions/context.py +0 -0
  122. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/exceptions/core.py +0 -0
  123. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/exceptions/port_defaults.py +0 -0
  124. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/exceptions/utils.py +0 -0
  125. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/helpers/__init__.py +0 -0
  126. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/helpers/async_client.py +0 -0
  127. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/helpers/retry.py +0 -0
  128. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/log/__init__.py +0 -0
  129. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/log/handlers.py +0 -0
  130. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/log/logger_setup.py +0 -0
  131. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/log/sensetive.py +0 -0
  132. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/middlewares.py +0 -0
  133. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/ocean.py +0 -0
  134. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/py.typed +0 -0
  135. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/run.py +0 -0
  136. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/sonar-project.properties +0 -0
  137. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/__init__.py +0 -0
  138. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
  139. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/clients/port/mixins/test_organization_mixin.py +0 -0
  140. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/conftest.py +0 -0
  141. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/core/defaults/test_common.py +0 -0
  142. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +0 -0
  143. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/core/handlers/port_app_config/test_api.py +0 -0
  144. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/core/handlers/port_app_config/test_base.py +0 -0
  145. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/core/test_utils.py +0 -0
  146. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
  147. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/core/utils/test_resolve_entities_diff.py +0 -0
  148. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/helpers/__init__.py +0 -0
  149. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/helpers/fake_port_api.py +0 -0
  150. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/helpers/fixtures.py +0 -0
  151. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/helpers/integration.py +0 -0
  152. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/helpers/ocean_app.py +0 -0
  153. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/helpers/port_client.py +0 -0
  154. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/helpers/smoke_test.py +0 -0
  155. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/log/test_handlers.py +0 -0
  156. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/test_smoke.py +0 -0
  157. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/utils/test_async_iterators.py +0 -0
  158. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/tests/utils/test_cache.py +0 -0
  159. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/__init__.py +0 -0
  160. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/async_http.py +0 -0
  161. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/async_iterators.py +0 -0
  162. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/cache.py +0 -0
  163. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/misc.py +0 -0
  164. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/queue_utils.py +0 -0
  165. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/repeat.py +0 -0
  166. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/signal.py +0 -0
  167. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/utils/time.py +0 -0
  168. {port_ocean-0.18.5 → port_ocean-0.18.6}/port_ocean/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.18.5
3
+ Version: 0.18.6
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
@@ -220,26 +220,32 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
220
220
  )
221
221
  modified_objects = []
222
222
 
223
- try:
224
- changed_entities = await self._map_entities_compared_with_port(
225
- objects_diff[0].entity_selector_diff.passed,
226
- resource,
227
- user_agent_type
228
- )
229
- if changed_entities:
230
- logger.info("Upserting changed entities", changed_entities=len(changed_entities),
231
- total_entities=len(objects_diff[0].entity_selector_diff.passed))
232
- await self.entities_state_applier.upsert(
233
- changed_entities, user_agent_type
234
- )
235
- else:
236
- logger.info("Entities in batch didn't changed since last sync, skipping", total_entities=len(objects_diff[0].entity_selector_diff.passed))
237
- modified_objects = [ocean.port_client._reduce_entity(entity) for entity in objects_diff[0].entity_selector_diff.passed]
238
- except Exception as e:
239
- logger.warning(f"Failed to resolve batch entities with Port, falling back to upserting all entities: {str(e)}")
240
- modified_objects = await self.entities_state_applier.upsert(
241
- objects_diff[0].entity_selector_diff.passed, user_agent_type
223
+ if event.event_type == EventType.RESYNC:
224
+ try:
225
+ changed_entities = await self._map_entities_compared_with_port(
226
+ objects_diff[0].entity_selector_diff.passed,
227
+ resource,
228
+ user_agent_type
242
229
  )
230
+ if changed_entities:
231
+ logger.info("Upserting changed entities", changed_entities=len(changed_entities),
232
+ total_entities=len(objects_diff[0].entity_selector_diff.passed))
233
+ await self.entities_state_applier.upsert(
234
+ changed_entities, user_agent_type
235
+ )
236
+ else:
237
+ logger.info("Entities in batch didn't changed since last sync, skipping", total_entities=len(objects_diff[0].entity_selector_diff.passed))
238
+ modified_objects = [ocean.port_client._reduce_entity(entity) for entity in objects_diff[0].entity_selector_diff.passed]
239
+ except Exception as e:
240
+ logger.warning(f"Failed to resolve batch entities with Port, falling back to upserting all entities: {str(e)}")
241
+ modified_objects = await self.entities_state_applier.upsert(
242
+ objects_diff[0].entity_selector_diff.passed, user_agent_type
243
+ )
244
+ else:
245
+ modified_objects = await self.entities_state_applier.upsert(
246
+ objects_diff[0].entity_selector_diff.passed, user_agent_type
247
+ )
248
+
243
249
 
244
250
  return CalculationResult(
245
251
  objects_diff[0].entity_selector_diff._replace(passed=modified_objects),
@@ -435,66 +435,63 @@ async def test_register_raw(
435
435
  mock_sync_raw_mixin_with_jq_processor: SyncRawMixin,
436
436
  mock_resource_config: ResourceConfig,
437
437
  ) -> None:
438
- # Mock the integration settings with skip_check_diff
439
- with patch.object(ocean.config.integration, "skip_check_diff", False):
440
- kind = "service"
441
- user_agent_type = UserAgentType.exporter
442
- raw_entity = [
443
- {"id": "entity_1", "name": "entity_1", "web_url": "https://example.com"},
444
- ]
445
- expected_result = [
446
- {
447
- "identifier": "entity_1",
448
- "blueprint": "service",
449
- "name": "entity_1",
450
- "properties": {},
451
- },
452
- ]
453
438
 
454
- async with event_context(
455
- EventType.HTTP_REQUEST, trigger_type="machine"
456
- ) as event:
457
- # Use patch to mock the method instead of direct assignment
439
+ kind = "service"
440
+ user_agent_type = UserAgentType.exporter
441
+ raw_entity = [
442
+ {"id": "entity_1", "name": "entity_1", "web_url": "https://example.com"},
443
+ ]
444
+ expected_result = [
445
+ {
446
+ "identifier": "entity_1",
447
+ "blueprint": "service",
448
+ "name": "entity_1",
449
+ "properties": {"url": "https://example.com"},
450
+ },
451
+ ]
452
+
453
+ async with event_context(EventType.HTTP_REQUEST, trigger_type="machine") as event:
454
+ # Use patch to mock the method instead of direct assignment
455
+ with patch.object(
456
+ mock_sync_raw_mixin_with_jq_processor.port_app_config_handler,
457
+ "get_port_app_config",
458
+ return_value=PortAppConfig(
459
+ enable_merge_entity=True,
460
+ delete_dependent_entities=True,
461
+ create_missing_related_entities=False,
462
+ resources=[mock_resource_config],
463
+ ),
464
+ ):
465
+ # Ensure the event.port_app_config is set correctly
466
+ event.port_app_config = await mock_sync_raw_mixin_with_jq_processor.port_app_config_handler.get_port_app_config(
467
+ use_cache=False
468
+ )
469
+
470
+ def upsert_side_effect(
471
+ entities: list[Entity], user_agent_type: UserAgentType
472
+ ) -> list[Entity]:
473
+ # Simulate returning the passed entities
474
+ return entities
475
+
476
+ # Patch the upsert method with the side effect
458
477
  with patch.object(
459
- mock_sync_raw_mixin_with_jq_processor.port_app_config_handler,
460
- "get_port_app_config",
461
- return_value=PortAppConfig(
462
- enable_merge_entity=True,
463
- delete_dependent_entities=True,
464
- create_missing_related_entities=False,
465
- resources=[mock_resource_config],
466
- ),
478
+ mock_sync_raw_mixin_with_jq_processor.entities_state_applier,
479
+ "upsert",
480
+ side_effect=upsert_side_effect,
467
481
  ):
468
- # Ensure the event.port_app_config is set correctly
469
- event.port_app_config = await mock_sync_raw_mixin_with_jq_processor.port_app_config_handler.get_port_app_config(
470
- use_cache=False
471
- )
472
-
473
- def upsert_side_effect(
474
- entities: list[Entity], user_agent_type: UserAgentType
475
- ) -> list[Entity]:
476
- # Simulate returning the passed entities
477
- return entities
478
-
479
- # Patch the upsert method with the side effect
480
- with patch.object(
481
- mock_sync_raw_mixin_with_jq_processor.entities_state_applier,
482
- "upsert",
483
- side_effect=upsert_side_effect,
484
- ):
485
- # Call the register_raw method
486
- registered_entities = (
487
- await mock_sync_raw_mixin_with_jq_processor.register_raw(
488
- kind, raw_entity, user_agent_type
489
- )
482
+ # Call the register_raw method
483
+ registered_entities = (
484
+ await mock_sync_raw_mixin_with_jq_processor.register_raw(
485
+ kind, raw_entity, user_agent_type
490
486
  )
487
+ )
491
488
 
492
- # Assert that the registered entities match the expected results
493
- assert len(registered_entities) == len(expected_result)
494
- for entity, result in zip(registered_entities, expected_result):
495
- assert entity.identifier == result["identifier"]
496
- assert entity.blueprint == result["blueprint"]
497
- assert entity.properties == result["properties"]
489
+ # Assert that the registered entities match the expected results
490
+ assert len(registered_entities) == len(expected_result)
491
+ for entity, result in zip(registered_entities, expected_result):
492
+ assert entity.identifier == result["identifier"]
493
+ assert entity.blueprint == result["blueprint"]
494
+ assert entity.properties == result["properties"]
498
495
 
499
496
 
500
497
  @pytest.mark.asyncio
@@ -689,30 +686,26 @@ async def test_register_resource_raw_no_changes_upsert_not_called_entitiy_is_ret
689
686
  mock_sync_raw_mixin: SyncRawMixin,
690
687
  mock_port_app_config: PortAppConfig,
691
688
  ) -> None:
692
- # Mock the integration settings with skip_check_diff
693
- with patch.object(ocean.config.integration, "skip_check_diff", False):
694
- entity = Entity(identifier="1", blueprint="service")
695
- mock_sync_raw_mixin._calculate_raw = AsyncMock(return_value=[CalculationResult(entity_selector_diff=EntitySelectorDiff(passed=[entity], failed=[]), errors=[], misconfigurations=[], misonfigured_entity_keys=[])]) # type: ignore
696
- mock_sync_raw_mixin._map_entities_compared_with_port = AsyncMock(return_value=([])) # type: ignore
697
- mock_sync_raw_mixin.entities_state_applier.upsert = AsyncMock() # type: ignore
698
-
699
- async with event_context(EventType.RESYNC, trigger_type="machine") as event:
700
- event.port_app_config = mock_port_app_config
701
-
702
- # Test execution
703
- result = await mock_sync_raw_mixin._register_resource_raw(
704
- mock_port_app_config.resources[
705
- 0
706
- ], # Use the first resource from the config
707
- [{"some": "data"}],
708
- UserAgentType.exporter,
709
- )
689
+ entity = Entity(identifier="1", blueprint="service")
690
+ mock_sync_raw_mixin._calculate_raw = AsyncMock(return_value=[CalculationResult(entity_selector_diff=EntitySelectorDiff(passed=[entity], failed=[]), errors=[], misconfigurations=[], misonfigured_entity_keys=[])]) # type: ignore
691
+ mock_sync_raw_mixin._map_entities_compared_with_port = AsyncMock(return_value=([])) # type: ignore
692
+ mock_sync_raw_mixin.entities_state_applier.upsert = AsyncMock() # type: ignore
693
+
694
+ async with event_context(EventType.RESYNC, trigger_type="machine") as event:
695
+ event.port_app_config = mock_port_app_config
696
+
697
+ # Test execution
698
+ result = await mock_sync_raw_mixin._register_resource_raw(
699
+ mock_port_app_config.resources[0], # Use the first resource from the config
700
+ [{"some": "data"}],
701
+ UserAgentType.exporter,
702
+ )
710
703
 
711
- # Assertions
712
- assert len(result.entity_selector_diff.passed) == 1
713
- mock_sync_raw_mixin._calculate_raw.assert_called_once()
714
- mock_sync_raw_mixin.entities_state_applier.upsert.assert_not_called()
715
- mock_sync_raw_mixin._map_entities_compared_with_port.assert_called_once()
704
+ # Assertions
705
+ assert len(result.entity_selector_diff.passed) == 1
706
+ mock_sync_raw_mixin._calculate_raw.assert_called_once()
707
+ mock_sync_raw_mixin.entities_state_applier.upsert.assert_not_called()
708
+ mock_sync_raw_mixin._map_entities_compared_with_port.assert_called_once()
716
709
 
717
710
 
718
711
  @pytest.mark.asyncio
@@ -720,57 +713,89 @@ async def test_register_resource_raw_with_changes_upsert_called_and_entities_are
720
713
  mock_sync_raw_mixin: SyncRawMixin,
721
714
  mock_port_app_config: PortAppConfig,
722
715
  ) -> None:
723
- # Mock the integration settings with skip_check_diff
724
- with patch.object(ocean.config.integration, "skip_check_diff", False):
725
- entity = Entity(identifier="1", blueprint="service")
726
- mock_sync_raw_mixin._calculate_raw = AsyncMock(return_value=[CalculationResult(entity_selector_diff=EntitySelectorDiff(passed=[entity], failed=[]), errors=[], misconfigurations=[], misonfigured_entity_keys=[])]) # type: ignore
727
- mock_sync_raw_mixin._map_entities_compared_with_port = AsyncMock(return_value=([entity])) # type: ignore
728
- mock_sync_raw_mixin.entities_state_applier.upsert = AsyncMock(return_value=[entity]) # type: ignore
729
-
730
- async with event_context(EventType.RESYNC, trigger_type="machine") as event:
731
- event.port_app_config = mock_port_app_config
732
-
733
- # Test execution
734
- result = await mock_sync_raw_mixin._register_resource_raw(
735
- mock_port_app_config.resources[0],
736
- [{"some": "data"}],
737
- UserAgentType.exporter,
738
- )
716
+ entity = Entity(identifier="1", blueprint="service")
717
+ mock_sync_raw_mixin._calculate_raw = AsyncMock(return_value=[CalculationResult(entity_selector_diff=EntitySelectorDiff(passed=[entity], failed=[]), errors=[], misconfigurations=[], misonfigured_entity_keys=[])]) # type: ignore
718
+ mock_sync_raw_mixin._map_entities_compared_with_port = AsyncMock(return_value=([entity])) # type: ignore
719
+ mock_sync_raw_mixin.entities_state_applier.upsert = AsyncMock(return_value=[entity]) # type: ignore
720
+
721
+ async with event_context(EventType.RESYNC, trigger_type="machine") as event:
722
+ event.port_app_config = mock_port_app_config
723
+
724
+ # Test execution
725
+ result = await mock_sync_raw_mixin._register_resource_raw(
726
+ mock_port_app_config.resources[0],
727
+ [{"some": "data"}],
728
+ UserAgentType.exporter,
729
+ )
739
730
 
740
- # Assertions
741
- assert len(result.entity_selector_diff.passed) == 1
742
- mock_sync_raw_mixin._calculate_raw.assert_called_once()
743
- mock_sync_raw_mixin.entities_state_applier.upsert.assert_called_once()
744
- mock_sync_raw_mixin._map_entities_compared_with_port.assert_called_once()
731
+ # Assertions
732
+ assert len(result.entity_selector_diff.passed) == 1
733
+ mock_sync_raw_mixin._calculate_raw.assert_called_once()
734
+ mock_sync_raw_mixin.entities_state_applier.upsert.assert_called_once()
735
+ mock_sync_raw_mixin._map_entities_compared_with_port.assert_called_once()
745
736
 
746
737
 
747
738
  @pytest.mark.asyncio
748
739
  async def test_register_resource_raw_with_errors(
749
740
  mock_sync_raw_mixin: SyncRawMixin, mock_port_app_config: PortAppConfig
750
741
  ) -> None:
751
- # Mock the integration settings with skip_check_diff
752
- with patch.object(ocean.config.integration, "skip_check_diff", False):
753
- failed_entity = Entity(identifier="1", blueprint="service")
754
- error = Exception("Test error")
755
- mock_sync_raw_mixin._calculate_raw = AsyncMock(return_value=[CalculationResult(entity_selector_diff=EntitySelectorDiff(passed=[], failed=[failed_entity]), errors=[error], misconfigurations=[], misonfigured_entity_keys=[])]) # type: ignore
756
- mock_sync_raw_mixin._map_entities_compared_with_port = AsyncMock(return_value=([])) # type: ignore
757
- mock_sync_raw_mixin.entities_state_applier.upsert = AsyncMock() # type: ignore
758
-
759
- async with event_context(EventType.RESYNC, trigger_type="machine") as event:
760
- event.port_app_config = mock_port_app_config
761
-
762
- # Test execution
763
- result = await mock_sync_raw_mixin._register_resource_raw(
764
- mock_port_app_config.resources[0],
765
- [{"some": "data"}],
766
- UserAgentType.exporter,
767
- )
742
+ failed_entity = Entity(identifier="1", blueprint="service")
743
+ error = Exception("Test error")
744
+ mock_sync_raw_mixin._calculate_raw = AsyncMock(return_value=[CalculationResult(entity_selector_diff=EntitySelectorDiff(passed=[], failed=[failed_entity]), errors=[error], misconfigurations=[], misonfigured_entity_keys=[])]) # type: ignore
745
+ mock_sync_raw_mixin._map_entities_compared_with_port = AsyncMock(return_value=([])) # type: ignore
746
+ mock_sync_raw_mixin.entities_state_applier.upsert = AsyncMock() # type: ignore
747
+
748
+ async with event_context(EventType.RESYNC, trigger_type="machine") as event:
749
+ event.port_app_config = mock_port_app_config
750
+
751
+ # Test execution
752
+ result = await mock_sync_raw_mixin._register_resource_raw(
753
+ mock_port_app_config.resources[0],
754
+ [{"some": "data"}],
755
+ UserAgentType.exporter,
756
+ )
757
+
758
+ # Assertions
759
+ assert len(result.entity_selector_diff.passed) == 0
760
+ assert len(result.entity_selector_diff.failed) == 1
761
+ assert len(result.errors) == 1
762
+ assert result.errors[0] == error
763
+ mock_sync_raw_mixin._calculate_raw.assert_called_once()
764
+ mock_sync_raw_mixin._map_entities_compared_with_port.assert_called_once()
765
+ mock_sync_raw_mixin.entities_state_applier.upsert.assert_not_called()
766
+
767
+
768
+ @pytest.mark.asyncio
769
+ async def test_register_resource_raw_skip_event_type_http_request_upsert_called_and_no_entitites_diff_calculation(
770
+ mock_sync_raw_mixin: SyncRawMixin,
771
+ mock_port_app_config: PortAppConfig,
772
+ mock_context: PortOceanContext,
773
+ monkeypatch: pytest.MonkeyPatch,
774
+ ) -> None:
775
+ # Mock dependencies
776
+ entity = Entity(identifier="1", blueprint="service")
777
+ calculation_result = CalculationResult(
778
+ entity_selector_diff=EntitySelectorDiff(passed=[entity], failed=[]),
779
+ errors=[],
780
+ misconfigurations=[],
781
+ misonfigured_entity_keys=[],
782
+ )
783
+ mock_sync_raw_mixin._calculate_raw = AsyncMock(return_value=[calculation_result]) # type: ignore
784
+ mock_sync_raw_mixin._map_entities_compared_with_port = AsyncMock() # type: ignore
785
+ mock_sync_raw_mixin.entities_state_applier.upsert = AsyncMock(return_value=[entity]) # type: ignore
786
+
787
+ async with event_context(EventType.HTTP_REQUEST, trigger_type="machine") as event:
788
+ event.port_app_config = mock_port_app_config
789
+
790
+ # Test execution
791
+ result = await mock_sync_raw_mixin._register_resource_raw(
792
+ mock_port_app_config.resources[0],
793
+ [{"some": "data"}],
794
+ UserAgentType.exporter,
795
+ )
768
796
 
769
- # Assertions
770
- assert len(result.entity_selector_diff.passed) == 0
771
- assert len(result.entity_selector_diff.failed) == 1
772
- assert len(result.errors) == 1
773
- assert result.errors[0] == error
774
- mock_sync_raw_mixin._calculate_raw.assert_called_once()
775
- mock_sync_raw_mixin._map_entities_compared_with_port.assert_called_once()
776
- mock_sync_raw_mixin.entities_state_applier.upsert.assert_not_called()
797
+ # Assertions
798
+ assert len(result.entity_selector_diff.passed) == 1
799
+ mock_sync_raw_mixin._calculate_raw.assert_called_once()
800
+ mock_sync_raw_mixin._map_entities_compared_with_port.assert_not_called()
801
+ mock_sync_raw_mixin.entities_state_applier.upsert.assert_called_once()
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "port-ocean"
3
- version = "0.18.5"
3
+ version = "0.18.6"
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