port-ocean 0.28.15__tar.gz → 0.28.17__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 (218) hide show
  1. {port_ocean-0.28.15 → port_ocean-0.28.17}/PKG-INFO +1 -1
  2. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/mixins/entities.py +79 -44
  3. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/helpers/retry.py +8 -2
  4. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/clients/port/mixins/test_entities.py +71 -5
  5. port_ocean-0.28.17/port_ocean/tests/helpers/test_retry.py +931 -0
  6. {port_ocean-0.28.15 → port_ocean-0.28.17}/pyproject.toml +1 -1
  7. port_ocean-0.28.15/port_ocean/tests/helpers/test_retry.py +0 -309
  8. {port_ocean-0.28.15 → port_ocean-0.28.17}/LICENSE.md +0 -0
  9. {port_ocean-0.28.15 → port_ocean-0.28.17}/README.md +0 -0
  10. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/Dockerfile.Deb +0 -0
  11. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/Dockerfile.alpine +0 -0
  12. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/Dockerfile.base.builder +0 -0
  13. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/Dockerfile.base.runner +0 -0
  14. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/Dockerfile.dockerignore +0 -0
  15. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/Dockerfile.local +0 -0
  16. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/Makefile +0 -0
  17. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/README.md +0 -0
  18. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/entry_local.sh +0 -0
  19. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/grpcio.sh +0 -0
  20. {port_ocean-0.28.15 → port_ocean-0.28.17}/integrations/_infra/init.sh +0 -0
  21. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/__init__.py +0 -0
  22. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/bootstrap.py +0 -0
  23. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cache/__init__.py +0 -0
  24. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cache/base.py +0 -0
  25. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cache/disk.py +0 -0
  26. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cache/errors.py +0 -0
  27. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cache/memory.py +0 -0
  28. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/__init__.py +0 -0
  29. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cli.py +0 -0
  30. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/__init__.py +0 -0
  31. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/defaults/__init___.py +0 -0
  32. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/defaults/clean.py +0 -0
  33. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/defaults/dock.py +0 -0
  34. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/defaults/group.py +0 -0
  35. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/list_integrations.py +0 -0
  36. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/main.py +0 -0
  37. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/new.py +0 -0
  38. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/pull.py +0 -0
  39. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/sail.py +0 -0
  40. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/commands/version.py +0 -0
  41. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/__init__.py +0 -0
  42. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
  43. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/extensions.py +0 -0
  44. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
  45. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
  46. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
  47. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
  48. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
  49. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
  50. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
  51. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
  52. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
  53. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
  54. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
  55. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
  56. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
  57. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
  58. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
  59. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
  60. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
  61. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
  62. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/cli/utils.py +0 -0
  63. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/__init__.py +0 -0
  64. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/auth/__init__.py +0 -0
  65. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/auth/auth_client.py +0 -0
  66. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/auth/oauth_client.py +0 -0
  67. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/__init__.py +0 -0
  68. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/authentication.py +0 -0
  69. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/client.py +0 -0
  70. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/mixins/__init__.py +0 -0
  71. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/mixins/blueprints.py +0 -0
  72. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/mixins/integrations.py +0 -0
  73. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/mixins/migrations.py +0 -0
  74. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/mixins/organization.py +0 -0
  75. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/retry_transport.py +0 -0
  76. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/types.py +0 -0
  77. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/clients/port/utils.py +0 -0
  78. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/config/__init__.py +0 -0
  79. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/config/base.py +0 -0
  80. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/config/dynamic.py +0 -0
  81. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/config/settings.py +0 -0
  82. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/consumers/__init__.py +0 -0
  83. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/consumers/kafka_consumer.py +0 -0
  84. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/context/__init__.py +0 -0
  85. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/context/event.py +0 -0
  86. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/context/metric_resource.py +0 -0
  87. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/context/ocean.py +0 -0
  88. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/context/resource.py +0 -0
  89. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/__init__.py +0 -0
  90. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/defaults/__init__.py +0 -0
  91. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/defaults/clean.py +0 -0
  92. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/defaults/common.py +0 -0
  93. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/defaults/initialize.py +0 -0
  94. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/event_listener/__init__.py +0 -0
  95. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/event_listener/base.py +0 -0
  96. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/event_listener/factory.py +0 -0
  97. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/event_listener/http.py +0 -0
  98. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/event_listener/kafka.py +0 -0
  99. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/event_listener/once.py +0 -0
  100. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/event_listener/polling.py +0 -0
  101. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/event_listener/webhooks_only.py +0 -0
  102. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/__init__.py +0 -0
  103. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/base.py +0 -0
  104. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
  105. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
  106. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
  107. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
  108. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
  109. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
  110. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
  111. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entity_processor/base.py +0 -0
  112. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +0 -0
  113. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/entity_processor/jq_input_evaluator.py +0 -0
  114. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
  115. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/port_app_config/api.py +0 -0
  116. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/port_app_config/base.py +0 -0
  117. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/port_app_config/models.py +0 -0
  118. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/queue/__init__.py +0 -0
  119. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/queue/abstract_queue.py +0 -0
  120. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/queue/group_queue.py +0 -0
  121. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/queue/local_queue.py +0 -0
  122. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
  123. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
  124. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/webhook/__init__.py +0 -0
  125. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/webhook/abstract_webhook_processor.py +0 -0
  126. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/webhook/processor_manager.py +0 -0
  127. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/handlers/webhook/webhook_event.py +0 -0
  128. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/__init__.py +0 -0
  129. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/base.py +0 -0
  130. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/mixins/__init__.py +0 -0
  131. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/mixins/events.py +0 -0
  132. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/mixins/handler.py +0 -0
  133. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/mixins/live_events.py +0 -0
  134. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/mixins/sync.py +0 -0
  135. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/mixins/sync_raw.py +0 -0
  136. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/integrations/mixins/utils.py +0 -0
  137. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/models.py +0 -0
  138. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/ocean_types.py +0 -0
  139. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
  140. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/core/utils/utils.py +0 -0
  141. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/debug_cli.py +0 -0
  142. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/__init__.py +0 -0
  143. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/api.py +0 -0
  144. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/base.py +0 -0
  145. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/clients.py +0 -0
  146. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/context.py +0 -0
  147. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/core.py +0 -0
  148. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/port_defaults.py +0 -0
  149. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/utils.py +0 -0
  150. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/exceptions/webhook_processor.py +0 -0
  151. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/helpers/__init__.py +0 -0
  152. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/helpers/async_client.py +0 -0
  153. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/helpers/metric/metric.py +0 -0
  154. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/helpers/metric/utils.py +0 -0
  155. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/helpers/stream.py +0 -0
  156. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/log/__init__.py +0 -0
  157. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/log/handlers.py +0 -0
  158. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/log/logger_setup.py +0 -0
  159. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/log/sensetive.py +0 -0
  160. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/middlewares.py +0 -0
  161. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/ocean.py +0 -0
  162. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/py.typed +0 -0
  163. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/run.py +0 -0
  164. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/sonar-project.properties +0 -0
  165. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/__init__.py +0 -0
  166. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/cache/__init__.py +0 -0
  167. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/cache/test_disk_cache.py +0 -0
  168. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/cache/test_memory_cache.py +0 -0
  169. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/clients/__init__.py +0 -0
  170. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/clients/oauth/__init__.py +0 -0
  171. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/clients/oauth/test_oauth_client.py +0 -0
  172. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/clients/port/mixins/test_integrations.py +0 -0
  173. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/clients/port/mixins/test_organization_mixin.py +0 -0
  174. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/config/test_config.py +0 -0
  175. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/conftest.py +0 -0
  176. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/conftest.py +0 -0
  177. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/defaults/test_common.py +0 -0
  178. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/event_listener/test_kafka.py +0 -0
  179. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/entities_state_applier/test_applier.py +0 -0
  180. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +0 -0
  181. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/entity_processor/test_jq_input_evaluator.py +0 -0
  182. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/mixins/test_live_events.py +0 -0
  183. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +0 -0
  184. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/port_app_config/test_api.py +0 -0
  185. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/port_app_config/test_base.py +0 -0
  186. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/queue/test_group_queue.py +0 -0
  187. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/queue/test_local_queue.py +0 -0
  188. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/webhook/test_abstract_webhook_processor.py +0 -0
  189. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/webhook/test_processor_manager.py +0 -0
  190. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/handlers/webhook/test_webhook_event.py +0 -0
  191. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/test_utils.py +0 -0
  192. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
  193. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/utils/test_get_port_diff.py +0 -0
  194. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/core/utils/test_resolve_entities_diff.py +0 -0
  195. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/helpers/__init__.py +0 -0
  196. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/helpers/fake_port_api.py +0 -0
  197. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/helpers/fixtures.py +0 -0
  198. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/helpers/integration.py +0 -0
  199. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/helpers/ocean_app.py +0 -0
  200. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/helpers/port_client.py +0 -0
  201. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/helpers/smoke_test.py +0 -0
  202. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/log/test_handlers.py +0 -0
  203. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/test_metric.py +0 -0
  204. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/test_ocean.py +0 -0
  205. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/test_smoke.py +0 -0
  206. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/utils/test_async_iterators.py +0 -0
  207. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/tests/utils/test_cache.py +0 -0
  208. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/__init__.py +0 -0
  209. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/async_http.py +0 -0
  210. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/async_iterators.py +0 -0
  211. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/cache.py +0 -0
  212. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/ipc.py +0 -0
  213. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/misc.py +0 -0
  214. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/queue_utils.py +0 -0
  215. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/repeat.py +0 -0
  216. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/signal.py +0 -0
  217. {port_ocean-0.28.15 → port_ocean-0.28.17}/port_ocean/utils/time.py +0 -0
  218. {port_ocean-0.28.15 → port_ocean-0.28.17}/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.15
3
+ Version: 0.28.17
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"]]
@@ -359,8 +359,11 @@ class RetryTransport(httpx.AsyncBaseTransport, httpx.BaseTransport):
359
359
  else:
360
360
  # If no Content-Length header, try to get actual content size
361
361
  try:
362
- actual_size = len(await response.aread())
362
+ content = await response.aread()
363
+ actual_size = len(content)
363
364
  size_info = actual_size
365
+ # Restore the cached body so downstream code can still use .json()/.text/.content
366
+ response._content = content # httpx convention
364
367
  except Exception as e:
365
368
  cast(logging.Logger, self._logger).error(
366
369
  f"Error getting response size: {e}"
@@ -383,8 +386,11 @@ class RetryTransport(httpx.AsyncBaseTransport, httpx.BaseTransport):
383
386
  else:
384
387
  # If no Content-Length header, try to get actual content size
385
388
  try:
386
- actual_size = len(response.read())
389
+ content = response.read()
390
+ actual_size = len(content)
387
391
  size_info = actual_size
392
+ # Restore the cached body so downstream code can still use .json()/.text/.content
393
+ response._content = content # httpx convention
388
394
  except Exception as e:
389
395
  cast(logging.Logger, self._logger).error(
390
396
  f"Error getting response size: {e}"
@@ -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"