port-ocean 0.12.0__py3-none-any.whl → 0.12.1__py3-none-any.whl

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.

@@ -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(
@@ -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
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.12.0
3
+ Version: 0.12.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
@@ -81,7 +81,7 @@ port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py,sha
81
81
  port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py,sha256=82BvU8t5w9uhsxX8hbnwuRPuWhW3cMeuT_5sVIkip1I,1550
82
82
  port_ocean/core/handlers/entity_processor/__init__.py,sha256=FvFCunFg44wNQoqlybem9MthOs7p1Wawac87uSXz9U8,156
83
83
  port_ocean/core/handlers/entity_processor/base.py,sha256=udR0w5TstTOS5xOfTjAZIEdldn4xr6Oyb3DylatYX3Q,1869
84
- port_ocean/core/handlers/entity_processor/jq_entity_processor.py,sha256=HQ3lnOqNITHxSn0_9TXZFaQYfMZvvPaJwnsvlNKGDKQ,8703
84
+ port_ocean/core/handlers/entity_processor/jq_entity_processor.py,sha256=EHxU5PxvGxKJn5gKRO01bMR9PmXM6NC_NZ1L2xqlQsI,8868
85
85
  port_ocean/core/handlers/port_app_config/__init__.py,sha256=8AAT5OthiVM7KCcM34iEgEeXtn2pRMrT4Dze5r1Ixbk,134
86
86
  port_ocean/core/handlers/port_app_config/api.py,sha256=6VbKPwFzsWG0IYsVD81hxSmfqtHUFqrfUuj1DBX5g4w,853
87
87
  port_ocean/core/handlers/port_app_config/base.py,sha256=4Nxt2g8voEIHJ4Y1Km5NJcaG2iSbCklw5P8-Kus7Y9k,3007
@@ -122,7 +122,7 @@ port_ocean/sonar-project.properties,sha256=X_wLzDOkEVmpGLRMb2fg9Rb0DxWwUFSvESId8
122
122
  port_ocean/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
123
  port_ocean/tests/clients/port/mixins/test_entities.py,sha256=A9myrnkLhKSQrnOLv1Zz2wiOVSxW65Q9RIUIRbn_V7w,1586
124
124
  port_ocean/tests/conftest.py,sha256=JXASSS0IY0nnR6bxBflhzxS25kf4iNaABmThyZ0mZt8,101
125
- port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py,sha256=fqhlLTFkP0SS12bqViYWgqayNGXWZhqpDSJObHVRnNg,9472
125
+ port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py,sha256=Yv03P-LDcJCKZ21exiTFrcT1eu0zn6Z954dilxrb52Y,10842
126
126
  port_ocean/tests/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
127
  port_ocean/tests/helpers/fixtures.py,sha256=blc4ZgPEkKOmmwT6GVxceS9r1ERUwSdOIBGxWFwvRyY,1398
128
128
  port_ocean/tests/helpers/integration.py,sha256=_RxS-RHpu11lrbhUXYPZp862HLWx8AoD7iZM6iXN8rs,1104
@@ -140,8 +140,8 @@ port_ocean/utils/repeat.py,sha256=0EFWM9d8lLXAhZmAyczY20LAnijw6UbIECf5lpGbOas,32
140
140
  port_ocean/utils/signal.py,sha256=K-6kKFQTltcmKDhtyZAcn0IMa3sUpOHGOAUdWKgx0_E,1369
141
141
  port_ocean/utils/time.py,sha256=pufAOH5ZQI7gXvOvJoQXZXZJV-Dqktoj9Qp9eiRwmJ4,1939
142
142
  port_ocean/version.py,sha256=UsuJdvdQlazzKGD3Hd5-U7N69STh8Dq9ggJzQFnu9fU,177
143
- port_ocean-0.12.0.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
144
- port_ocean-0.12.0.dist-info/METADATA,sha256=PrJZo5rBOy6h2_slD1tjSHcTdHCc-PgyIsk9DNqk0pY,6614
145
- port_ocean-0.12.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
146
- port_ocean-0.12.0.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
147
- port_ocean-0.12.0.dist-info/RECORD,,
143
+ port_ocean-0.12.1.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
144
+ port_ocean-0.12.1.dist-info/METADATA,sha256=HbzZAIo77FdVcf7OABIERqjeMGNUXWLAs1oMV7qWl30,6614
145
+ port_ocean-0.12.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
146
+ port_ocean-0.12.1.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
147
+ port_ocean-0.12.1.dist-info/RECORD,,