ergon-framework-python 0.2.0__py3-none-any.whl → 0.2.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.
ergon/__init__.py CHANGED
@@ -10,4 +10,4 @@ __all__ = [
10
10
  "manager",
11
11
  ]
12
12
 
13
- __version__ = "0.2.0"
13
+ __version__ = "0.2.1"
@@ -112,6 +112,12 @@ class AsyncNylasConnector(AsyncConnector):
112
112
  if config is None:
113
113
  return
114
114
 
115
+ if config.delete:
116
+ if transaction.metadata.get("fetch_unit") == "thread":
117
+ raise ValueError("AckActionConfig(delete=True) is only supported for message transactions")
118
+ await self.service.delete_message(transaction.id)
119
+ return
120
+
115
121
  body = build_ack_request_body(config)
116
122
  if not body:
117
123
  return
@@ -116,6 +116,9 @@ class AsyncNylasService:
116
116
  async def update_message(self, message_id: str, request_body: Dict[str, Any]) -> Dict[str, Any]:
117
117
  return await asyncio.to_thread(self._sync.update_message, message_id, request_body)
118
118
 
119
+ async def delete_message(self, message_id: str) -> None:
120
+ await asyncio.to_thread(self._sync.delete_message, message_id)
121
+
119
122
  async def list_folders(self) -> List[Dict[str, Any]]:
120
123
  return await asyncio.to_thread(self._sync.list_folders)
121
124
 
@@ -102,6 +102,12 @@ class NylasConnector(Connector):
102
102
  if config is None:
103
103
  return
104
104
 
105
+ if config.delete:
106
+ if transaction.metadata.get("fetch_unit") == "thread":
107
+ raise ValueError("AckActionConfig(delete=True) is only supported for message transactions")
108
+ self.service.delete_message(transaction.id)
109
+ return
110
+
105
111
  body = build_ack_request_body(config)
106
112
  if not body:
107
113
  return
@@ -82,6 +82,14 @@ class AckActionConfig(BaseModel):
82
82
  move_to_folder_id: Optional[str] = Field(default=None, description="Folder ID to move message to")
83
83
  add_star: bool = Field(default=False, description="Star message on ack")
84
84
  archive: bool = Field(default=False, description="Archive message on ack (provider-specific)")
85
+ delete: bool = Field(
86
+ default=False,
87
+ description=(
88
+ "Permanently delete message on ack via the Nylas hard_delete API. "
89
+ "Requires hard delete to be enabled in the Nylas Dashboard. "
90
+ "When True, other ack actions (mark_as_read, move, star, archive) are skipped."
91
+ ),
92
+ )
85
93
 
86
94
 
87
95
  class NylasAuthClient(BaseModel):
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  from typing import Any, Dict, List, Optional
3
+ from urllib.parse import quote
3
4
 
4
5
  from ..transaction import Transaction
