nlbone 0.7.20__tar.gz → 0.7.22__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 (115) hide show
  1. {nlbone-0.7.20 → nlbone-0.7.22}/PKG-INFO +1 -1
  2. {nlbone-0.7.20 → nlbone-0.7.22}/pyproject.toml +1 -1
  3. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/auth/token_provider.py +2 -2
  4. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/exceptions.py +8 -0
  5. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/schema/base_response_model.py +7 -0
  6. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/cache.py +55 -47
  7. {nlbone-0.7.20 → nlbone-0.7.22}/.gitignore +0 -0
  8. {nlbone-0.7.20 → nlbone-0.7.22}/LICENSE +0 -0
  9. {nlbone-0.7.20 → nlbone-0.7.22}/README.md +0 -0
  10. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/__init__.py +0 -0
  11. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/__init__.py +0 -0
  12. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/auth/__init__.py +0 -0
  13. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/auth/auth_service.py +0 -0
  14. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/auth/keycloak.py +0 -0
  15. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/cache/__init__.py +0 -0
  16. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/cache/async_redis.py +0 -0
  17. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/cache/memory.py +0 -0
  18. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/cache/pubsub_listener.py +0 -0
  19. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/cache/redis.py +0 -0
  20. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/__init__.py +0 -0
  21. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/__init__.py +0 -0
  22. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/audit.py +0 -0
  23. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/base.py +0 -0
  24. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/engine.py +0 -0
  25. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/query_builder.py +0 -0
  26. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/repository.py +0 -0
  27. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/schema.py +0 -0
  28. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/types.py +0 -0
  29. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/postgres/uow.py +0 -0
  30. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/redis/__init__.py +0 -0
  31. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/db/redis/client.py +0 -0
  32. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/http_clients/__init__.py +0 -0
  33. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/http_clients/pricing/__init__.py +0 -0
  34. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/http_clients/pricing/pricing_service.py +0 -0
  35. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/http_clients/uploadchi/__init__.py +0 -0
  36. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/http_clients/uploadchi/uploadchi.py +0 -0
  37. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/http_clients/uploadchi/uploadchi_async.py +0 -0
  38. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/messaging/__init__.py +0 -0
  39. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/messaging/event_bus.py +0 -0
  40. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/messaging/rabbitmq.py +0 -0
  41. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/outbox/__init__.py +0 -0
  42. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/outbox/outbox_consumer.py +0 -0
  43. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/outbox/outbox_repo.py +0 -0
  44. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/percolation/__init__.py +0 -0
  45. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/percolation/connection.py +0 -0
  46. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/repositories/__init__.py +0 -0
  47. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/snowflake.py +0 -0
  48. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/ticketing/__init__.py +0 -0
  49. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/adapters/ticketing/client.py +0 -0
  50. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/config/__init__.py +0 -0
  51. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/config/logging.py +0 -0
  52. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/config/settings.py +0 -0
  53. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/container.py +0 -0
  54. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/__init__.py +0 -0
  55. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/application/__init__.py +0 -0
  56. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/application/base_worker.py +0 -0
  57. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/application/bus.py +0 -0
  58. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/application/di.py +0 -0
  59. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/application/registry.py +0 -0
  60. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/application/services/__init__.py +0 -0
  61. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/application/use_case.py +0 -0
  62. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/domain/__init__.py +0 -0
  63. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/domain/base.py +0 -0
  64. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/domain/models.py +0 -0
  65. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/ports/__init__.py +0 -0
  66. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/ports/auth.py +0 -0
  67. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/ports/cache.py +0 -0
  68. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/ports/event_bus.py +0 -0
  69. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/ports/files.py +0 -0
  70. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/ports/outbox.py +0 -0
  71. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/ports/repository.py +0 -0
  72. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/core/ports/uow.py +0 -0
  73. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/__init__.py +0 -0
  74. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/__init__.py +0 -0
  75. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/additional_filed/__init__.py +0 -0
  76. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/additional_filed/assembler.py +0 -0
  77. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/additional_filed/default_field_rules/__init__.py +0 -0
  78. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/additional_filed/default_field_rules/image_field_rules.py +0 -0
  79. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/additional_filed/field_registry.py +0 -0
  80. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/additional_filed/resolver.py +0 -0
  81. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/dependencies/__init__.py +0 -0
  82. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/dependencies/async_auth.py +0 -0
  83. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/dependencies/auth.py +0 -0
  84. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/dependencies/client_credential.py +0 -0
  85. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/dependencies/db.py +0 -0
  86. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/dependencies/uow.py +0 -0
  87. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/exception_handlers.py +0 -0
  88. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/middleware/__init__.py +0 -0
  89. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/middleware/access_log.py +0 -0
  90. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/middleware/add_request_context.py +0 -0
  91. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/middleware/authentication.py +0 -0
  92. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/pagination/__init__.py +0 -0
  93. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/pagination/offset_base.py +0 -0
  94. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/routers.py +0 -0
  95. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/schema/__init__.py +0 -0
  96. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/schema/adaptive_schema.py +0 -0
  97. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/api/schemas.py +0 -0
  98. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/cli/__init__.py +0 -0
  99. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/cli/crypto.py +0 -0
  100. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/cli/init_db.py +0 -0
  101. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/cli/main.py +0 -0
  102. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/cli/ticket.py +0 -0
  103. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/jobs/__init__.py +0 -0
  104. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/jobs/dispatch_outbox.py +0 -0
  105. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/interfaces/jobs/sync_tokens.py +0 -0
  106. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/types.py +0 -0
  107. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/__init__.py +0 -0
  108. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/cache_keys.py +0 -0
  109. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/cache_registry.py +0 -0
  110. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/context.py +0 -0
  111. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/crypto.py +0 -0
  112. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/http.py +0 -0
  113. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/normalize_mobile.py +0 -0
  114. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/redactor.py +0 -0
  115. {nlbone-0.7.20 → nlbone-0.7.22}/src/nlbone/utils/time.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nlbone
