nlbone 0.6.18__tar.gz → 0.6.19__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 (105) hide show
  1. {nlbone-0.6.18 → nlbone-0.6.19}/PKG-INFO +1 -1
  2. {nlbone-0.6.18 → nlbone-0.6.19}/pyproject.toml +1 -1
  3. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/postgres/audit.py +10 -3
  4. nlbone-0.6.19/src/nlbone/adapters/repositories/outbox_repo.py +20 -0
  5. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/config/settings.py +2 -0
  6. nlbone-0.6.19/src/nlbone/core/application/command_bus.py +25 -0
  7. nlbone-0.6.19/src/nlbone/interfaces/jobs/dispatch_outbox.py +19 -0
  8. nlbone-0.6.19/src/nlbone/utils/__init__.py +0 -0
  9. nlbone-0.6.18/src/nlbone/interfaces/jobs/dispatch_outbox.py +0 -7
  10. {nlbone-0.6.18 → nlbone-0.6.19}/.gitignore +0 -0
  11. {nlbone-0.6.18 → nlbone-0.6.19}/LICENSE +0 -0
  12. {nlbone-0.6.18 → nlbone-0.6.19}/README.md +0 -0
  13. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/__init__.py +0 -0
  14. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/__init__.py +0 -0
  15. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/auth/__init__.py +0 -0
  16. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/auth/keycloak.py +0 -0
  17. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/auth/token_provider.py +0 -0
  18. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/cache/__init__.py +0 -0
  19. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/cache/async_redis.py +0 -0
  20. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/cache/memory.py +0 -0
  21. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/cache/pubsub_listener.py +0 -0
  22. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/cache/redis.py +0 -0
  23. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/__init__.py +0 -0
  24. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/postgres/__init__.py +0 -0
  25. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/postgres/base.py +0 -0
  26. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/postgres/engine.py +0 -0
  27. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/postgres/query_builder.py +0 -0
  28. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/postgres/repository.py +0 -0
  29. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/postgres/schema.py +0 -0
  30. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/postgres/uow.py +0 -0
  31. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/redis/__init__.py +0 -0
  32. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/db/redis/client.py +0 -0
  33. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/http_clients/__init__.py +0 -0
  34. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/http_clients/pricing/__init__.py +0 -0
  35. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/http_clients/pricing/pricing_service.py +0 -0
  36. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/http_clients/uploadchi/__init__.py +0 -0
  37. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/http_clients/uploadchi/uploadchi.py +0 -0
  38. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/http_clients/uploadchi/uploadchi_async.py +0 -0
  39. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/messaging/__init__.py +0 -0
  40. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/messaging/event_bus.py +0 -0
  41. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/messaging/redis.py +0 -0
  42. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/percolation/__init__.py +0 -0
  43. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/adapters/percolation/connection.py +0 -0
  44. {nlbone-0.6.18/src/nlbone/config → nlbone-0.6.19/src/nlbone/adapters/repositories}/__init__.py +0 -0
  45. {nlbone-0.6.18/src/nlbone/core → nlbone-0.6.19/src/nlbone/config}/__init__.py +0 -0
  46. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/config/logging.py +0 -0
  47. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/container.py +0 -0
  48. {nlbone-0.6.18/src/nlbone/core/application → nlbone-0.6.19/src/nlbone/core}/__init__.py +0 -0
  49. {nlbone-0.6.18/src/nlbone/core/application/services → nlbone-0.6.19/src/nlbone/core/application}/__init__.py +0 -0
  50. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/application/base_worker.py +0 -0
  51. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/application/events.py +0 -0
  52. {nlbone-0.6.18/src/nlbone/core/domain → nlbone-0.6.19/src/nlbone/core/application/services}/__init__.py +0 -0
  53. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/application/services.py +0 -0
  54. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/application/use_case.py +0 -0
  55. {nlbone-0.6.18/src/nlbone/interfaces → nlbone-0.6.19/src/nlbone/core/domain}/__init__.py +0 -0
  56. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/domain/base.py +0 -0
  57. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/domain/events.py +0 -0
  58. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/domain/models.py +0 -0
  59. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/ports/__init__.py +0 -0
  60. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/ports/auth.py +0 -0
  61. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/ports/cache.py +0 -0
  62. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/ports/event_bus.py +0 -0
  63. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/ports/files.py +0 -0
  64. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/ports/messaging.py +0 -0
  65. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/ports/repo.py +0 -0
  66. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/core/ports/uow.py +0 -0
  67. {nlbone-0.6.18/src/nlbone/interfaces/api → nlbone-0.6.19/src/nlbone/interfaces}/__init__.py +0 -0
  68. {nlbone-0.6.18/src/nlbone/interfaces/cli → nlbone-0.6.19/src/nlbone/interfaces/api}/__init__.py +0 -0
  69. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/additional_filed/__init__.py +0 -0
  70. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/additional_filed/assembler.py +0 -0
  71. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/additional_filed/default_field_rules/__init__.py +0 -0
  72. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/additional_filed/default_field_rules/image_field_rules.py +0 -0
  73. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/additional_filed/field_registry.py +0 -0
  74. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/additional_filed/resolver.py +0 -0
  75. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/dependencies/__init__.py +0 -0
  76. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/dependencies/async_auth.py +0 -0
  77. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/dependencies/auth.py +0 -0
  78. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/dependencies/db.py +0 -0
  79. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/dependencies/uow.py +0 -0
  80. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/exception_handlers.py +0 -0
  81. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/exceptions.py +0 -0
  82. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/middleware/__init__.py +0 -0
  83. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/middleware/access_log.py +0 -0
  84. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/middleware/add_request_context.py +0 -0
  85. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/middleware/authentication.py +0 -0
  86. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/pagination/__init__.py +0 -0
  87. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/pagination/offset_base.py +0 -0
  88. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/routers.py +0 -0
  89. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/schema/__init__.py +0 -0
  90. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/schema/adaptive_schema.py +0 -0
  91. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/schema/base_response_model.py +0 -0
  92. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/api/schemas.py +0 -0
  93. {nlbone-0.6.18/src/nlbone/interfaces/jobs → nlbone-0.6.19/src/nlbone/interfaces/cli}/__init__.py +0 -0
  94. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/cli/init_db.py +0 -0
  95. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/cli/main.py +0 -0
  96. {nlbone-0.6.18/src/nlbone/utils → nlbone-0.6.19/src/nlbone/interfaces/jobs}/__init__.py +0 -0
  97. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/interfaces/jobs/sync_tokens.py +0 -0
  98. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/types.py +0 -0
  99. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/utils/cache.py +0 -0
  100. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/utils/cache_keys.py +0 -0
  101. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/utils/cache_registry.py +0 -0
  102. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/utils/context.py +0 -0
  103. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/utils/http.py +0 -0
  104. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/utils/redactor.py +0 -0
  105. {nlbone-0.6.18 → nlbone-0.6.19}/src/nlbone/utils/time.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nlbone