5
6
  from .models import (
@@ -259,6 +260,14 @@ class NylasService:
259
260
  data = extract_response_data(response)
260
261
  return data if isinstance(data, dict) else serialize_nylas_object(data)
261
262
 
263
+ def delete_message(self, message_id: str) -> None:
264
+ # nylas>=6 does not expose DELETE query parameters on messages.destroy().
265
+ self._nylas.http_client._execute(
266
+ method="DELETE",
267
+ path=f"/v3/grants/{self.grant_id}/messages/{quote(message_id, safe='')}",
268
+ query_params={"hard_delete": "true"},
269
+ )
270
+
262
271
  def list_folders(self) -> List[Dict[str, Any]]:
263
272
  response = self._nylas.folders.list(self.grant_id)
264
273
  data = extract_response_data(response) or []
@@ -62,11 +62,9 @@ def merge_query_filter(
62
62
  query_field_names = set(MessageQueryFilter.model_fields.keys())
63
63
  merged: Dict[str, Any] = {}
64
64
  if base is not None:
65
- merged.update(
66
- {k: v for k, v in base.model_dump(exclude_none=True, by_alias=True).items() if k in query_field_names}
67
- )
65
+ merged.update({k: v for k, v in base.model_dump(exclude_none=True).items() if k in query_field_names})
68
66
  if overrides is not None:
69
- merged.update(overrides.model_dump(exclude_none=True, by_alias=True))
67
+ merged.update({k: v for k, v in overrides.model_dump(exclude_none=True).items() if k in query_field_names})
70
68
  for key, value in kwargs.items():
71
69
  if value is not None and key in query_field_names:
72
70
  merged[key] = value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ergon-framework-python
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Ergon internal task-oriented project bootstrapper
5
5
  Author-email: Ergondata Technologies <anza.vossos@protonmail.com>
6
6
  License-Expression: MIT
@@ -1,4 +1,4 @@
1
- ergon/__init__.py,sha256=ebO_7kOv-MSGjDVMRDELKKWgzig6ALBEG56bmQWCzBo,218
1
+ ergon/__init__.py,sha256=OB0tsZ-GmQWa6cIaSGHCsnf6rXE5PtWw1Dz0DQsdPbA,218
2
2
  ergon/cli.py,sha256=CF8PvOjIguR18a657aEBEyhFXUoSVtSRVXv5PfnuWtA,6021
3
3
  ergon/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  ergon/bootstrap/src/__project__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -39,13 +39,13 @@ ergon/connector/excel/models.py,sha256=9RSCaFJAaFTTI0BMZ8S87SWvRqpEsMA50Mw7Gc47_
39
39
  ergon/connector/excel/service.py,sha256=H6T4oJ46espyHXoJRLsZT7gEje5elqYozChsRPI4aXc,3339
40
40
  ergon/connector/nylas/__init__.py,sha256=IGcKSq3b9dynpnQyPULyTZyAbLsLMVBNArKuF3UXc6M,1798
41
41
  ergon/connector/nylas/async_auth_service.py,sha256=sEMvoSCDjRFUSZgmN39L4e5lI2mqh7s_5kmW4nu5mGo,604
42
- ergon/connector/nylas/async_connector.py,sha256=X6mqmKqk_L5RICKwG5pp76HWciMsOGBFlOrXbZFrcyU,4491
43
- ergon/connector/nylas/async_service.py,sha256=mX5UCptdBfxgErQyqP84jyTMpqkHY51QK2GHqNKuj1g,4664
42
+ ergon/connector/nylas/async_connector.py,sha256=VXSPY31iYJYn1KPmmxqwhfKi1OxwHXl94xYpXx9oNbY,4774
43
+ ergon/connector/nylas/async_service.py,sha256=lkxWEAkaMCKD2X7E9ijyuE8CjnR3ITdB1sH3lj1wAFM,4797
44
44
  ergon/connector/nylas/auth_service.py,sha256=f2FguCE5AqqInig1su4Z-rMMoh6zXn9UY7M2eb3aYs0,1835
45
- ergon/connector/nylas/connector.py,sha256=rUcXo_IZmtfHtMlja_bStW695m2lUoxugFKOmmWhKc0,4248
46
- ergon/connector/nylas/models.py,sha256=5Hf4kxC_8b6QFBdHG_YUVfeSfzmfjUFRFpUUdCWXH8Q,9896
47
- ergon/connector/nylas/service.py,sha256=Uxmh36cCerBEUtbfNTY4ITydDAWH64dnXRCxQTp4Ep4,11139
48
- ergon/connector/nylas/utils.py,sha256=J0VyBiAC2lkDRaMyg1nR_Z7gZQEV5yyw22Uz1kWJHl8,4714
45
+ ergon/connector/nylas/connector.py,sha256=4mIRdaQ6YH6j1gt4htAVeXVoKvZMYses6M3d2G6GCAs,4525
46
+ ergon/connector/nylas/models.py,sha256=dqPG5xhM5ZBFKN1hPW0US7lDztSaV-CZwwIherrdDkA,10230
47
+ ergon/connector/nylas/service.py,sha256=kj0zY0cvBWkqlne_gZyw4fFDDiIJ5ACB4PX7vYksE3Q,11525
48
+ ergon/connector/nylas/utils.py,sha256=jP-_hslfSWQgS4Sh5FPOKKLnX-n68m38mkuHOcRVaFk,4715
49
49
  ergon/connector/pipefy/__init__.py,sha256=FI9OfHDa_914NC2s-SMjNYwZj6tpgBve7TER9SE9zo4,1119
50
50
  ergon/connector/pipefy/async_connector.py,sha256=Ls4fRcTD21gWbeSj32WpSID6b5ZYTNBjWN7kNw-9Ey0,1739
51
51
  ergon/connector/pipefy/async_service.py,sha256=Kpd-LVTet3Ve6z85pUWZ2uUWFpgTaF74znbKFzmXAMA,26298
@@ -92,9 +92,9 @@ ergon/telemetry/metrics.py,sha256=0T_CuNw9P5AG1U9k1-bNp1g7McyiNLUIt_zKyLOtrnA,28
92
92
  ergon/telemetry/tracing.py,sha256=_ktiZWAgB1DU-uN91Mzr0iYNXxbCN21LnKiRo5SOJxY,4454
93
93
  ergon/utils/__init__.py,sha256=M0_VCjMN7jvSPlRZLZHeFKTHAl1zu3BnAhjrzJjDfiI,57
94
94
  ergon/utils/env.py,sha256=lji4xENvfHqg2GTGnzG95VKpxxM4f3DHIKKP61xQG08,621
95
- ergon_framework_python-0.2.0.dist-info/licenses/LICENSE,sha256=bWCIhHzaadz_ecLdCdtwyMafeQ17s2d7_FSSuSuEcDs,1079
96
- ergon_framework_python-0.2.0.dist-info/METADATA,sha256=OTKjdM1Hyw1xT2pQAXoDHa6IMlbHtw6ulSmk1pIbaNs,16914
97
- ergon_framework_python-0.2.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
98
- ergon_framework_python-0.2.0.dist-info/entry_points.txt,sha256=reZ934txb5OrtcNBgTGqCsXa1biUDQWubD2a9fGZynE,42
99
- ergon_framework_python-0.2.0.dist-info/top_level.txt,sha256=KSPt6N7RzsjU7PRAalWQ9Cul7YTUxbo84yAJ-y2vLm8,6
100
- ergon_framework_python-0.2.0.dist-info/RECORD,,
95
+ ergon_framework_python-0.2.1.dist-info/licenses/LICENSE,sha256=bWCIhHzaadz_ecLdCdtwyMafeQ17s2d7_FSSuSuEcDs,1079
96
+ ergon_framework_python-0.2.1.dist-info/METADATA,sha256=Xwenx1poSM2NQRTfwm622NA0t0YE7A6pfljS-Z3OcAI,16914
97
+ ergon_framework_python-0.2.1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
98
+ ergon_framework_python-0.2.1.dist-info/entry_points.txt,sha256=reZ934txb5OrtcNBgTGqCsXa1biUDQWubD2a9fGZynE,42
99
+ ergon_framework_python-0.2.1.dist-info/top_level.txt,sha256=KSPt6N7RzsjU7PRAalWQ9Cul7YTUxbo84yAJ-y2vLm8,6
100
+ ergon_framework_python-0.2.1.dist-info/RECORD,,