3
- Version: 0.7.20
3
+ Version: 0.7.22
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.7.20"
7
+ version = "0.7.22"
8
8
  description = "Backbone package for interfaces and infrastructure in Python projects"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -2,13 +2,13 @@ import threading
2
2
  import time
3
3
  from typing import Any, Dict, Optional
4
4
 
5
- from nlbone.adapters.auth.keycloak import KeycloakAuthService
5
+ from nlbone.core.ports.auth import AuthService as BaseAuthService
6
6
 
7
7
 
8
8
  class ClientTokenProvider:
9
9
  """Caches Keycloak client-credentials token and refreshes before expiry."""
10
10
 
11
- def __init__(self, auth: KeycloakAuthService, *, skew_seconds: int = 30) -> None:
11
+ def __init__(self, auth: BaseAuthService, *, skew_seconds: int = 30) -> None:
12
12
  self._auth = auth
13
13
  self._skew = skew_seconds
14
14
  self._lock = threading.Lock()
@@ -86,3 +86,11 @@ class UnprocessableEntityException(BaseHttpException):
86
86
  class LogicalValidationException(UnprocessableEntityException):
87
87
  def __init__(self, detail: str, loc: Iterable[Any] | None = None, type_: str = "logical_error"):
88
88
  super().__init__(detail=detail, loc=loc, type_=type_)
89
+
90
+
91
+ class GoneException(BaseHttpException):
92
+ def __init__(self, detail: str = "Gone"):
93
+ super().__init__(
94
+ status_code=status.HTTP_410_GONE,
95
+ detail=detail,
96
+ )
@@ -1,9 +1,15 @@
1
+ from typing import Any
1
2
  from pydantic import BaseModel, ConfigDict, model_serializer
2
3
 
3
4
  from nlbone.core.domain.base import BaseId
4
5
 
5
6
  EXCLUDE_NONE = "exclude_none"
6
7
 
8
+ def convert_decimal_to_string(v: Any) -> Any:
9
+ """Converts a value to string if it's a large integer (over the safe limit)."""
10
+ if isinstance(v, int) and v > 9007199254740991:
11
+ return str(v)
12
+ return v
7
13
 
8
14
  class BaseResponseModel(BaseModel):
9
15
  model_config = ConfigDict(
@@ -11,6 +17,7 @@ class BaseResponseModel(BaseModel):
11
17
  arbitrary_types_allowed=True,
12
18
  json_encoders={
13
19
  BaseId: lambda v: str(v.value),
20
+ int: convert_decimal_to_string,
14
21
  },
15
22
  )
16
23
 
@@ -1,10 +1,10 @@
1
1
  import asyncio
2
+ import hashlib
2
3
  import inspect
3
4
  import json
4
- from typing import Any, Callable, Iterable, Optional, Mapping
5
- import hashlib
6
- from makefun import wraps as mf_wraps
5
+ from typing import Any, Callable, Iterable, Optional
7
6
 
7
+ from makefun import wraps as mf_wraps
8
8
 
9
9
  from nlbone.utils.cache_registry import get_cache
10
10
 
@@ -61,10 +61,10 @@ def to_jsonable(obj):
61
61
 
62
62
 
63
63
  def _key_from_template(
64
- tpl: Optional[str],
65
- func: Callable,
66
- args,
67
- kwargs,
64
+ tpl: Optional[str],
65
+ func: Callable,
66
+ args,
67
+ kwargs,
68
68
  ) -> str:
69
69
  """Format key template with bound arguments or build a stable default."""
70
70
  bound = _bind(func, args, kwargs)
@@ -84,10 +84,10 @@ def _key_from_template(
84
84
 
85
85
 
86
86
  def _format_tags(
87
- tag_tpls: Optional[Iterable[str]],
88
- func: Callable,
89
- args,
90
- kwargs,
87
+ tag_tpls: Optional[Iterable[str]],
88
+ func: Callable,
89
+ args,
90
+ kwargs,
91
91
  ) -> list[str] | None:
92
92
  if not tag_tpls:
93
93
  return None
@@ -126,21 +126,14 @@ def _run_maybe_async(func: Callable, *args, **kwargs):
126
126
 
127
127
 
128
128
  def cached(
129
- *,
130
- ttl: int,
131
- key: str | None = None,
132
- tags: Iterable[str] | None = None,
133
- serializer: Callable[[Any], bytes] = default_serialize,
134
- deserializer: Callable[[bytes], Any] = default_deserialize,
135
- cache_resolver: Optional[Callable[[], Any]] = None,
129
+ *,
130
+ ttl: int,
131
+ key: str | None = None,
132
+ tags: Iterable[str] | None = None,
133
+ serializer: Callable[[Any], bytes] = default_serialize,
134
+ deserializer: Callable[[bytes], Any] = default_deserialize,
135
+ cache_resolver: Optional[Callable[[], Any]] = None,
136
136
  ):
137
- """
138
- Framework-agnostic caching for SYNC or ASYNC callables.
139
- - Preserves function signature (good for FastAPI/OpenAPI).
140
- - Works with sync/async cache backends (CachePort / AsyncCachePort).
141
- - `key` & `tags` are string templates, e.g. "file:{file_id}".
142
- """
143
-
144
137
  def deco(func: Callable):
145
138
  is_async_func = asyncio.iscoroutinefunction(func)
146
139
 
@@ -154,24 +147,31 @@ def cached(
154
147
  k = _key_from_template(key, func, args, kwargs)
155
148
  tg = _format_tags(tags, func, args, kwargs)
156
149
 
157
- # GET
158
- if _is_async_method(cache, "get"):
159
- cached_bytes = await cache.get(k)
160
- else:
161
- cached_bytes = cache.get(k)
150
+ # SAFE GET
151
+ cached_bytes = None
152
+ try:
153
+ if _is_async_method(cache, "get"):
154
+ cached_bytes = await cache.get(k)
155
+ else:
156
+ cached_bytes = cache.get(k)
157
+ except Exception:
158
+ pass
162
159
 
163
160
  if cached_bytes is not None:
164
161
  return deserializer(cached_bytes)
165
162
 
166
- # MISS -> compute
163
+ # MISS compute
167
164
  result = await func(*args, **kwargs)
168
165
 
169
- # SET
166
+ # SAFE SET
170
167
  data = serializer(result)
171
- if _is_async_method(cache, "set"):
172
- await cache.set(k, data, ttl=ttl, tags=tg)
173
- else:
174
- cache.set(k, data, ttl=ttl, tags=tg)
168
+ try:
169
+ if _is_async_method(cache, "set"):
170
+ await cache.set(k, data, ttl=ttl, tags=tg)
171
+ else:
172
+ cache.set(k, data, ttl=ttl, tags=tg)
173
+ except Exception:
174
+ pass
175
175
 
176
176
  return result
177
177
 
@@ -183,27 +183,35 @@ def cached(
183
183
  cache = (cache_resolver or get_cache)()
184
184
  if not cache:
185
185
  return func(*args, **kwargs)
186
+
186
187
  k = _key_from_template(key, func, args, kwargs)
187
188
  tg = _format_tags(tags, func, args, kwargs)
188
189
 
189
- # GET (may be async)
190
- if _is_async_method(cache, "get"):
191
- cached_bytes = _run_maybe_async(cache.get, k)
192
- else:
193
- cached_bytes = cache.get(k)
190
+ # SAFE GET (maybe async)
191
+ cached_bytes = None
192
+ try:
193
+ if _is_async_method(cache, "get"):
194
+ cached_bytes = _run_maybe_async(cache.get, k)
195
+ else:
196
+ cached_bytes = cache.get(k)
197
+ except Exception:
198
+ pass
194
199
 
195
200
  if cached_bytes is not None:
196
201
  return deserializer(cached_bytes)
197
202
 
198
- # MISS -> compute
203
+ # MISS compute
199
204
  result = func(*args, **kwargs)
200
205
 
201
- # SET (may be async)
206
+ # SAFE SET (maybe async)
202
207
  data = serializer(result)
203
- if _is_async_method(cache, "set"):
204
- _run_maybe_async(cache.set, k, data, ttl=ttl, tags=tg)
205
- else:
206
- cache.set(k, data, ttl=ttl, tags=tg)
208
+ try:
209
+ if _is_async_method(cache, "set"):
210
+ _run_maybe_async(cache.set, k, data, ttl=ttl, tags=tg)
211
+ else:
212
+ cache.set(k, data, ttl=ttl, tags=tg)
213
+ except Exception:
214
+ pass
207
215
 
208
216
  return result
209
217
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes