port-ocean 0.29.10__tar.gz → 0.30.1__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.
Files changed (225) hide show
  1. {port_ocean-0.29.10 → port_ocean-0.30.1}/PKG-INFO +1 -1
  2. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/mixins/entities.py +14 -0
  3. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/actions/execution_manager.py +0 -8
  4. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +31 -9
  5. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/models.py +0 -1
  6. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/actions/test_execution_manager.py +0 -4
  7. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +29 -6
  8. {port_ocean-0.29.10 → port_ocean-0.30.1}/pyproject.toml +1 -1
  9. {port_ocean-0.29.10 → port_ocean-0.30.1}/LICENSE.md +0 -0
  10. {port_ocean-0.29.10 → port_ocean-0.30.1}/README.md +0 -0
  11. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/Dockerfile.Deb +0 -0
  12. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/Dockerfile.alpine +0 -0
  13. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/Dockerfile.base.builder +0 -0
  14. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/Dockerfile.base.runner +0 -0
  15. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/Dockerfile.dockerignore +0 -0
  16. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/Dockerfile.local +0 -0
  17. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/Makefile +0 -0
  18. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/README.md +0 -0
  19. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/entry_local.sh +0 -0
  20. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/grpcio.sh +0 -0
  21. {port_ocean-0.29.10 → port_ocean-0.30.1}/integrations/_infra/init.sh +0 -0
  22. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/__init__.py +0 -0
  23. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/bootstrap.py +0 -0
  24. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cache/__init__.py +0 -0
  25. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cache/base.py +0 -0
  26. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cache/disk.py +0 -0
  27. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cache/errors.py +0 -0
  28. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cache/memory.py +0 -0
  29. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/__init__.py +0 -0
  30. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cli.py +0 -0
  31. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/__init__.py +0 -0
  32. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/defaults/__init___.py +0 -0
  33. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/defaults/clean.py +0 -0
  34. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/defaults/dock.py +0 -0
  35. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/defaults/group.py +0 -0
  36. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/list_integrations.py +0 -0
  37. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/main.py +0 -0
  38. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/new.py +0 -0
  39. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/pull.py +0 -0
  40. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/sail.py +0 -0
  41. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/commands/version.py +0 -0
  42. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/__init__.py +0 -0
  43. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
  44. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/extensions.py +0 -0
  45. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
  46. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
  47. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
  48. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
  49. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
  50. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
  51. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
  52. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
  53. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
  54. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
  55. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
  56. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
  57. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
  58. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
  59. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
  60. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
  61. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
  62. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
  63. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/cli/utils.py +0 -0
  64. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/__init__.py +0 -0
  65. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/auth/__init__.py +0 -0
  66. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/auth/auth_client.py +0 -0
  67. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/auth/oauth_client.py +0 -0
  68. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/__init__.py +0 -0
  69. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/authentication.py +0 -0
  70. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/client.py +0 -0
  71. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/mixins/__init__.py +0 -0
  72. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/mixins/actions.py +0 -0
  73. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/mixins/blueprints.py +0 -0
  74. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/mixins/integrations.py +0 -0
  75. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/mixins/migrations.py +0 -0
  76. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/mixins/organization.py +0 -0
  77. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/retry_transport.py +0 -0
  78. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/types.py +0 -0
  79. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/clients/port/utils.py +0 -0
  80. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/config/__init__.py +0 -0
  81. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/config/base.py +0 -0
  82. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/config/dynamic.py +0 -0
  83. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/config/settings.py +0 -0
  84. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/consumers/__init__.py +0 -0
  85. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/consumers/kafka_consumer.py +0 -0
  86. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/context/__init__.py +0 -0
  87. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/context/event.py +0 -0
  88. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/context/metric_resource.py +0 -0
  89. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/context/ocean.py +0 -0
  90. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/context/resource.py +0 -0
  91. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/__init__.py +0 -0
  92. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/defaults/__init__.py +0 -0
  93. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/defaults/clean.py +0 -0
  94. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/defaults/common.py +0 -0
  95. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/defaults/initialize.py +0 -0
  96. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/__init__.py +0 -0
  97. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/actions_only.py +0 -0
  98. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/base.py +0 -0
  99. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/factory.py +0 -0
  100. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/http.py +0 -0
  101. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/kafka.py +0 -0
  102. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/once.py +0 -0
  103. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/polling.py +0 -0
  104. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/event_listener/webhooks_only.py +0 -0
  105. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/__init__.py +0 -0
  106. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/actions/__init__.py +0 -0
  107. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/actions/abstract_executor.py +0 -0
  108. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/base.py +0 -0
  109. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
  110. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
  111. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
  112. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
  113. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
  114. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
  115. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
  116. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entity_processor/base.py +0 -0
  117. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/entity_processor/jq_input_evaluator.py +0 -0
  118. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
  119. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/port_app_config/api.py +0 -0
  120. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/port_app_config/base.py +0 -0
  121. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/port_app_config/models.py +0 -0
  122. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/queue/__init__.py +0 -0
  123. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/queue/abstract_queue.py +0 -0
  124. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/queue/group_queue.py +0 -0
  125. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/queue/local_queue.py +0 -0
  126. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
  127. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
  128. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/webhook/__init__.py +0 -0
  129. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/webhook/abstract_webhook_processor.py +0 -0
  130. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/webhook/processor_manager.py +0 -0
  131. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/handlers/webhook/webhook_event.py +0 -0
  132. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/__init__.py +0 -0
  133. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/base.py +0 -0
  134. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/mixins/__init__.py +0 -0
  135. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/mixins/events.py +0 -0
  136. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/mixins/handler.py +0 -0
  137. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/mixins/live_events.py +0 -0
  138. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/mixins/sync.py +0 -0
  139. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/mixins/sync_raw.py +0 -0
  140. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/integrations/mixins/utils.py +0 -0
  141. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/ocean_types.py +0 -0
  142. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
  143. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/core/utils/utils.py +0 -0
  144. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/debug_cli.py +0 -0
  145. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/__init__.py +0 -0
  146. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/api.py +0 -0
  147. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/base.py +0 -0
  148. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/clients.py +0 -0
  149. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/context.py +0 -0
  150. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/core.py +0 -0
  151. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/execution_manager.py +0 -0
  152. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/port_defaults.py +0 -0
  153. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/utils.py +0 -0
  154. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/exceptions/webhook_processor.py +0 -0
  155. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/helpers/__init__.py +0 -0
  156. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/helpers/async_client.py +0 -0
  157. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/helpers/metric/metric.py +0 -0
  158. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/helpers/metric/utils.py +0 -0
  159. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/helpers/retry.py +0 -0
  160. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/helpers/stream.py +0 -0
  161. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/log/__init__.py +0 -0
  162. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/log/handlers.py +0 -0
  163. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/log/logger_setup.py +0 -0
  164. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/log/sensetive.py +0 -0
  165. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/middlewares.py +0 -0
  166. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/ocean.py +0 -0
  167. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/py.typed +0 -0
  168. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/run.py +0 -0
  169. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/sonar-project.properties +0 -0
  170. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/__init__.py +0 -0
  171. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/cache/__init__.py +0 -0
  172. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/cache/test_disk_cache.py +0 -0
  173. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/cache/test_memory_cache.py +0 -0
  174. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/clients/__init__.py +0 -0
  175. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/clients/oauth/__init__.py +0 -0
  176. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/clients/oauth/test_oauth_client.py +0 -0
  177. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
  178. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/clients/port/mixins/test_integrations.py +0 -0
  179. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/clients/port/mixins/test_organization_mixin.py +0 -0
  180. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/config/test_config.py +0 -0
  181. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/conftest.py +0 -0
  182. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/conftest.py +0 -0
  183. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/defaults/test_common.py +0 -0
  184. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/event_listener/test_kafka.py +0 -0
  185. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/entities_state_applier/test_applier.py +0 -0
  186. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/entity_processor/test_jq_input_evaluator.py +0 -0
  187. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/mixins/test_live_events.py +0 -0
  188. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +0 -0
  189. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/port_app_config/test_api.py +0 -0
  190. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/port_app_config/test_base.py +0 -0
  191. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/queue/test_group_queue.py +0 -0
  192. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/queue/test_local_queue.py +0 -0
  193. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/webhook/test_abstract_webhook_processor.py +0 -0
  194. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/webhook/test_processor_manager.py +0 -0
  195. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/handlers/webhook/test_webhook_event.py +0 -0
  196. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/test_utils.py +0 -0
  197. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
  198. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/utils/test_get_port_diff.py +0 -0
  199. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/core/utils/test_resolve_entities_diff.py +0 -0
  200. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/helpers/__init__.py +0 -0
  201. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/helpers/fake_port_api.py +0 -0
  202. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/helpers/fixtures.py +0 -0
  203. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/helpers/integration.py +0 -0
  204. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/helpers/ocean_app.py +0 -0
  205. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/helpers/port_client.py +0 -0
  206. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/helpers/smoke_test.py +0 -0
  207. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/helpers/test_retry.py +0 -0
  208. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/log/test_handlers.py +0 -0
  209. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/test_metric.py +0 -0
  210. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/test_metrics_endpoints.py +0 -0
  211. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/test_ocean.py +0 -0
  212. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/test_smoke.py +0 -0
  213. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/utils/test_async_iterators.py +0 -0
  214. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/tests/utils/test_cache.py +0 -0
  215. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/__init__.py +0 -0
  216. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/async_http.py +0 -0
  217. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/async_iterators.py +0 -0
  218. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/cache.py +0 -0
  219. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/ipc.py +0 -0
  220. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/misc.py +0 -0
  221. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/queue_utils.py +0 -0
  222. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/repeat.py +0 -0
  223. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/signal.py +0 -0
  224. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/utils/time.py +0 -0
  225. {port_ocean-0.29.10 → port_ocean-0.30.1}/port_ocean/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.29.10
