ergon-framework-python 0.2.0__tar.gz → 0.2.1__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 (107) hide show
  1. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/PKG-INFO +1 -1
  2. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/pyproject.toml +1 -1
  3. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/__init__.py +1 -1
  4. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/async_connector.py +6 -0
  5. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/async_service.py +3 -0
  6. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/connector.py +6 -0
  7. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/models.py +8 -0
  8. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/service.py +9 -0
  9. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/utils.py +2 -4
  10. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon_framework_python.egg-info/PKG-INFO +1 -1
  11. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/tests/test_smoke.py +1 -1
  12. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/LICENSE +0 -0
  13. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/README.md +0 -0
  14. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/setup.cfg +0 -0
  15. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/__init__.py +0 -0
  16. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/_observability/docker-compose.telemetry.yml +0 -0
  17. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/_observability/grafana.yaml +0 -0
  18. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/_observability/loki.yaml +0 -0
  19. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/_observability/otel-collector-config.yaml +0 -0
  20. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/_observability/prometheus.yaml +0 -0
  21. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/_observability/tempo.yaml +0 -0
  22. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/connectors/__init__.py +0 -0
  23. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/main.py +0 -0
  24. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/__init__.py +0 -0
  25. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/constants.py +0 -0
  26. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/example_task/__init__.py +0 -0
  27. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/example_task/config.py +0 -0
  28. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/example_task/exceptions.py +0 -0
  29. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/example_task/helpers.py +0 -0
  30. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/example_task/schemas.py +0 -0
  31. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/example_task/task.py +0 -0
  32. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/exceptions.py +0 -0
  33. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/helpers.py +0 -0
  34. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/schemas.py +0 -0
  35. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/bootstrap/src/__project__/tasks/settings.py +0 -0
  36. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/cli.py +0 -0
  37. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/__init__.py +0 -0
  38. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/_lazy.py +0 -0
  39. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/connector.py +0 -0
  40. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/ergon_platform/__init__.py +0 -0
  41. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/ergon_platform/_client.py +0 -0
  42. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/ergon_platform/_operations.py +0 -0
  43. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/ergon_platform/async_connector.py +0 -0
  44. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/ergon_platform/connector.py +0 -0
  45. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/ergon_platform/models.py +0 -0
  46. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/ergon_platform/utils.py +0 -0
  47. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/excel/__init__.py +0 -0
  48. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/excel/connector.py +0 -0
  49. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/excel/models.py +0 -0
  50. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/excel/service.py +0 -0
  51. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/__init__.py +0 -0
  52. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/async_auth_service.py +0 -0
  53. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/nylas/auth_service.py +0 -0
  54. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/pipefy/__init__.py +0 -0
  55. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/pipefy/async_connector.py +0 -0
  56. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/pipefy/async_service.py +0 -0
  57. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/pipefy/connector.py +0 -0
  58. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/pipefy/models.py +0 -0
  59. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/pipefy/service.py +0 -0
  60. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/pipefy/version.py +0 -0
  61. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/postgres/__init__.py +0 -0
  62. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/postgres/async_connector.py +0 -0
  63. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/postgres/async_service.py +0 -0
  64. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/postgres/models.py +0 -0
  65. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/rabbitmq/__init__.py +0 -0
  66. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/rabbitmq/async_connector.py +0 -0
  67. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/rabbitmq/async_service.py +0 -0
  68. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/rabbitmq/connector.py +0 -0
  69. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/rabbitmq/helper.py +0 -0
  70. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/rabbitmq/models.py +0 -0
  71. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/rabbitmq/service.py +0 -0
  72. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/sqs/__init__.py +0 -0
  73. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/sqs/async_connector.py +0 -0
  74. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/sqs/async_service.py +0 -0
  75. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/sqs/connector.py +0 -0
  76. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/sqs/models.py +0 -0
  77. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/sqs/service.py +0 -0
  78. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/connector/transaction.py +0 -0
  79. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/py.typed +0 -0
  80. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/service/__init__.py +0 -0
  81. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/service/service.py +0 -0
  82. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/__init__.py +0 -0
  83. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/base.py +0 -0
  84. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/exceptions.py +0 -0
  85. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/helpers.py +0 -0
  86. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/liveness.py +0 -0
  87. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/manager.py +0 -0
  88. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/mixins/__init__.py +0 -0
  89. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/mixins/consumer.py +0 -0
  90. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/mixins/metrics.py +0 -0
  91. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/mixins/producer.py +0 -0
  92. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/policies.py +0 -0
  93. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/runner.py +0 -0
  94. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/task/utils.py +0 -0
  95. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/telemetry/__init__.py +0 -0
  96. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/telemetry/_resource.py +0 -0
  97. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/telemetry/logging.py +0 -0
  98. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/telemetry/metrics.py +0 -0
  99. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/telemetry/tracing.py +0 -0
  100. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/utils/__init__.py +0 -0
  101. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon/utils/env.py +0 -0
  102. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon_framework_python.egg-info/SOURCES.txt +0 -0
  103. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon_framework_python.egg-info/dependency_links.txt +0 -0
  104. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon_framework_python.egg-info/entry_points.txt +0 -0
  105. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon_framework_python.egg-info/requires.txt +0 -0
  106. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/src/ergon_framework_python.egg-info/top_level.txt +0 -0
  107. {ergon_framework_python-0.2.0 → ergon_framework_python-0.2.1}/tests/test_optional_connectors.py +0 -0
@@ -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,6 +1,6 @@
1
1
  [project]
2
2
  name = "ergon-framework-python"
3
- version = "0.2.0"
3
+ version = "0.2.1"
4
4
  description = "Ergon internal task-oriented project bootstrapper"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -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
@@ -4,4 +4,4 @@ import ergon
4
4
 
5
5
 
6
6
  def test_ergon_package_is_importable() -> None:
7
- assert ergon.__version__ == "0.2.0"
7
+ assert ergon.__version__ == "0.2.1"