3
- Version: 0.6.18
3
+ Version: 0.6.19
4
4
  Summary: Backbone package for interfaces and infrastructure in Python projects
5
5
  Author-email: Amir Hosein Kahkbazzadeh <a.khakbazzadeh@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nlbone"
7
- version = "0.6.18"
7
+ version = "0.6.19"
8
8
  description = "Backbone package for interfaces and infrastructure in Python projects"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -8,11 +8,13 @@ from sqlalchemy import event
8
8
  from sqlalchemy import inspect as sa_inspect
9
9
  from sqlalchemy.orm import Session as SASession
10
10
 
11
+ from nlbone.config.settings import get_settings
11
12
  from nlbone.core.domain.models import AuditLog
12
13
  from nlbone.utils.context import current_context_dict
13
14
 
15
+ setting = get_settings()
14
16
  DEFAULT_EXCLUDE = {"updated_at", "created_at"}
15
- DEFAULT_ENABLED = False
17
+ DEFAULT_ENABLED = setting.AUDIT_DEFAULT_ENABLE
16
18
  DEFAULT_OPS = {"INSERT", "UPDATE", "DELETE"}
17
19
 
18
20
 
@@ -24,12 +26,17 @@ def _get_ops_for(obj) -> set[str]:
24
26
 
25
27
 
