port-ocean 0.12.2.dev5__tar.gz → 0.12.2.dev7__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 (146) hide show
  1. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/PKG-INFO +1 -1
  2. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/mixins/entities.py +39 -40
  3. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/event_listener/base.py +2 -11
  4. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entities_state_applier/port/applier.py +31 -32
  5. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/integrations/mixins/sync_raw.py +46 -44
  6. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/log/handlers.py +7 -8
  7. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/ocean.py +11 -12
  8. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/pyproject.toml +1 -1
  9. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/LICENSE.md +0 -0
  10. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/README.md +0 -0
  11. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/__init__.py +0 -0
  12. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/bootstrap.py +0 -0
  13. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/__init__.py +0 -0
  14. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cli.py +0 -0
  15. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/__init__.py +0 -0
  16. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/defaults/__init___.py +0 -0
  17. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/defaults/clean.py +0 -0
  18. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/defaults/dock.py +0 -0
  19. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/defaults/group.py +0 -0
  20. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/list_integrations.py +0 -0
  21. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/main.py +0 -0
  22. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/new.py +0 -0
  23. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/pull.py +0 -0
  24. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/sail.py +0 -0
  25. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/commands/version.py +0 -0
  26. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/__init__.py +0 -0
  27. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
  28. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/extensions.py +0 -0
  29. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
  30. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.dockerignore +0 -0
  31. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
  32. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
  33. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
  34. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
  35. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
  36. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
  37. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
  38. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
  39. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Dockerfile +0 -0
  40. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
  41. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
  42. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
  43. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
  44. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
  45. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
  46. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
  47. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
  48. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
  49. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/cli/utils.py +0 -0
  50. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/__init__.py +0 -0
  51. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/__init__.py +0 -0
  52. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/authentication.py +0 -0
  53. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/client.py +0 -0
  54. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/mixins/__init__.py +0 -0
  55. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/mixins/blueprints.py +0 -0
  56. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/mixins/integrations.py +0 -0
  57. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/mixins/migrations.py +0 -0
  58. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/retry_transport.py +0 -0
  59. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/types.py +0 -0
  60. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/clients/port/utils.py +0 -0
  61. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/config/__init__.py +0 -0
  62. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/config/base.py +0 -0
  63. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/config/dynamic.py +0 -0
  64. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/config/settings.py +0 -0
  65. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/consumers/__init__.py +0 -0
  66. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/consumers/kafka_consumer.py +0 -0
  67. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/context/__init__.py +0 -0
  68. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/context/event.py +0 -0
  69. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/context/ocean.py +0 -0
  70. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/context/resource.py +0 -0
  71. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/__init__.py +0 -0
  72. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/defaults/__init__.py +0 -0
  73. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/defaults/clean.py +0 -0
  74. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/defaults/common.py +0 -0
  75. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/defaults/initialize.py +0 -0
  76. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/event_listener/__init__.py +0 -0
  77. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/event_listener/factory.py +0 -0
  78. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/event_listener/http.py +0 -0
  79. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/event_listener/kafka.py +0 -0
  80. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/event_listener/once.py +0 -0
  81. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/event_listener/polling.py +0 -0
  82. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/__init__.py +0 -0
  83. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/base.py +0 -0
  84. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
  85. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
  86. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
  87. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
  88. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
  89. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
  90. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entity_processor/base.py +0 -0
  91. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +0 -0
  92. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
  93. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/port_app_config/api.py +0 -0
  94. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/port_app_config/base.py +0 -0
  95. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/port_app_config/models.py +0 -0
  96. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
  97. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
  98. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/integrations/__init__.py +0 -0
  99. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/integrations/base.py +0 -0
  100. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/integrations/mixins/__init__.py +0 -0
  101. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/integrations/mixins/events.py +0 -0
  102. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/integrations/mixins/handler.py +0 -0
  103. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/integrations/mixins/sync.py +0 -0
  104. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/integrations/mixins/utils.py +0 -0
  105. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/models.py +0 -0
  106. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/ocean_types.py +0 -0
  107. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/core/utils.py +0 -0
  108. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/exceptions/__init__.py +0 -0
  109. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/exceptions/api.py +0 -0
  110. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/exceptions/base.py +0 -0
  111. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/exceptions/clients.py +0 -0
  112. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/exceptions/context.py +0 -0
  113. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/exceptions/core.py +0 -0
  114. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/exceptions/port_defaults.py +0 -0
  115. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/exceptions/utils.py +0 -0
  116. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/helpers/__init__.py +0 -0
  117. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/helpers/async_client.py +0 -0
  118. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/helpers/retry.py +0 -0
  119. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/log/__init__.py +0 -0
  120. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/log/logger_setup.py +0 -0
  121. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/log/sensetive.py +0 -0
  122. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/middlewares.py +0 -0
  123. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/py.typed +0 -0
  124. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/run.py +0 -0
  125. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/sonar-project.properties +0 -0
  126. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/__init__.py +0 -0
  127. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
  128. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/conftest.py +0 -0
  129. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +0 -0
  130. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/helpers/__init__.py +0 -0
  131. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/helpers/fixtures.py +0 -0
  132. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/helpers/integration.py +0 -0
  133. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/helpers/ocean_app.py +0 -0
  134. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/helpers/port_client.py +0 -0
  135. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/helpers/smoke_test.py +0 -0
  136. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/tests/test_smoke.py +0 -0
  137. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/__init__.py +0 -0
  138. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/async_http.py +0 -0
  139. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/async_iterators.py +0 -0
  140. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/cache.py +0 -0
  141. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/misc.py +0 -0
  142. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/queue_utils.py +0 -0
  143. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/repeat.py +0 -0
  144. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/signal.py +0 -0
  145. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/utils/time.py +0 -0
  146. {port_ocean-0.12.2.dev5 → port_ocean-0.12.2.dev7}/port_ocean/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.12.2.dev5
3
+ Version: 0.12.2.dev7
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
@@ -56,33 +56,33 @@ class EntityClientMixin:
56
56
  f"entity: {entity.identifier} of "
57
57
  f"blueprint: {entity.blueprint}"
58
58
  )
59
- # handle_status_code(response, should_raise)
60
- # result = response.json()
61
- #
62
- # result_entity = (
63
- # Entity.parse_obj(result["entity"]) if result.get("entity") else entity
64
- # )
65
- #
66
- # # Happens when upsert fails and search identifier is defined.
67
- # # We return None to ignore the entity later in the delete process
68
- # if result_entity.is_using_search_identifier:
69
- # return None
70
- #
71
- # # In order to save memory we'll keep only the identifier, blueprint and relations of the
72
- # # upserted entity result for later calculations
73
- # reduced_entity = Entity(
74
- # identifier=result_entity.identifier, blueprint=result_entity.blueprint
75
- # )
76
- #
77
- # # Turning dict typed relations (raw search relations) is required
78
- # # for us to be able to successfully calculate the participation related entities
79
- # # and ignore the ones that don't as they weren't upserted
80
- # reduced_entity.relations = {
81
- # key: None if isinstance(relation, dict) else relation
82
- # for key, relation in result_entity.relations.items()
83
- # }
84
-
85
- return None
59
+ handle_status_code(response, should_raise)
60
+ result = response.json()
61
+
62
+ result_entity = (
63
+ Entity.parse_obj(result["entity"]) if result.get("entity") else entity
64
+ )
65
+
66
+ # Happens when upsert fails and search identifier is defined.
67
+ # We return None to ignore the entity later in the delete process
68
+ if result_entity.is_using_search_identifier:
69
+ return None
70
+
71
+ # In order to save memory we'll keep only the identifier, blueprint and relations of the
72
+ # upserted entity result for later calculations
73
+ reduced_entity = Entity(
74
+ identifier=result_entity.identifier, blueprint=result_entity.blueprint
75
+ )
76
+
77
+ # Turning dict typed relations (raw search relations) is required
78
+ # for us to be able to successfully calculate the participation related entities
79
+ # and ignore the ones that don't as they weren't upserted
80
+ reduced_entity.relations = {
81
+ key: None if isinstance(relation, dict) else relation
82
+ for key, relation in result_entity.relations.items()
83
+ }
84
+
85
+ return reduced_entity
86
86
 
87
87
  async def batch_upsert_entities(
88
88
  self,
@@ -91,7 +91,7 @@ class EntityClientMixin:
91
91
  user_agent_type: UserAgentType | None = None,
92
92
  should_raise: bool = True,
93
93
  ) -> list[Entity]:
