port-ocean 0.28.14__tar.gz → 0.28.16__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 (217) hide show
  1. {port_ocean-0.28.14 → port_ocean-0.28.16}/PKG-INFO +1 -1
  2. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/mixins/entities.py +79 -44
  3. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +8 -1
  4. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/mixins/sync_raw.py +1 -1
  5. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/mixins/utils.py +4 -4
  6. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/clients/port/mixins/test_entities.py +71 -5
  7. {port_ocean-0.28.14 → port_ocean-0.28.16}/pyproject.toml +1 -1
  8. {port_ocean-0.28.14 → port_ocean-0.28.16}/LICENSE.md +0 -0
  9. {port_ocean-0.28.14 → port_ocean-0.28.16}/README.md +0 -0
  10. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/Dockerfile.Deb +0 -0
  11. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/Dockerfile.alpine +0 -0
  12. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/Dockerfile.base.builder +0 -0
  13. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/Dockerfile.base.runner +0 -0
  14. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/Dockerfile.dockerignore +0 -0
  15. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/Dockerfile.local +0 -0
  16. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/Makefile +0 -0
  17. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/README.md +0 -0
  18. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/entry_local.sh +0 -0
  19. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/grpcio.sh +0 -0
  20. {port_ocean-0.28.14 → port_ocean-0.28.16}/integrations/_infra/init.sh +0 -0
  21. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/__init__.py +0 -0
  22. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/bootstrap.py +0 -0
  23. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cache/__init__.py +0 -0
  24. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cache/base.py +0 -0
  25. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cache/disk.py +0 -0
  26. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cache/errors.py +0 -0
  27. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cache/memory.py +0 -0
  28. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/__init__.py +0 -0
  29. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cli.py +0 -0
  30. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/__init__.py +0 -0
  31. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/defaults/__init___.py +0 -0
  32. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/defaults/clean.py +0 -0
  33. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/defaults/dock.py +0 -0
  34. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/defaults/group.py +0 -0
  35. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/list_integrations.py +0 -0
  36. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/main.py +0 -0
  37. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/new.py +0 -0
  38. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/pull.py +0 -0
  39. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/sail.py +0 -0
  40. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/commands/version.py +0 -0
  41. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/__init__.py +0 -0
  42. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
  43. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/extensions.py +0 -0
  44. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
  45. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
  46. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
  47. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
  48. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
  49. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
  50. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
  51. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
  52. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
  53. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
  54. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
  55. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
  56. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
  57. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
  58. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
  59. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
  60. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
  61. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
  62. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/cli/utils.py +0 -0
  63. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/__init__.py +0 -0
  64. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/auth/__init__.py +0 -0
  65. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/auth/auth_client.py +0 -0
  66. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/auth/oauth_client.py +0 -0
  67. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/__init__.py +0 -0
  68. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/authentication.py +0 -0
  69. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/client.py +0 -0
  70. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/mixins/__init__.py +0 -0
  71. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/mixins/blueprints.py +0 -0
  72. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/mixins/integrations.py +0 -0
  73. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/mixins/migrations.py +0 -0
  74. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/mixins/organization.py +0 -0
  75. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/retry_transport.py +0 -0
  76. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/types.py +0 -0
  77. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/clients/port/utils.py +0 -0
  78. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/config/__init__.py +0 -0
  79. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/config/base.py +0 -0
  80. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/config/dynamic.py +0 -0
  81. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/config/settings.py +0 -0
  82. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/consumers/__init__.py +0 -0
  83. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/consumers/kafka_consumer.py +0 -0
  84. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/context/__init__.py +0 -0
  85. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/context/event.py +0 -0
  86. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/context/metric_resource.py +0 -0
  87. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/context/ocean.py +0 -0
  88. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/context/resource.py +0 -0
  89. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/__init__.py +0 -0
  90. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/defaults/__init__.py +0 -0
  91. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/defaults/clean.py +0 -0
  92. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/defaults/common.py +0 -0
  93. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/defaults/initialize.py +0 -0
  94. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/event_listener/__init__.py +0 -0
  95. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/event_listener/base.py +0 -0
  96. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/event_listener/factory.py +0 -0
  97. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/event_listener/http.py +0 -0
  98. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/event_listener/kafka.py +0 -0
  99. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/event_listener/once.py +0 -0
  100. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/event_listener/polling.py +0 -0
  101. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/event_listener/webhooks_only.py +0 -0
  102. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/__init__.py +0 -0
  103. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/base.py +0 -0
  104. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
  105. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
  106. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
  107. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
  108. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
  109. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
  110. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
  111. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entity_processor/base.py +0 -0
  112. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/entity_processor/jq_input_evaluator.py +0 -0
  113. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
  114. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/port_app_config/api.py +0 -0
  115. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/port_app_config/base.py +0 -0
  116. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/port_app_config/models.py +0 -0
  117. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/queue/__init__.py +0 -0
  118. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/queue/abstract_queue.py +0 -0
  119. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/queue/group_queue.py +0 -0
  120. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/queue/local_queue.py +0 -0
  121. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
  122. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
  123. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/webhook/__init__.py +0 -0
  124. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/webhook/abstract_webhook_processor.py +0 -0
  125. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/webhook/processor_manager.py +0 -0
  126. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/handlers/webhook/webhook_event.py +0 -0
  127. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/__init__.py +0 -0
  128. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/base.py +0 -0
  129. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/mixins/__init__.py +0 -0
  130. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/mixins/events.py +0 -0
  131. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/mixins/handler.py +0 -0
  132. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/mixins/live_events.py +0 -0
  133. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/integrations/mixins/sync.py +0 -0
  134. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/models.py +0 -0
  135. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/ocean_types.py +0 -0
  136. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
  137. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/core/utils/utils.py +0 -0
  138. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/debug_cli.py +0 -0
  139. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/__init__.py +0 -0
  140. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/api.py +0 -0
  141. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/base.py +0 -0
  142. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/clients.py +0 -0
  143. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/context.py +0 -0
  144. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/core.py +0 -0
  145. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/port_defaults.py +0 -0
  146. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/utils.py +0 -0
  147. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/exceptions/webhook_processor.py +0 -0
  148. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/helpers/__init__.py +0 -0
  149. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/helpers/async_client.py +0 -0
  150. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/helpers/metric/metric.py +0 -0
  151. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/helpers/metric/utils.py +0 -0
  152. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/helpers/retry.py +0 -0
  153. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/helpers/stream.py +0 -0
  154. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/log/__init__.py +0 -0
  155. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/log/handlers.py +0 -0
  156. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/log/logger_setup.py +0 -0
  157. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/log/sensetive.py +0 -0
  158. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/middlewares.py +0 -0
  159. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/ocean.py +0 -0
  160. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/py.typed +0 -0
  161. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/run.py +0 -0
  162. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/sonar-project.properties +0 -0
  163. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/__init__.py +0 -0
  164. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/cache/__init__.py +0 -0
  165. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/cache/test_disk_cache.py +0 -0
  166. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/cache/test_memory_cache.py +0 -0
  167. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/clients/__init__.py +0 -0
  168. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/clients/oauth/__init__.py +0 -0
  169. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/clients/oauth/test_oauth_client.py +0 -0
  170. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/clients/port/mixins/test_integrations.py +0 -0
  171. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/clients/port/mixins/test_organization_mixin.py +0 -0
  172. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/config/test_config.py +0 -0
  173. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/conftest.py +0 -0
  174. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/conftest.py +0 -0
  175. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/defaults/test_common.py +0 -0
  176. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/event_listener/test_kafka.py +0 -0
  177. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/entities_state_applier/test_applier.py +0 -0
  178. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +0 -0
  179. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/entity_processor/test_jq_input_evaluator.py +0 -0
  180. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/mixins/test_live_events.py +0 -0
  181. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +0 -0
  182. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/port_app_config/test_api.py +0 -0
  183. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/port_app_config/test_base.py +0 -0
  184. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/queue/test_group_queue.py +0 -0
  185. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/queue/test_local_queue.py +0 -0
  186. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/webhook/test_abstract_webhook_processor.py +0 -0
  187. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/webhook/test_processor_manager.py +0 -0
  188. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/handlers/webhook/test_webhook_event.py +0 -0
  189. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/test_utils.py +0 -0
  190. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
  191. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/utils/test_get_port_diff.py +0 -0
  192. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/core/utils/test_resolve_entities_diff.py +0 -0
  193. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/helpers/__init__.py +0 -0
  194. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/helpers/fake_port_api.py +0 -0
  195. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/helpers/fixtures.py +0 -0
  196. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/helpers/integration.py +0 -0
  197. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/helpers/ocean_app.py +0 -0
  198. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/helpers/port_client.py +0 -0
  199. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/helpers/smoke_test.py +0 -0
  200. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/helpers/test_retry.py +0 -0
  201. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/log/test_handlers.py +0 -0
  202. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/test_metric.py +0 -0
  203. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/test_ocean.py +0 -0
  204. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/test_smoke.py +0 -0
  205. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/utils/test_async_iterators.py +0 -0
  206. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/tests/utils/test_cache.py +0 -0
  207. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/__init__.py +0 -0
  208. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/async_http.py +0 -0
  209. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/async_iterators.py +0 -0
  210. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/cache.py +0 -0
  211. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/ipc.py +0 -0
  212. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/misc.py +0 -0
  213. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/queue_utils.py +0 -0
  214. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/repeat.py +0 -0
  215. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/signal.py +0 -0
  216. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/utils/time.py +0 -0
  217. {port_ocean-0.28.14 → port_ocean-0.28.16}/port_ocean/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.28.14