26
28
  def _is_audit_disabled(obj) -> bool:
27
- if not DEFAULT_ENABLED:
28
- return True
29
29
  if getattr(obj, "__audit_disable__", False):
30
30
  return True
31
+
32
+ if not DEFAULT_ENABLED:
33
+ if hasattr(obj, "__audit_enable__") and getattr(obj, "__audit_enable__"):
34
+ return False
35
+ return True
36
+
31
37
  if hasattr(obj, "__audit_enable__") and not getattr(obj, "__audit_enable__"):
32
38
  return True
39
+
33
40
  return False
34
41
 
35
42
 
@@ -0,0 +1,20 @@
1
+ from typing import List
2
+
3
+ class OutboxRecord(dict):
4
+ pass
5
+
6
+ class OutboxRepository:
7
+ def __init__(self, engine):
8
+ self._engine = engine
9
+
10
+ def add(self, msg) -> None:
11
+ ...
12
+
13
+ def fetch_pending(self, limit: int = 100) -> List[OutboxRecord]:
14
+ ...
15
+
16
+ def mark_sent(self, msg_id: int) -> None:
17
+ ...
18
+
19
+ def schedule_retry(self, msg_id: int, retries: int, backoff_base: int = 2) -> None:
20
+ ...
@@ -43,6 +43,8 @@ class Settings(BaseSettings):
43
43
  LOG_LEVEL: Literal["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"] = Field(default="INFO")
44
44
  LOG_JSON: bool = Field(default=True)
45
45
 
46
+ AUDIT_DEFAULT_ENABLE: bool = False
47
+
46
48
  # ---------------------------
47
49
  # HTTP / Timeouts
48
50
  # ---------------------------
@@ -0,0 +1,25 @@
1
+ from dataclasses import dataclass
2
+ from typing import Protocol, Type, Any, Dict
3
+
4
+
5
+ @dataclass(frozen=True)
6
+ class Command:
7
+ pass
8
+
9
+
10
+ class CommandHandler(Protocol):
11
+ def __call__(self, command: Command) -> Any: ...
12
+
13
+
14
+ class CommandBus:
15
+ def __init__(self) -> None:
16
+ self._handlers: Dict[Type[Command], CommandHandler] = {}
17
+
18
+ def register(self, cmd_type: Type[Command], handler: CommandHandler) -> None:
19
+ self._handlers[cmd_type] = handler
20
+
21
+ def dispatch(self, command: Command) -> Any:
22
+ handler = self._handlers.get(type(command))
23
+ if handler is None:
24
+ raise LookupError(f"No handler registered for {type(command).__name__}")
25
+ return handler(command)
@@ -0,0 +1,19 @@
1
+ from nlbone.adapters.messaging.internal_router import internal_router
2
+ from nlbone.core.ports.event_bus import IntegrationPublisher
3
+
4
+ def run_dispatch_outbox(outbox_repo, publisher: IntegrationPublisher):
5
+ batch = outbox_repo.fetch_pending(limit=200)
6
+ for rec in batch:
7
+ try:
8
+ topic = rec["topic"]
9
+ payload = rec["payload"]
10
+ if topic.startswith("internal."):
11
+ internal_router.handle(topic, payload)
12
+ else:
13
+ publisher.publish(topic, payload)
14
+ outbox_repo.mark_sent(rec["id"])
15
+ except TemporaryError:
16
+ outbox_repo.schedule_retry(rec["id"], rec["retries"])
17
+ except Exception:
18
+ # mark_failed یا retry policy
19
+ outbox_repo.schedule_retry(rec["id"], rec["retries"])
File without changes
@@ -1,7 +0,0 @@
1
- import time
2
- from nlbone.adapters.messaging.event_bus import OutboxDispatcher
3
-
4
- def main(dispatcher: OutboxDispatcher, interval_sec: int = 2):
5
- while True:
6
- count = dispatcher.run_once()
7
- time.sleep(interval_sec)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes