nlbone 0.7.30__tar.gz → 0.7.32__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 (123) hide show
  1. {nlbone-0.7.30 → nlbone-0.7.32}/PKG-INFO +1 -1
  2. {nlbone-0.7.30 → nlbone-0.7.32}/pyproject.toml +1 -1
  3. nlbone-0.7.32/src/nlbone/adapters/i18n/__init__.py +11 -0
  4. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/i18n/engine.py +10 -3
  5. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/i18n/loaders.py +35 -12
  6. nlbone-0.7.32/src/nlbone/adapters/i18n/locales/fa-IR.json +5 -0
  7. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/config/settings.py +2 -0
  8. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/schemas.py +1 -0
  9. nlbone-0.7.30/src/nlbone/adapters/i18n/__init__.py +0 -7
  10. nlbone-0.7.30/src/nlbone/adapters/i18n/locales/fa-IR.json +0 -17
  11. {nlbone-0.7.30 → nlbone-0.7.32}/.gitignore +0 -0
  12. {nlbone-0.7.30 → nlbone-0.7.32}/LICENSE +0 -0
  13. {nlbone-0.7.30 → nlbone-0.7.32}/README.md +0 -0
  14. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/__init__.py +0 -0
  15. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/__init__.py +0 -0
  16. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/auth/__init__.py +0 -0
  17. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/auth/auth_service.py +0 -0
  18. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/auth/keycloak.py +0 -0
  19. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/auth/token_provider.py +0 -0
  20. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/cache/__init__.py +0 -0
  21. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/cache/async_redis.py +0 -0
  22. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/cache/memory.py +0 -0
  23. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/cache/pubsub_listener.py +0 -0
  24. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/cache/redis.py +0 -0
  25. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/__init__.py +0 -0
  26. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/__init__.py +0 -0
  27. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/audit.py +0 -0
  28. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/base.py +0 -0
  29. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/engine.py +0 -0
  30. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/query_builder.py +0 -0
  31. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/repository.py +0 -0
  32. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/schema.py +0 -0
  33. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/types.py +0 -0
  34. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/postgres/uow.py +0 -0
  35. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/redis/__init__.py +0 -0
  36. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/db/redis/client.py +0 -0
  37. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/http_clients/__init__.py +0 -0
  38. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/http_clients/pricing/__init__.py +0 -0
  39. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/http_clients/pricing/pricing_service.py +0 -0
  40. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/http_clients/uploadchi/__init__.py +0 -0
  41. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/http_clients/uploadchi/uploadchi.py +0 -0
  42. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/http_clients/uploadchi/uploadchi_async.py +0 -0
  43. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/messaging/__init__.py +0 -0
  44. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/messaging/event_bus.py +0 -0
  45. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/messaging/rabbitmq.py +0 -0
  46. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/outbox/__init__.py +0 -0
  47. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/outbox/outbox_consumer.py +0 -0
  48. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/outbox/outbox_repo.py +0 -0
  49. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/percolation/__init__.py +0 -0
  50. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/percolation/connection.py +0 -0
  51. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/repositories/__init__.py +0 -0
  52. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/snowflake.py +0 -0
  53. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/ticketing/__init__.py +0 -0
  54. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/adapters/ticketing/client.py +0 -0
  55. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/config/__init__.py +0 -0
  56. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/config/logging.py +0 -0
  57. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/container.py +0 -0
  58. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/__init__.py +0 -0
  59. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/application/__init__.py +0 -0
  60. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/application/base_worker.py +0 -0
  61. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/application/bus.py +0 -0
  62. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/application/di.py +0 -0
  63. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/application/registry.py +0 -0
  64. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/application/services/__init__.py +0 -0
  65. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/application/use_case.py +0 -0
  66. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/domain/__init__.py +0 -0
  67. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/domain/base.py +0 -0
  68. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/domain/models.py +0 -0
  69. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/__init__.py +0 -0
  70. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/auth.py +0 -0
  71. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/cache.py +0 -0
  72. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/event_bus.py +0 -0
  73. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/files.py +0 -0
  74. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/outbox.py +0 -0
  75. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/repository.py +0 -0
  76. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/translation.py +0 -0
  77. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/core/ports/uow.py +0 -0
  78. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/__init__.py +0 -0
  79. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/__init__.py +0 -0
  80. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/additional_filed/__init__.py +0 -0
  81. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/additional_filed/assembler.py +0 -0
  82. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/additional_filed/default_field_rules/__init__.py +0 -0
  83. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/additional_filed/default_field_rules/image_field_rules.py +0 -0
  84. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/additional_filed/field_registry.py +0 -0
  85. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/additional_filed/resolver.py +0 -0
  86. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/dependencies/__init__.py +0 -0
  87. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/dependencies/async_auth.py +0 -0
  88. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/dependencies/auth.py +0 -0
  89. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/dependencies/client_credential.py +0 -0
  90. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/dependencies/db.py +0 -0
  91. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/dependencies/uow.py +0 -0
  92. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/exception_handlers.py +0 -0
  93. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/exceptions.py +0 -0
  94. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/middleware/__init__.py +0 -0
  95. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/middleware/access_log.py +0 -0
  96. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/middleware/add_request_context.py +0 -0
  97. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/middleware/authentication.py +0 -0
  98. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/pagination/__init__.py +0 -0
  99. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/pagination/offset_base.py +0 -0
  100. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/routers.py +0 -0
  101. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/schema/__init__.py +0 -0
  102. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/schema/adaptive_schema.py +0 -0
  103. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/api/schema/base_response_model.py +0 -0
  104. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/cli/__init__.py +0 -0
  105. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/cli/crypto.py +0 -0
  106. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/cli/init_db.py +0 -0
  107. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/cli/main.py +0 -0
  108. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/cli/ticket.py +0 -0
  109. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/jobs/__init__.py +0 -0
  110. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/jobs/dispatch_outbox.py +0 -0
  111. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/interfaces/jobs/sync_tokens.py +0 -0
  112. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/types.py +0 -0
  113. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/__init__.py +0 -0
  114. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/cache.py +0 -0
  115. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/cache_keys.py +0 -0
  116. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/cache_registry.py +0 -0
  117. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/context.py +0 -0
  118. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/crypto.py +0 -0
  119. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/flatten_sqlalchemy_result.py +0 -0
  120. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/http.py +0 -0
  121. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/normalize_mobile.py +0 -0
  122. {nlbone-0.7.30 → nlbone-0.7.32}/src/nlbone/utils/redactor.py +0 -0
  123. {nlbone-0.7.30 → nlbone-0.7.32}/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.30