3
+ Version: 0.28.16
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,24 +1,24 @@
1
1
  import asyncio
2
+ import json
2
3
  from typing import Any, Literal
3
4
  from urllib.parse import quote_plus
4
- import json
5
5
 
6
6
  import httpx
7
7
  from loguru import logger
8
- from port_ocean.context.ocean import ocean
8
+ from starlette import status
9
+
9
10
  from port_ocean.clients.port.authentication import PortAuthentication
10
11
  from port_ocean.clients.port.types import RequestOptions, UserAgentType
11
12
  from port_ocean.clients.port.utils import (
12
- handle_port_status_code,
13
13
  PORT_HTTP_MAX_CONNECTIONS_LIMIT,
14
+ handle_port_status_code,
14
15
  )
16
+ from port_ocean.context.ocean import ocean
15
17
  from port_ocean.core.models import (
16
18
  BulkUpsertResponse,
17
19
  Entity,
18
20
  PortAPIErrorMessage,
19
21
  )
20
- from starlette import status
21
-
22
22
  from port_ocean.helpers.metric.metric import MetricPhase, MetricType
23
23
 
24
24
  ENTITIES_BULK_SAMPLES_SIZE = 10
@@ -484,54 +484,89 @@ class EntityClientMixin:
484
484
  parameters_to_include: list[str] | None = None,