94
- await asyncio.gather(
94
+ modified_entities_results = await asyncio.gather(
95
95
  *(
96
96
  self.upsert_entity(
97
97
  entity,
@@ -103,18 +103,17 @@ class EntityClientMixin:
103
103
  ),
104
104
  return_exceptions=True,
105
105
  )
106
- return []
107
- # entity_results = [
108
- # entity for entity in modified_entities_results if isinstance(entity, Entity)
109
- # ]
110
- # if not should_raise:
111
- # return entity_results
112
- #
113
- # for entity_result in modified_entities_results:
114
- # if isinstance(entity_result, Exception):
115
- # raise entity_result
116
- #
117
- # return entity_results
106
+ entity_results = [
107
+ entity for entity in modified_entities_results if isinstance(entity, Entity)
108
+ ]
109
+ if not should_raise:
110
+ return entity_results
111
+
112
+ for entity_result in modified_entities_results:
113
+ if isinstance(entity_result, Exception):
114
+ raise entity_result
115
+
116
+ return entity_results
118
117
 
119
118
  async def delete_entity(
120
119
  self,
@@ -1,14 +1,12 @@
1
- import asyncio
2
1
  from abc import abstractmethod
3
- from concurrent.futures import ProcessPoolExecutor
4
2
  from typing import TypedDict, Callable, Any, Awaitable
5
3
 
6
4
  from pydantic import Extra
7
5
 
8
6
  from port_ocean.config.base import BaseOceanModel
7
+ from port_ocean.utils.signal import signal_handler
9
8
  from port_ocean.context.ocean import ocean
10
9
  from port_ocean.utils.misc import IntegrationStateStatus
11
- from port_ocean.utils.signal import signal_handler
12
10
 
13
11
 
14
12
  class EventListenerEvents(TypedDict):
@@ -69,14 +67,7 @@ class BaseEventListener:
69
67
  """
70
68
  await self._before_resync()
71
69
  try:
72
- loop = asyncio.get_event_loop()
73
- with ProcessPoolExecutor() as executor:
74
- e = executor.submit(
75
- lambda: asyncio.run_coroutine_threadsafe(
76
- self.events["on_resync"](resync_args), loop
77
- )
78
- )
79
- signal_handler.register(e.cancel)
70
+ await self.events["on_resync"](resync_args)
80
71
  await self._after_resync()
81
72
  except Exception as e:
82
73
  await self._on_resync_failure(e)
@@ -97,38 +97,37 @@ class HttpEntitiesStateApplier(BaseEntitiesStateApplier):
97
97
  self, entities: list[Entity], user_agent_type: UserAgentType
98
98
  ) -> list[Entity]:
99
99
  logger.info(f"Upserting {len(entities)} entities")
100
- # modified_entities: list[Entity] = []
101
- # if event.port_app_config.create_missing_related_entities:
102
- await self.context.port_client.batch_upsert_entities(
103
- entities,
104
- event.port_app_config.get_port_request_options(),
105
- user_agent_type,
106
- should_raise=False,
107
- )
108
- # else:
109
- # entities_with_search_identifier: list[Entity] = []
110
- # entities_without_search_identifier: list[Entity] = []
111
- # for entity in entities:
112
- # if entity.is_using_search_identifier:
113
- # entities_with_search_identifier.append(entity)
114
- # else:
115
- # entities_without_search_identifier.append(entity)
116
- #
117
- # ordered_created_entities = reversed(
118
- # entities_with_search_identifier
119
- # + order_by_entities_dependencies(entities_without_search_identifier)
120
- # )
121
- # for entity in ordered_created_entities:
122
- # upsertedEntity = await self.context.port_client.upsert_entity(
123
- # entity,
124
- # event.port_app_config.get_port_request_options(),
125
- # user_agent_type,
126
- # should_raise=False,
127
- # )
128
- # if upsertedEntity:
129
- # modified_entities.append(upsertedEntity)
130
- # return modified_entities
131
- return []
100
+ modified_entities: list[Entity] = []
101
+ if event.port_app_config.create_missing_related_entities:
102
+ modified_entities = await self.context.port_client.batch_upsert_entities(
103
+ entities,
104
+ event.port_app_config.get_port_request_options(),
105
+ user_agent_type,
106
+ should_raise=False,
107
+ )
108
+ else:
109
+ entities_with_search_identifier: list[Entity] = []
110
+ entities_without_search_identifier: list[Entity] = []
111
+ for entity in entities:
112
+ if entity.is_using_search_identifier:
113
+ entities_with_search_identifier.append(entity)
114
+ else:
115
+ entities_without_search_identifier.append(entity)
116
+
117
+ ordered_created_entities = reversed(
118
+ entities_with_search_identifier
119
+ + order_by_entities_dependencies(entities_without_search_identifier)
120
+ )
121
+ for entity in ordered_created_entities:
122
+ upsertedEntity = await self.context.port_client.upsert_entity(
123
+ entity,
124
+ event.port_app_config.get_port_request_options(),
125
+ user_agent_type,
126
+ should_raise=False,
127
+ )
128
+ if upsertedEntity:
129
+ modified_entities.append(upsertedEntity)
130
+ return modified_entities
132
131
 
133
132
  async def delete(
134
133
  self, entities: list[Entity], user_agent_type: UserAgentType
@@ -3,6 +3,7 @@ import inspect
3
3
  import typing
4
4
  from typing import Callable, Awaitable, Any
5
5
 
6
+ import httpx
6
7
  from loguru import logger
7
8
 
8
9
  from port_ocean.clients.port.types import UserAgentType
@@ -139,11 +140,11 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
139
140
  objects_diff = await self._calculate_raw(
140
141
  [(resource, results)], parse_all, send_raw_data_examples_amount
141
142
  )
142
- await self.entities_state_applier.upsert(
143
+ modified_objects = await self.entities_state_applier.upsert(
143
144
  objects_diff[0].entity_selector_diff.passed, user_agent_type
144
145
  )
145
146
  return CalculationResult(
146
- objects_diff[0].entity_selector_diff._replace(passed=objects_diff[0].entity_selector_diff.passed),
147
+ objects_diff[0].entity_selector_diff._replace(passed=modified_objects),
147
148
  errors=objects_diff[0].errors,
148
149
  )
149
150
 
@@ -172,48 +173,49 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
172
173
  self, resource_config: ResourceConfig, user_agent_type: UserAgentType
173
174
  ) -> tuple[list[Entity], list[Exception]]:
174
175
  results, errors = await self._get_resource_raw_results(resource_config)
175
- async_generators: list[ASYNC_GENERATOR_RESYNC_TYPE] = []
176
- raw_results: RAW_RESULT = []
177
- for result in results:
178
- if isinstance(result, dict):
179
- raw_results.append(result)
180
- else:
181
- async_generators.append(result)
182
-
183
- send_raw_data_examples_amount = (
184
- SEND_RAW_DATA_EXAMPLES_AMOUNT if ocean.config.send_raw_data_examples else 0
185
- )
186
- all_entities, register_errors = await self._register_resource_raw(
187
- resource_config,
188
- raw_results,
189
- user_agent_type,
190
- send_raw_data_examples_amount=send_raw_data_examples_amount,
191
- )
192
- errors.extend(register_errors)
193
- passed_entities = list(all_entities.passed)
194
-
195
- for generator in async_generators:
196
- try:
197
- async for items in generator:
198
- if send_raw_data_examples_amount > 0:
199
- send_raw_data_examples_amount = max(
200
- 0, send_raw_data_examples_amount - len(passed_entities)
201
- )
202
-
203
- entities, register_errors = await self._register_resource_raw(
204
- resource_config,
205
- items,
206
- user_agent_type,
207
- send_raw_data_examples_amount=send_raw_data_examples_amount,
208
- )
209
- errors.extend(register_errors)
210
- passed_entities.extend(entities.passed)
211
- except* OceanAbortException as error:
212
- errors.append(error)
213
-
214
- logger.info(
215
- f"Finished registering change for {len(results)} raw results for kind: {resource_config.kind}. {len(passed_entities)} entities were affected"
216
- )
176
+ passed_entities = []
177
+ # async_generators: list[ASYNC_GENERATOR_RESYNC_TYPE] = []
178
+ # raw_results: RAW_RESULT = []
179
+ # for result in results:
180
+ # if isinstance(result, dict):
181
+ # raw_results.append(result)
182
+ # else:
183
+ # async_generators.append(result)
184
+ #
185
+ # send_raw_data_examples_amount = (
186
+ # SEND_RAW_DATA_EXAMPLES_AMOUNT if ocean.config.send_raw_data_examples else 0
187
+ # )
188
+ # all_entities, register_errors = await self._register_resource_raw(
189
+ # resource_config,
190
+ # raw_results,
191
+ # user_agent_type,
192
+ # send_raw_data_examples_amount=send_raw_data_examples_amount,
193
+ # )
194
+ # errors.extend(register_errors)
195
+ # passed_entities = list(all_entities.passed)
196
+ #
197
+ # for generator in async_generators:
198
+ # try:
199
+ # async for items in generator:
200
+ # if send_raw_data_examples_amount > 0:
201
+ # send_raw_data_examples_amount = max(
202
+ # 0, send_raw_data_examples_amount - len(passed_entities)
203
+ # )
204
+ #
205
+ # entities, register_errors = await self._register_resource_raw(
206
+ # resource_config,
207
+ # items,
208
+ # user_agent_type,
209
+ # send_raw_data_examples_amount=send_raw_data_examples_amount,
210
+ # )
211
+ # errors.extend(register_errors)
212
+ # passed_entities.extend(entities.passed)
213
+ # except* OceanAbortException as error:
214
+ # errors.append(error)
215
+ #
216
+ # logger.info(
217
+ # f"Finished registering change for {len(results)} raw results for kind: {resource_config.kind}. {len(passed_entities)} entities were affected"
218
+ # )
217
219
  return passed_entities, errors
218
220
 
219
221
  async def register_raw(
@@ -1,8 +1,8 @@
1
1
  import asyncio
2
2
  import logging
3
3
  import sys
4
+ import threading
4
5
  import time
5
- from concurrent.futures import ProcessPoolExecutor
6
6
  from datetime import datetime
7
7
  from logging.handlers import MemoryHandler
8
8
  from typing import Any
@@ -65,19 +65,18 @@ class HTTPMemoryHandler(MemoryHandler):
65
65
  if self.ocean is None or not self.buffer:
66
66
  return
67
67
 
68
+ def _wrap_event_loop(_ocean: Ocean, logs_to_send: list[dict[str, Any]]) -> None:
69
+ loop = asyncio.new_event_loop()
70
+ loop.run_until_complete(self.send_logs(_ocean, logs_to_send))
71
+ loop.close()
72
+
68
73
  self.acquire()
69
74
  logs = list(self._serialized_buffer)
70
75
  if logs:
71
76
  self.buffer.clear()
72
77
  self._serialized_buffer.clear()
73
78
  self.last_flush_time = time.time()
74
- loop = asyncio.new_event_loop()
75
- with ProcessPoolExecutor() as executor:
76
- executor.submit(
77
- lambda: asyncio.run_coroutine_threadsafe(
78
- self.send_logs(self.ocean, logs), loop
79
- )
80
- )
79
+ threading.Thread(target=_wrap_event_loop, args=(self.ocean, logs)).start()
81
80
  self.release()
82
81
 
83
82
  async def send_logs(
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
  import sys
3
- from concurrent.futures import ProcessPoolExecutor
3
+ import threading
4
4
  from contextlib import asynccontextmanager
5
5
  from typing import Callable, Any, Dict, AsyncIterator, Type
6
6
 
@@ -9,6 +9,8 @@ from loguru import logger
9
9
  from pydantic import BaseModel
10
10
  from starlette.types import Scope, Receive, Send
11
11
 
12
+ from port_ocean.core.handlers.resync_state_updater import ResyncStateUpdater
13
+ from port_ocean.core.models import Runtime
12
14
  from port_ocean.clients.port.client import PortClient
13
15
  from port_ocean.config.settings import (
14
16
  IntegrationConfiguration,
@@ -18,15 +20,13 @@ from port_ocean.context.ocean import (
18
20
  ocean,
19
21
  initialize_port_ocean_context,
20
22
  )
21
- from port_ocean.core.handlers.resync_state_updater import ResyncStateUpdater
22
23
  from port_ocean.core.integrations.base import BaseIntegration
23
- from port_ocean.core.models import Runtime
24
24
  from port_ocean.log.sensetive import sensitive_log_filter
25
25
  from port_ocean.middlewares import request_handler
26
- from port_ocean.utils.misc import IntegrationStateStatus
27
26
  from port_ocean.utils.repeat import repeat_every
28
27
  from port_ocean.utils.signal import signal_handler
29
28
  from port_ocean.version import __integration_version__
29
+ from port_ocean.utils.misc import IntegrationStateStatus
30
30
 
31
31
 
32
32
  class Ocean:
@@ -92,13 +92,6 @@ class Ocean:
92
92
  )
93
93
  raise e
94
94
 
95
- def pool_executor_wrapper(event_loop) -> None:
96
- with ProcessPoolExecutor() as executor:
97
- e = executor.submit(lambda: asyncio.run_coroutine_threadsafe(
98
- execute_resync_all(), event_loop
99
- ))
100
- signal_handler.register(e.cancel)
101
-
102
95
  interval = self.config.scheduled_resync_interval
103
96
  loop = asyncio.get_event_loop()
104
97
  if interval is not None:
@@ -110,7 +103,13 @@ class Ocean:
110
103
  seconds=interval * 60,
111
104
  # Not running the resync immediately because the event listener should run resync on startup
112
105
  wait_first=True,
113
- )(lambda _: pool_executor_wrapper(loop))
106
+ )(
107
+ lambda: threading.Thread(
108
+ target=lambda: asyncio.run_coroutine_threadsafe(
109
+ execute_resync_all(), loop
110
+ )
111
+ ).start()
112
+ )
114
113
  await repeated_function()
115
114
 
116
115
  async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "port-ocean"
3
- version = "0.12.2-dev05"
3
+ version = "0.12.2-dev07"
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"