3
+ Version: 0.30.1
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
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import json
3
+ from collections import Counter
3
4
  from typing import Any, Literal
4
5
  from urllib.parse import quote_plus
5
6
 
@@ -355,6 +356,19 @@ class EntityClientMixin:
355
356
  entities_results: list[tuple[bool, Entity]] = []
356
357
  blueprint = entities[0].blueprint
357
358
 
359
+ identifier_counts = Counter((e.blueprint, e.identifier) for e in entities)
360
+ duplicate_count = sum(
361
+ count - 1 for count in identifier_counts.values() if count > 1
362
+ )
363
+
364
+ if duplicate_count:
365
+ duplicate_examples = [
366
+ key for key, cnt in identifier_counts.items() if cnt > 1
367
+ ][:5]
368
+ logger.warning(
369
+ f"Detected {duplicate_count} duplicate entities (by blueprint and identifier) that may not be ingested because an identical identifier existed. Examples: {duplicate_examples}"
370
+ )
371
+
358
372
  bulk_size = self.calculate_entities_batch_size(entities)
359
373
  bulks = [
360
374
  entities[i : i + bulk_size] for i in range(0, len(entities), bulk_size)
@@ -13,7 +13,6 @@ from port_ocean.core.handlers.webhook.processor_manager import (
13
13
  LiveEventsProcessorManager,
14
14
  )
15
15
  from port_ocean.context.ocean import ocean
16
- from port_ocean.core.models import IntegrationFeatureFlag
17
16
  from port_ocean.exceptions.execution_manager import (
18
17
  DuplicateActionExecutorError,
19
18
  PartitionKeyNotFoundError,
@@ -132,13 +131,6 @@ class ExecutionManager:
132
131
  """
133
132
  Start polling and processing action runs for all registered actions.
134
133
  """
135
- flags = await ocean.port_client.get_organization_feature_flags()
136
- if IntegrationFeatureFlag.OCEAN_ACTIONS_PROCESSING_ENABLED not in flags:
137
- logger.warning(
138
- "Actions processing is not allowed for your organization, skipping actions processing"
139
- )
140
- return
141
-
142
134
  if not await ocean.port_client.auth.is_machine_user():
143
135
  logger.warning(
144
136
  "Actions processing is allowed only for machine users, skipping actions processing"
@@ -1,19 +1,27 @@
1
1
  import asyncio
2
+ import json
3
+ import re
2
4
  from asyncio import Task
3
5
  from dataclasses import dataclass, field
4
6
  from functools import lru_cache
5
- import json
6
7
  from typing import Any, Optional
8
+
7
9
  import jq # type: ignore
8
10
  from loguru import logger
11
+
9
12
  from port_ocean.context.ocean import ocean
10
13
  from port_ocean.core.handlers.entity_processor.base import BaseEntityProcessor
14
+ from port_ocean.core.handlers.entity_processor.jq_input_evaluator import (
15
+ InputClassifyingResult,
16
+ can_expression_run_with_no_input,
17
+ classify_input,
18
+ )
11
19
  from port_ocean.core.handlers.port_app_config.models import ResourceConfig
12
20
  from port_ocean.core.models import Entity
13
21
  from port_ocean.core.ocean_types import (
14
22
  RAW_ITEM,
15
- EntitySelectorDiff,
16
23
  CalculationResult,
24
+ EntitySelectorDiff,
17
25
  )
18
26
  from port_ocean.core.utils.utils import (
19
27
  gather_and_split_errors_from_results,
@@ -21,11 +29,6 @@ from port_ocean.core.utils.utils import (
21
29
  )
22
30
  from port_ocean.exceptions.core import EntityProcessorException
23
31
  from port_ocean.utils.queue_utils import process_in_queue
24
- from port_ocean.core.handlers.entity_processor.jq_input_evaluator import (
25
- InputClassifyingResult,
26
- classify_input,
27
- can_expression_run_with_no_input,
28
- )
29
32
 
30
33
 
31
34
  class ExampleStates:
@@ -92,8 +95,29 @@ class JQEntityProcessor(BaseEntityProcessor):
92
95
  searching for data in dictionaries, and transforming data based on object mappings.
93
96
  """
94
97
 
98
+ @staticmethod
99
+ def _format_filter(filter: str) -> str:
100
+ """
101
+ Convert single quotes to double quotes in JQ expressions.
102
+ Only replaces single quotes that are opening or closing string delimiters,
103
+ not single quotes that are part of string content.
104
+ """
105
+ # Escape single quotes only if they are opening or closing a string
106
+ # Pattern matches:
107
+ # - Single quote at start of string or after whitespace (opening quote)
108
+ # - Single quote before whitespace or end of string (closing quote)
109
+ # Uses negative lookahead/lookbehind to avoid replacing quotes inside strings
110
+ # \1 and \2 will be empty for the alternative that didn't match, so \1"\2 works for both cases
111
+ # This matches the TypeScript pattern: /(^|\s)'(?!\s|")|(?<!\s|")'(\s|$)/g
112
+ formatted_filter = re.sub(
113
+ r'(^|\s)\'(?!\s|")|(?<!\s|")\'(\s|$)', r'\1"\2', filter
114
+ )
115
+ return formatted_filter
116
+
95
117
  @lru_cache
96
118
  def _compile(self, pattern: str) -> Any:
119
+ # Convert single quotes to double quotes for JQ compatibility
120
+ pattern = self._format_filter(pattern)
97
121
  if not ocean.config.allow_environment_variables_jq_access:
98
122
  pattern = "def env: {}; {} as $ENV | " + pattern
99
123
  return jq.compile(pattern)
@@ -119,7 +143,6 @@ class JQEntityProcessor(BaseEntityProcessor):
119
143
  missing_required_fields: bool,
120
144
  entity_mapping_fault_counter: int,
121
145
  ) -> None:
122
-
123
146
  if len(entity_misconfigurations) > 0:
124
147
  logger.info(
125
148
  f"Unable to find valid data for: {entity_misconfigurations} (null, missing, or misconfigured)"
@@ -444,7 +467,6 @@ class JQEntityProcessor(BaseEntityProcessor):
444
467
  key: str,
445
468
  value: dict[str, Any],
446
469
  ) -> None:
447
-
448
470
  if key in ["properties", "relations"]:
449
471
  mapping_dicts: dict[InputClassifyingResult, dict[str, Any]] = {
450
472
  InputClassifyingResult.SINGLE: {},
@@ -134,7 +134,6 @@ class EntityPortDiff:
134
134
  class IntegrationFeatureFlag(StrEnum):
135
135
  USE_PROVISIONED_DEFAULTS = "USE_PROVISIONED_DEFAULTS"
136
136
  LAKEHOUSE_ELIGIBLE = "LAKEHOUSE_ELIGIBLE"
137
- OCEAN_ACTIONS_PROCESSING_ENABLED = "OCEAN_ACTIONS_PROCESSING_ENABLED"
138
137
 
139
138
 
140
139
  class RunStatus(StrEnum):
@@ -25,7 +25,6 @@ from port_ocean.core.handlers.webhook.processor_manager import (
25
25
  from port_ocean.core.models import (
26
26
  ActionRun,
27
27
  IntegrationActionInvocationPayload,
28
- IntegrationFeatureFlag,
29
28
  RunStatus,
30
29
  )
31
30
  from port_ocean.exceptions.execution_manager import (
@@ -62,9 +61,6 @@ def mock_port_client() -> MagicMock:
62
61
  mock_port_client.get_run_by_external_id = AsyncMock()
63
62
  mock_port_client.patch_run = AsyncMock()
64
63
  mock_port_client.post_run_log = AsyncMock()
65
- mock_port_client.get_organization_feature_flags = AsyncMock(
66
- return_value=[IntegrationFeatureFlag.OCEAN_ACTIONS_PROCESSING_ENABLED]
67
- )
68
64
  mock_port_client.auth = AsyncMock(spec=PortAuthentication)
69
65
  mock_port_client.auth.is_machine_user = AsyncMock(return_value=True)
70
66
  return mock_port_client
@@ -1,8 +1,9 @@
1
- from typing import cast, Any
2
- from unittest.mock import AsyncMock, Mock
3
- from loguru import logger
4
- import pytest
5
1
  from io import StringIO
2
+ from typing import Any, cast
3
+ from unittest.mock import AsyncMock, Mock, patch
4
+
5
+ import pytest
6
+ from loguru import logger
6
7
 
7
8
  from port_ocean.context.ocean import PortOceanContext
8
9
  from port_ocean.core.handlers.entity_processor.jq_entity_processor import (
@@ -10,12 +11,10 @@ from port_ocean.core.handlers.entity_processor.jq_entity_processor import (
10
11
  )
11
12
  from port_ocean.core.ocean_types import CalculationResult
12
13
  from port_ocean.exceptions.core import EntityProcessorException
13
- from unittest.mock import patch
14
14
 
15
15
 
16
16
  @pytest.mark.asyncio
17
17
  class TestJQEntityProcessor:
18
-
19
18
  @pytest.fixture
20
19
  def mocked_processor(self, monkeypatch: Any) -> JQEntityProcessor:
21
20
  mock_context = AsyncMock()
@@ -33,6 +32,30 @@ class TestJQEntityProcessor:
33
32
  result = await mocked_processor._search(data, pattern)
34
33
  assert result == "bar"
35
34
 
35
+ async def test_search_with_single_quotes(
36
+ self, mocked_processor: JQEntityProcessor
37
+ ) -> None:
38
+ data = {"repository": "ocean", "organization": "port"}
39
+ pattern = ".organization + '/' + .repository"
40
+ result = await mocked_processor._search(data, pattern)
41
+ assert result == "port/ocean"
42
+
43
+ async def test_search_with_single_quotes_in_the_end(
44
+ self, mocked_processor: JQEntityProcessor
45
+ ) -> None:
46
+ data = {"organization": "port"}
47
+ pattern = ".organization + '/'"
48
+ result = await mocked_processor._search(data, pattern)
49
+ assert result == "port/"
50
+
51
+ async def test_search_with_single_quotes_in_the_start(
52
+ self, mocked_processor: JQEntityProcessor
53
+ ) -> None:
54
+ data = {"organization": "port"}
55
+ pattern = "'/' + .organization"
56
+ result = await mocked_processor._search(data, pattern)
57
+ assert result == "/port"
58
+
36
59
  async def test_search_as_bool(self, mocked_processor: JQEntityProcessor) -> None:
37
60
  data = {"foo": True}
38
61
  pattern = ".foo"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "port-ocean"
3
- version = "0.29.10"
3
+ version = "0.30.1"
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