485
485
  ) -> list[Entity]:
486
486
  if query is None:
487
- datasource_prefix = f"port-ocean/{self.auth.integration_type}/"
488
- datasource_suffix = (
489
- f"/{self.auth.integration_identifier}/{user_agent_type.value}"
490
- )
491
- logger.info(
492
- f"Searching entities with datasource prefix: {datasource_prefix} and suffix: {datasource_suffix}"
493
- )
487
+ return await self._search_entities_by_datasource_paginated(user_agent_type)
488
+
489
+ return await self._search_entities_by_query(
490
+ user_agent_type=user_agent_type,
491
+ query=query,
492
+ parameters_to_include=parameters_to_include,
493
+ )
494
+
495
+ async def _search_entities_by_datasource_paginated(
496
+ self, user_agent_type: UserAgentType
497
+ ) -> list[Entity]:
498
+ datasource_prefix = f"port-ocean/{self.auth.integration_type}/"
499
+ datasource_suffix = (
500
+ f"/{self.auth.integration_identifier}/{user_agent_type.value}"
501
+ )
502
+ logger.info(
503
+ f"Searching entities with datasource prefix: {datasource_prefix} and suffix: {datasource_suffix}"
504
+ )
505
+
506
+ next_from: str | None = None
507
+ aggregated_entities: list[Entity] = []
508
+ while True:
509
+ request_body: dict[str, Any] = {
510
+ "datasource_prefix": datasource_prefix,
511
+ "datasource_suffix": datasource_suffix,
512
+ }
513
+
514
+ if next_from:
515
+ request_body["from"] = next_from
494
516
 
495
517
  response = await self.client.post(
496
518
  f"{self.auth.api_url}/blueprints/entities/datasource-entities",
497
- json={
498
- "datasource_prefix": datasource_prefix,
499
- "datasource_suffix": datasource_suffix,
500
- },
519
+ json=request_body,
501
520
  headers=await self.auth.headers(user_agent_type),
502
521
  extensions={"retryable": True},
503
522
  )
504
- else:
505
- default_query = {
506
- "combinator": "and",
507
- "rules": [
508
- {
509
- "property": "$datasource",
510
- "operator": "contains",
511
- "value": f"port-ocean/{self.auth.integration_type}/",
512
- },
513
- {
514
- "property": "$datasource",
515
- "operator": "contains",
516
- "value": f"/{self.auth.integration_identifier}/{user_agent_type.value}",
517
- },
518
- ],
519
- }
523
+ handle_port_status_code(response)
524
+ response_json = response.json()
525
+ aggregated_entities.extend(
526
+ Entity.parse_obj(result) for result in response_json.get("entities", [])
527
+ )
528
+ next_from = response_json.get("next")
529
+ if not next_from:
530
+ break
520
531
 
521
- if query.get("rules"):
522
- query["rules"].extend(default_query["rules"])
532
+ return aggregated_entities
523
533
 
524
- logger.info(f"Searching entities with custom query: {query}")
525
- response = await self.client.post(
526
- f"{self.auth.api_url}/entities/search",
527
- json=query,
528
- headers=await self.auth.headers(user_agent_type),
529
- params={
530
- "exclude_calculated_properties": "true",
531
- "include": parameters_to_include or ["blueprint", "identifier"],
534
+ async def _search_entities_by_query(
535
+ self,
536
+ user_agent_type: UserAgentType,
537
+ query: dict[Any, Any],
538
+ parameters_to_include: list[str] | None,
539
+ ) -> list[Entity]:
540
+ default_query = {
541
+ "combinator": "and",
542
+ "rules": [
543
+ {
544
+ "property": "$datasource",
545
+ "operator": "contains",
546
+ "value": f"port-ocean/{self.auth.integration_type}/",
532
547
  },
533
- extensions={"retryable": True},
534
- )
548
+ {
549
+ "property": "$datasource",
550
+ "operator": "contains",
551
+ "value": f"/{self.auth.integration_identifier}/{user_agent_type.value}",
552
+ },
553
+ ],
554
+ }
555
+
556
+ if query.get("rules"):
557
+ query["rules"].extend(default_query["rules"])
558
+
559
+ logger.info(f"Searching entities with custom query: {query}")
560
+ response = await self.client.post(
561
+ f"{self.auth.api_url}/entities/search",
562
+ json=query,
563
+ headers=await self.auth.headers(user_agent_type),
564
+ params={
565
+ "exclude_calculated_properties": "true",
566
+ "include": parameters_to_include or ["blueprint", "identifier"],
567
+ },
568
+ extensions={"retryable": True},
569
+ )
535
570
 
536
571
  handle_port_status_code(response)
537
572
  return [Entity.parse_obj(result) for result in response.json()["entities"]]
@@ -808,5 +808,12 @@ class JQEntityProcessor(BaseEntityProcessor):
808
808
  ) -> dict[str, Any]:
809
809
  if isinstance(data, tuple):
810
810
  raw_data = json.loads(data[1])
811
- return {items_to_parse_name: data[0], **raw_data}
811
+ return {
812
+ **(
813
+ data[0]
814
+ if items_to_parse_name in data[0]
815
+ else {items_to_parse_name: data[0]}
816
+ ),
817
+ **raw_data,
818
+ }
812
819
  return data
@@ -123,7 +123,7 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
123
123
  f"Found sync function for {resource_config.kind} name: {task.__qualname__}"
124
124
  )
125
125
  task = typing.cast(Callable[[str], Awaitable[RAW_RESULT]], task)
126
- tasks.append(resync_function_wrapper(task, resource_config.kind))
126
+ tasks.append(resync_function_wrapper(task, resource_config.kind, resource_config.port.items_to_parse))
127
127
 
128
128
  logger.info(
129
129
  f"Found {len(tasks) + len(results)} resync tasks for {resource_config.kind}"
@@ -56,7 +56,7 @@ def _process_path_type_items(
56
56
  content = json.loads(f.read())
57
57
  # Create a copy of the item with the content field
58
58
  processed_item = item.copy()
59
- processed_item["content"] = content
59
+ processed_item["file"]["content"] = content
60
60
  processed_result.append(processed_item)
61
61
  else:
62
62
  # If file doesn't exist, keep the original item
@@ -97,12 +97,12 @@ def resync_error_handling() -> Generator[None, None, None]:
97
97
 
98
98
 
99
99
  async def resync_function_wrapper(
100
- fn: Callable[[str], Awaitable[RAW_RESULT]], kind: str
100
+ fn: Callable[[str], Awaitable[RAW_RESULT]], kind: str, items_to_parse: str | None = None
101
101
  ) -> RAW_RESULT:
102
102
  with resync_error_handling():
103
103
  results = await fn(kind)
104
104
  validated_results = validate_result(results)
105
- return _process_path_type_items(validated_results)
105
+ return _process_path_type_items(validated_results, items_to_parse)
106
106
 
107
107
 
108
108
  async def resync_generator_wrapper(
@@ -117,7 +117,7 @@ async def resync_generator_wrapper(
117
117
  result = await anext(generator)
118
118
  if not ocean.config.yield_items_to_parse:
119
119
  validated_result = validate_result(result)
120
- processed_result = _process_path_type_items(validated_result)
120
+ processed_result = _process_path_type_items(validated_result,items_to_parse)
121
121
  yield processed_result
122
122
  else:
123
123
  if items_to_parse:
@@ -179,7 +179,7 @@ async def test_search_entities_uses_datasource_route_when_query_is_none(
179
179
  ) -> None:
180
180
  """Test that search_entities uses datasource route when query is None"""
181
181
  mock_response = MagicMock()
182
- mock_response.json.return_value = {"entities": []}
182
+ mock_response.json.return_value = {"entities": [], "next": None}
183
183
  mock_response.is_error = False
184
184
  mock_response.status_code = 200
185
185
  mock_response.headers = {}
@@ -208,8 +208,74 @@ async def test_search_entities_uses_datasource_route_when_query_is_none(
208
208
  == "https://api.getport.io/v1/blueprints/entities/datasource-entities"
209
209
  )
210
210
 
211
- expected_json = {
212
- "datasource_prefix": "port-ocean/test-integration/",
213
- "datasource_suffix": "/test-identifier/sync",
211
+ sent_json = call_args[1]["json"]
212
+ assert sent_json["datasource_prefix"] == "port-ocean/test-integration/"
213
+ assert sent_json["datasource_suffix"] == "/test-identifier/sync"
214
+
215
+
216
+ async def test_search_entities_uses_datasource_route_when_query_is_none_two_pages(
217
+ entity_client: EntityClientMixin,
218
+ ) -> None:
219
+ """Test that search_entities uses datasource route when query is None"""
220
+ # First response with pagination token
221
+ mock_response_first = MagicMock()
222
+ mock_response_first.json.return_value = {
223
+ "entities": [
224
+ Entity(identifier="entity_1", blueprint="entity_1"),
225
+ Entity(identifier="entity_2", blueprint="entity_2"),
226
+ ],
227
+ "next": "next_page_token",
228
+ }
229
+ mock_response_first.is_error = False
230
+ mock_response_first.status_code = 200
231
+ mock_response_first.headers = {}
232
+
233
+ # Second response without pagination token (end of pagination)
234
+ mock_response_second = MagicMock()
235
+ mock_response_second.json.return_value = {
236
+ "entities": [Entity(identifier="entity_3", blueprint="entity_3")],
237
+ "next": None,
214
238
  }
215
- assert call_args[1]["json"] == expected_json
239
+ mock_response_second.is_error = False
240
+ mock_response_second.status_code = 200
241
+ mock_response_second.headers = {}
242
+
243
+ # Mock the client to return different responses for each call
244
+ entity_client.client.post = AsyncMock(side_effect=[mock_response_first, mock_response_second]) # type: ignore
245
+ entity_client.auth.headers = AsyncMock(return_value={"Authorization": "Bearer test"}) # type: ignore
246
+
247
+ entity_client.auth.integration_type = "test-integration"
248
+ entity_client.auth.integration_identifier = "test-identifier"
249
+ entity_client.auth.api_url = "https://api.getport.io/v1"
250
+
251
+ mock_user_agent_type = MagicMock()
252
+ mock_user_agent_type.value = "sync"
253
+
254
+ entities = await entity_client.search_entities(
255
+ user_agent_type=mock_user_agent_type,
256
+ query=None,
257
+ )
258
+
259
+ # Should call the datasource-entities endpoint exactly twice for pagination
260
+ assert entity_client.client.post.await_count == 2
261
+ assert len(entities) == 3
262
+
263
+ # Check first call
264
+ first_call_args = entity_client.client.post.call_args_list[0]
265
+ assert (
266
+ first_call_args[0][0]
267
+ == "https://api.getport.io/v1/blueprints/entities/datasource-entities"
268
+ )
269
+ first_sent_json = first_call_args[1]["json"]
270
+ assert first_sent_json["datasource_prefix"] == "port-ocean/test-integration/"
271
+ assert first_sent_json["datasource_suffix"] == "/test-identifier/sync"
272
+
273
+ # Check second call
274
+ second_call_args = entity_client.client.post.call_args_list[1]
275
+ assert (
276
+ second_call_args[0][0]
277
+ == "https://api.getport.io/v1/blueprints/entities/datasource-entities"
278
+ )
279
+ second_sent_json = second_call_args[1]["json"]
280
+ assert second_sent_json["datasource_prefix"] == "port-ocean/test-integration/"
281
+ assert second_sent_json["datasource_suffix"] == "/test-identifier/sync"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "port-ocean"
3
- version = "0.28.14"
3
+ version = "0.28.16"
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