3
+ Version: 0.7.32
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.30"
7
+ version = "0.7.32"
8
8
  description = "Backbone package for interfaces and infrastructure in Python projects"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,11 @@
1
+ from pathlib import Path
2
+
3
+ from nlbone.config.settings import get_settings
4
+
5
+ from .engine import I18nAdapter
6
+ from .loaders import JSONFileLoader, CompositeLoader
7
+
8
+ loader = CompositeLoader()
9
+ loader.add_loader(JSONFileLoader(locales_path=Path(__file__).parent.joinpath("./locales").__str__()))
10
+ JSONFileLoader(locales_path=lambda: get_settings().PROJECT_LOCALE_PATH)
11
+ translator = I18nAdapter(loader=loader, default_locale="fa-IR")
@@ -7,12 +7,19 @@ from .loaders import BaseLoader
7
7
 
8
8
 
9
9
  class I18nAdapter(TranslationPort):
10
- def __init__(self, loader: BaseLoader, default_locale: str = "fa"):
10
+ def __init__(self, loader: BaseLoader, default_locale: str = "fa-IR"):
11
11
  self.default_locale = default_locale
12
- self._translations: Dict[str, Dict[str, str]] = loader.load()
12
+ self.loader = loader
13
+ self._translations: Optional[Dict[str, Dict[str, str]]] = None
14
+
15
+ def _ensure_loaded(self):
16
+ if self._translations is None:
17
+ self._translations = self.loader.load()
13
18
 
14
19
  def translate(self, key: str, locale: Optional[str] = None, **kwargs) -> str:
15
- target_locale = locale or get_locale() or self.default_locale
20
+ self._ensure_loaded()
21
+
22
+ target_locale = locale or self.default_locale
16
23
 
17
24
  locale_data = self._translations.get(target_locale, {})
18
25
  text = locale_data.get(key)
@@ -2,7 +2,7 @@ import json
2
2
  import logging
3
3
  from abc import ABC, abstractmethod
4
4
  from pathlib import Path
5
- from typing import Any, Dict
5
+ from typing import Any, Dict, List, Callable, Union
6
6
 
7
7
  logger = logging.getLogger(__name__)
8
8
 
@@ -13,33 +13,38 @@ class BaseLoader(ABC):
13
13
  pass
14
14
 
15
15
 
16
+ from typing import Callable, Union
17
+
18
+
16
19
  class JSONFileLoader(BaseLoader):
17
- def __init__(self, locales_path: str):
18
- self.locales_path = locales_path
20
+ def __init__(self, locales_path: Union[str, Callable[[], str]]):
21
+ self.locales_path_provider = locales_path
19
22
 
20
23
  def load(self) -> Dict[str, Dict[str, str]]:
21
24
  translations: Dict[str, Dict[str, str]] = {}
22
25
 
23
- path_obj = Path(self.locales_path)
26
+ if callable(self.locales_path_provider):
27
+ path_str = self.locales_path_provider()
28
+ else:
29
+ path_str = self.locales_path_provider
30
+
31
+ if not path_str:
32
+ return translations
33
+
34
+ path_obj = Path(path_str)
24
35
 
25
36
  if not path_obj.exists():
26
- logger.warning(f"Locales directory not found at: {self.locales_path}")
27
37
  return translations
28
38
 
29
39
  for file_path in path_obj.glob("*.json"):
30
40
  try:
31
41
  lang_code = file_path.stem
32
-
33
42
  with open(file_path, "r", encoding="utf-8") as f:
34
43
  data = json.load(f)
35
44
 
36
45
  flat_data = self._flatten_dict(data)
37
46
  translations[lang_code] = flat_data
38
47
 
39
- logger.info(f"Loaded locale '{lang_code}' with {len(flat_data)} keys.")
40
-
41
- except json.JSONDecodeError as e:
42
- logger.error(f"Invalid JSON format in {file_path}: {e}")
43
48
  except Exception as e:
44
49
  logger.error(f"Error loading locale {file_path}: {e}")
45
50
 
@@ -49,10 +54,28 @@ class JSONFileLoader(BaseLoader):
49
54
  items = []
50
55
  for k, v in d.items():
51
56
  new_key = f"{parent_key}{sep}{k}" if parent_key else k
52
-
53
57
  if isinstance(v, dict):
54
58
  items.extend(self._flatten_dict(v, new_key, sep=sep).items())
55
59
  else:
56
60
  items.append((new_key, str(v)))
57
-
58
61
  return dict(items)
62
+
63
+
64
+ class CompositeLoader(BaseLoader):
65
+ def __init__(self):
66
+ self.loaders = []
67
+
68
+ def add_loader(self, loader: BaseLoader):
69
+ self.loaders.append(loader)
70
+
71
+ def load(self) -> Dict[str, Dict[str, str]]:
72
+ merged_translations: Dict[str, Dict[str, str]] = {}
73
+
74
+ for loader in self.loaders:
75
+ data = loader.load()
76
+ for lang, keys in data.items():
77
+ if lang not in merged_translations:
78
+ merged_translations[lang] = {}
79
+ merged_translations[lang].update(keys)
80
+
81
+ return merged_translations
@@ -0,0 +1,5 @@
1
+ {
2
+ "auth": {
3
+ "otp_sent": "کد تایید برای {mobile} ارسال شد."
4
+ }
5
+ }
@@ -113,6 +113,8 @@ class Settings(BaseSettings):
113
113
  RABBITMQ_TICKETING_EXCHANGE: str = "crm_stage.ticket"
114
114
  RABBITMQ_TICKETING_ROUTING_KEY_CREATE_V1: str = "crm_stage.ticket.create.v1"
115
115
 
116
+ PROJECT_LOCALE_PATH: str = ""
117
+
116
118
  model_config = SettingsConfigDict(
117
119
  env_prefix="",
118
120
  env_file=None,
@@ -3,3 +3,4 @@ from nlbone.interfaces.api.schema import BaseResponseModel
3
3
 
4
4
  class FileOut(BaseResponseModel):
5
5
  url: str
6
+ id: int | str = None
@@ -1,7 +0,0 @@
1
- from pathlib import Path
2
-
3
- from .engine import I18nAdapter
4
- from .loaders import JSONFileLoader
5
-
6
- translator = I18nAdapter(loader=JSONFileLoader(locales_path=Path(__file__).parent.joinpath("./locales").__str__()),
7
- default_locale="fa")
@@ -1,17 +0,0 @@
1
- {
2
- "general": {
3
- "welcome": "خوش آمدید",
4
- "buttons": {
5
- "save": "ذخیره",
6
- "cancel": "لغو"
7
- }
8
- },
9
- "auth": {
10
- "otp_sent": "کد تایید برای {mobile} ارسال شد."
11
- },
12
- "order": {
13
- "remove": {
14
- "forbidden": "شما مجاز به حذف این سفارش نیستید"
15
- }
16
- }
17
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes