port-ocean 0.12.0__tar.gz → 0.12.2.dev1__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 (146) hide show
  1. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/PKG-INFO +1 -1
  2. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/base.py +11 -2
  3. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +24 -13
  4. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/log/handlers.py +8 -7
  5. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/ocean.py +12 -11
  6. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +36 -1
  7. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/pyproject.toml +1 -1
  8. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/LICENSE.md +0 -0
  9. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/README.md +0 -0
  10. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/__init__.py +0 -0
  11. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/bootstrap.py +0 -0
  12. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/__init__.py +0 -0
  13. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cli.py +0 -0
  14. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/__init__.py +0 -0
  15. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/defaults/__init___.py +0 -0
  16. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/defaults/clean.py +0 -0
  17. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/defaults/dock.py +0 -0
  18. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/defaults/group.py +0 -0
  19. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/list_integrations.py +0 -0
  20. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/main.py +0 -0
  21. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/new.py +0 -0
  22. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/pull.py +0 -0
  23. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/sail.py +0 -0
  24. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/commands/version.py +0 -0
  25. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/__init__.py +0 -0
  26. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
  27. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/extensions.py +0 -0
  28. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
  29. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.dockerignore +0 -0
  30. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
  31. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
  32. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
  33. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
  34. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
  35. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
  36. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
  37. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
  38. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Dockerfile +0 -0
  39. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
  40. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
  41. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
  42. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
  43. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
  44. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
  45. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
  46. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
  47. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
  48. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/cli/utils.py +0 -0
  49. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/__init__.py +0 -0
  50. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/__init__.py +0 -0
  51. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/authentication.py +0 -0
  52. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/client.py +0 -0
  53. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/__init__.py +0 -0
  54. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/blueprints.py +0 -0
  55. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/entities.py +0 -0
  56. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/integrations.py +0 -0
  57. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/mixins/migrations.py +0 -0
  58. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/retry_transport.py +0 -0
  59. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/types.py +0 -0
  60. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/clients/port/utils.py +0 -0
  61. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/config/__init__.py +0 -0
  62. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/config/base.py +0 -0
  63. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/config/dynamic.py +0 -0
  64. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/config/settings.py +0 -0
  65. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/consumers/__init__.py +0 -0
  66. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/consumers/kafka_consumer.py +0 -0
  67. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/context/__init__.py +0 -0
  68. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/context/event.py +0 -0
  69. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/context/ocean.py +0 -0
  70. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/context/resource.py +0 -0
  71. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/__init__.py +0 -0
  72. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/defaults/__init__.py +0 -0
  73. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/defaults/clean.py +0 -0
  74. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/defaults/common.py +0 -0
  75. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/defaults/initialize.py +0 -0
  76. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/__init__.py +0 -0
  77. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/factory.py +0 -0
  78. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/http.py +0 -0
  79. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/kafka.py +0 -0
  80. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/once.py +0 -0
  81. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/event_listener/polling.py +0 -0
  82. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/__init__.py +0 -0
  83. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/base.py +0 -0
  84. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
  85. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
  86. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
  87. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
  88. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
  89. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
  90. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
  91. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/entity_processor/base.py +0 -0
  92. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
  93. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/api.py +0 -0
  94. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/base.py +0 -0
  95. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/port_app_config/models.py +0 -0
  96. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
  97. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
  98. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/__init__.py +0 -0
  99. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/base.py +0 -0
  100. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/__init__.py +0 -0
  101. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/events.py +0 -0
  102. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/handler.py +0 -0
  103. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/sync.py +0 -0
  104. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/sync_raw.py +0 -0
  105. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/integrations/mixins/utils.py +0 -0
  106. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/models.py +0 -0
  107. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/ocean_types.py +0 -0
  108. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/core/utils.py +0 -0
  109. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/__init__.py +0 -0
  110. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/api.py +0 -0
  111. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/base.py +0 -0
  112. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/clients.py +0 -0
  113. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/context.py +0 -0
  114. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/core.py +0 -0
  115. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/port_defaults.py +0 -0
  116. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/exceptions/utils.py +0 -0
  117. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/helpers/__init__.py +0 -0
  118. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/helpers/async_client.py +0 -0
  119. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/helpers/retry.py +0 -0
  120. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/log/__init__.py +0 -0
  121. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/log/logger_setup.py +0 -0
  122. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/log/sensetive.py +0 -0
  123. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/middlewares.py +0 -0
  124. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/py.typed +0 -0
  125. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/run.py +0 -0
  126. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/sonar-project.properties +0 -0
  127. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/__init__.py +0 -0
  128. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
  129. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/conftest.py +0 -0
  130. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/__init__.py +0 -0
  131. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/fixtures.py +0 -0
  132. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/integration.py +0 -0
  133. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/ocean_app.py +0 -0
  134. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/port_client.py +0 -0
  135. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/helpers/smoke_test.py +0 -0
  136. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/tests/test_smoke.py +0 -0
  137. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/__init__.py +0 -0
  138. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/async_http.py +0 -0
  139. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/async_iterators.py +0 -0
  140. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/cache.py +0 -0
  141. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/misc.py +0 -0
  142. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/queue_utils.py +0 -0
  143. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/repeat.py +0 -0
  144. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/signal.py +0 -0
  145. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/utils/time.py +0 -0
  146. {port_ocean-0.12.0 → port_ocean-0.12.2.dev1}/port_ocean/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.12.0
3
+ Version: 0.12.2.dev1
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,12 +1,14 @@
1
+ import asyncio
1
2
  from abc import abstractmethod
3
+ from concurrent.futures import ThreadPoolExecutor
2
4
  from typing import TypedDict, Callable, Any, Awaitable
3
5
 
4
6
  from pydantic import Extra
5
7
 
6
8
  from port_ocean.config.base import BaseOceanModel
7
- from port_ocean.utils.signal import signal_handler
8
9
  from port_ocean.context.ocean import ocean
9
10
  from port_ocean.utils.misc import IntegrationStateStatus
11
+ from port_ocean.utils.signal import signal_handler
10
12
 
11
13
 
12
14
  class EventListenerEvents(TypedDict):
@@ -67,7 +69,14 @@ class BaseEventListener:
67
69
  """
68
70
  await self._before_resync()
69
71
  try:
70
- await self.events["on_resync"](resync_args)
72
+ loop = asyncio.get_event_loop()
73
+ with ThreadPoolExecutor() as executor:
74
+ e = executor.submit(
75
+ lambda: asyncio.run_coroutine_threadsafe(
76
+ self.events["on_resync"](resync_args), loop
77
+ )
78
+ )
79
+ signal_handler.register(e.cancel)
71
80
  await self._after_resync()
72
81
  except Exception as e:
73
82
  await self._on_resync_failure(e)
@@ -47,37 +47,48 @@ class JQEntityProcessor(BaseEntityProcessor):
47
47
  pattern = "def env: {}; {} as $ENV | " + pattern
48
48
  return jq.compile(pattern)
49
49
 
50
+ @staticmethod
51
+ def _stop_iterator_handler(func: Any) -> Any:
52
+ """
53
+ Wrap the function to handle StopIteration exceptions.
54
+ Prevents StopIteration from stopping the thread and skipping further queue processing.
55
+ """
56
+
57
+ def inner() -> Any:
58
+ try:
59
+ return func()
60
+ except StopIteration:
61
+ return None
62
+
63
+ return inner
64
+
50
65
  async def _search(self, data: dict[str, Any], pattern: str) -> Any:
51
66
  try:
52
67
  loop = asyncio.get_event_loop()
53
68
  compiled_pattern = self._compile(pattern)
54
69
  func = compiled_pattern.input_value(data)
55
- return await loop.run_in_executor(None, func.first)
70
+ return await loop.run_in_executor(
71
+ None, self._stop_iterator_handler(func.first)
72
+ )
56
73
  except Exception as exc:
57
74
  logger.debug(
58
- f"Failed to search for pattern {pattern} in data {data}, {exc}"
75
+ f"Search failed for pattern '{pattern}' in data: {data}, Error: {exc}"
59
76
  )
60
77
  return None
61
78
 
62
79
  async def _search_as_bool(self, data: dict[str, Any], pattern: str) -> bool:
63
80
  loop = asyncio.get_event_loop()
64
- start_time = loop.time()
81
+
65
82
  compiled_pattern = self._compile(pattern)
66
83
  func = compiled_pattern.input_value(data)
67
- compile_time = loop.time() - start_time
68
- value = await loop.run_in_executor(None, func.first)
69
- execute_time = loop.time() - start_time - compile_time
70
- logger.debug(
71
- f"Search for pattern {execute_time:.2f} seconds, compile time {compile_time:.2f} seconds",
72
- pattern=pattern,
73
- compile_time=compile_time,
74
- execute_time=execute_time,
84
+
85
+ value = await loop.run_in_executor(
86
+ None, self._stop_iterator_handler(func.first)
75
87
  )
76
88
  if isinstance(value, bool):
77
89
  return value
78
-
79
90
  raise EntityProcessorException(
80
- f"Expected boolean value, got {type(value)} instead"
91
+ f"Expected boolean value, got value:{value} of type: {type(value)} instead"
81
92
  )
82
93
 
83
94
  async def _search_as_object(
@@ -1,8 +1,8 @@
1
1
  import asyncio
2
2
  import logging
3
3
  import sys
4
- import threading
5
4
  import time
5
+ from concurrent.futures import ThreadPoolExecutor
6
6
  from datetime import datetime
7
7
  from logging.handlers import MemoryHandler
8
8
  from typing import Any
@@ -65,18 +65,19 @@ class HTTPMemoryHandler(MemoryHandler):
65
65
  if self.ocean is None or not self.buffer:
66
66
  return
67
67
 
68
- def _wrap_event_loop(_ocean: Ocean, logs_to_send: list[dict[str, Any]]) -> None:
69
- loop = asyncio.new_event_loop()
70
- loop.run_until_complete(self.send_logs(_ocean, logs_to_send))
71
- loop.close()
72
-
73
68
  self.acquire()
74
69
  logs = list(self._serialized_buffer)
75
70
  if logs:
76
71
  self.buffer.clear()
77
72
  self._serialized_buffer.clear()
78
73
  self.last_flush_time = time.time()
79
- threading.Thread(target=_wrap_event_loop, args=(self.ocean, logs)).start()
74
+ loop = asyncio.new_event_loop()
75
+ with ThreadPoolExecutor() as executor:
76
+ executor.submit(
77
+ lambda: asyncio.run_coroutine_threadsafe(
78
+ self.send_logs(self.ocean, logs), loop
79
+ )
80
+ )
80
81
  self.release()
81
82
 
82
83
  async def send_logs(
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
  import sys
3
- import threading
3
+ from concurrent.futures import ThreadPoolExecutor
4
4
  from contextlib import asynccontextmanager
5
5
  from typing import Callable, Any, Dict, AsyncIterator, Type
6
6
 
@@ -9,8 +9,6 @@ from loguru import logger
9
9
  from pydantic import BaseModel
10
10
  from starlette.types import Scope, Receive, Send
11
11
 
12
- from port_ocean.core.handlers.resync_state_updater import ResyncStateUpdater
13
- from port_ocean.core.models import Runtime
14
12
  from port_ocean.clients.port.client import PortClient
15
13
  from port_ocean.config.settings import (
16
14
  IntegrationConfiguration,
@@ -20,13 +18,15 @@ from port_ocean.context.ocean import (
20
18
  ocean,
21
19
  initialize_port_ocean_context,
22
20
  )
21
+ from port_ocean.core.handlers.resync_state_updater import ResyncStateUpdater
23
22
  from port_ocean.core.integrations.base import BaseIntegration
23
+ from port_ocean.core.models import Runtime
24
24
  from port_ocean.log.sensetive import sensitive_log_filter
25
25
  from port_ocean.middlewares import request_handler
26
+ from port_ocean.utils.misc import IntegrationStateStatus
26
27
  from port_ocean.utils.repeat import repeat_every
27
28
  from port_ocean.utils.signal import signal_handler
28
29
  from port_ocean.version import __integration_version__
29
- from port_ocean.utils.misc import IntegrationStateStatus
30
30
 
31
31
 
32
32
  class Ocean:
@@ -92,6 +92,13 @@ class Ocean:
92
92
  )
93
93
  raise e
94
94
 
95
+ def pool_executor_wrapper(event_loop) -> None:
96
+ with ThreadPoolExecutor() as executor:
97
+ e = executor.submit(lambda: asyncio.run_coroutine_threadsafe(
98
+ execute_resync_all(), event_loop
99
+ ))
100
+ signal_handler.register(e.cancel)
101
+
95
102
  interval = self.config.scheduled_resync_interval
96
103
  loop = asyncio.get_event_loop()
97
104
  if interval is not None:
@@ -103,13 +110,7 @@ class Ocean:
103
110
  seconds=interval * 60,
104
111
  # Not running the resync immediately because the event listener should run resync on startup
105
112
  wait_first=True,
106
- )(
107
- lambda: threading.Thread(
108
- target=lambda: asyncio.run_coroutine_threadsafe(
109
- execute_resync_all(), loop
110
- )
111
- ).start()
112
- )
113
+ )(lambda _: pool_executor_wrapper(loop))
113
114
  await repeated_function()
114
115
 
115
116
  async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
@@ -195,10 +195,45 @@ class TestJQEntityProcessor:
195
195
  pattern = ".foo"
196
196
  with pytest.raises(
197
197
  EntityProcessorException,
198
- match="Expected boolean value, got <class 'str'> instead",
198
+ match="Expected boolean value, got value:bar of type: <class 'str'> instead",
199
199
  ):
200
200
  await mocked_processor._search_as_bool(data, pattern)
201
201
 
202
+ @pytest.mark.parametrize(
203
+ "pattern, expected",
204
+ [
205
+ ('.parameters[] | select(.name == "not_exists") | .value', None),
206
+ (
207
+ '.parameters[] | select(.name == "parameter_name") | .value',
208
+ "parameter_value",
209
+ ),
210
+ (
211
+ '.parameters[] | select(.name == "another_parameter") | .value',
212
+ "another_value",
213
+ ),
214
+ ],
215
+ )
216
+ async def test_search_fails_on_stop_iteration(
217
+ self, mocked_processor: JQEntityProcessor, pattern: str, expected: Any
218
+ ) -> None:
219
+ data = {
220
+ "parameters": [
221
+ {"name": "parameter_name", "value": "parameter_value"},
222
+ {"name": "another_parameter", "value": "another_value"},
223
+ {"name": "another_parameter", "value": "another_value2"},
224
+ ]
225
+ }
226
+ result = await mocked_processor._search(data, pattern)
227
+ assert result == expected
228
+
229
+ async def test_return_a_list_of_values(
230
+ self, mocked_processor: JQEntityProcessor
231
+ ) -> None:
232
+ data = {"parameters": ["parameter_value", "another_value", "another_value2"]}
233
+ pattern = ".parameters"
234
+ result = await mocked_processor._search(data, pattern)
235
+ assert result == ["parameter_value", "another_value", "another_value2"]
236
+
202
237
  @pytest.mark.timeout(3)
203
238
  async def test_search_performance_10000(
204
239
  self, mocked_processor: JQEntityProcessor
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "port-ocean"
3
- version = "0.12.0"
3
+ version = "0.12.2-dev01"
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